Je m'appelle Alexander Kotsyuruba, je gère le développement des services internes chez DomClick.ru.
L'article est divisé en parties avec des titres. Chaque titre fait référence à la mise à niveau de PostgreSQL d'une version à une autre. Dans chaque chapitre, nous avons mis en évidence:
- Fonctionnalité
- Incompatibilité potentielle de risque
- Interruption de l'application
- Baisse des performances
- Qui rechercher lors de la mise à jour
- Administrateur du système
- Développeur
- Commentaire
Alors, commençons.
Mettre à jour les méthodes
pg_upgrade
Ce n'est pas le moyen le plus fiable de mettre à jour PostreSQL. Par exemple, vous pourriez obtenir une erreur lors de l'exécution de REINDEX à partir d'une version précédente de PostgreSQL.logical replication
— , downtime . , logical replication 10. pglogical ( 2ndquadrant), 9.4 12. , PostgreSQL<10.0, .pg_dumpall
— . — downtime.pg_dumpall --globals-only
pg_dump --create
. , , , PostgreSQL.
PostgreSQL 9.5 -> 9.6
to_char() ( )
, to_char('-4 years'::interval, 'YY') -04 , -4 . |
- to_char() , . |
||
extract() ( )
extract() «», . infinity -infinity , (, year, epoch), NULL (, day, hour). . |
extract() c , . |
||
pg_stat_activity , ( , )
, . pg_stat_activity . . waiting wait_event_type wait_event . |
- . . | ||
, email host ( )
, , tsvector , . |
, , . PostgreSQL . pg_dump , . .. pg_upgrade . |
||
CREATEUSER/NOCREATEUSER CREATE ROLE ( )
CREATEUSER SUPERUSER . , ( ), CREATEROLE . , , . |
, 9.6. | ||
, pg_ , ( )
. , initdb . |
|||
psql -c --no-psqlrc ( , )
--no-psqlrc ( -X ). psql. |
psql. | ||
pg_restore -t, , ( ) | |||
NextXID pg_controldata ( , )
--ID- : . / LSN, . |
|||
, , ( )
, . , ( pg_upgrade ), ALTER EXTENSION UPDATE ( ). |
pg_upgrade extension. pg_upgrade |
MVCC ( )
, , . , , , .old_snapshot_threshold
, MVCC . . , , , , .
Résout le problème de «gonfler» la base de données en raison de «l'ouverture d'une transaction et de partir en vacances»; mises à jour irréfléchies qui prennent des heures; long
select
sur maître et esclave. C'est l'une des deux options, grâce auxquelles il sera possible de résoudre le problème, en raison de laquelle ils ne peuvent pas surcharger de longues requêtes du maître à l'esclave.
PostgreSQL 9.6 -> 10.0
Fonctionnalité | Risque | À qui prêter attention | Commentaire |
---|---|---|---|
Après la mise à niveau depuis pg_upgrade n'importe quelle version majeure précédente de PostgreSQL, les index de hachage doivent être reconstruits (Mithun Sai, Robert Haas, Amit Kapila).
Cette exigence est due à des améliorations significatives du mécanisme des index de hachage. Pour faciliter la tâche de réindexation, il pg_upgrade créera un script d'aide. |
Interruption de l'application | Administrateur du système | Un autre argument contre pg_upgrade |
pg_xlog pg_wal , pg_clog pg_xact ( )
— , , , . . |
|||
SQL, «xlog» «wal» ( )
, pg_switch_xlog() pg_switch_wal() , pg_receivexlog — pg_receivewal , --xlogdir — --waldir . pg_xlog ; «xlog» . |
|||
WAL location lsn ( )
. |
|||
pg_basebackup WAL, ( )
pg_basebackup -X/--wal-method stream . none . pg_basebackup -x ( -X fetch ). |
|||
pg_hba.conf ( )
replication . , , all . - replication . , . |
|||
pg_ctl ( )
pg_ctl -w . |
|||
log_directory pg_log log ( ) |
|||
ssl_dh_params_file OpenSSL DH ( )
dh1024.pem. , dh1024.pem ; , DH. |
|||
DH, DH- OpenSSL, 2048 ( )
DH 1024 2048 , DH . SSL, Java Runtime Environment 6, DH 1024 , , SSL. , DH 1024 . |
|||
( )
password_encryption off plain . UNENCRYPTED CREATE/ALTER USER ... PASSWORD . --unencrypted createuser . , , . password_encryption md5 . |
|||
min_parallel_table_scan_size min_parallel_index_scan_size ( , )
min_parallel_relation_size , . |
«» . | ||
shared_preload_libraries ( )
, SQL- . |
|||
sql_inheritance ( )
, , . SQL , , PostgreSQL 7.1. |
|||
/ ( )
configure --disable-integer-datetimes . , PostgreSQL 8.3. |
: rpm, deb, etc. | ||
- 1.0 ( )
PostgreSQL 6.3. |
|||
contrib/tsearch2 ( )
, PostgreSQL 8.3. |
|||
createlang droplang ( )
PostgreSQL 9.1. CREATE EXTENSION DROP EXTENSION . |
|||
, , SELECT ( )
, , SELECT , , LATERAL FROM . , . , NULL . , , , . , , , CASE COALESCE . |
set-returning function (.. , ) FROM . , - SELECT . - , . . |
||
UPDATE ... SET (_) = _ ( )
_ ROW ; . _ , _ ROW , , . _.* _ , _ . |
Ce sont les règles habituelles pour row_constructor . Il est inhabituel de l'utiliser de UPDATE cette manière. En pratique, je n'ai pas vu de tels cas, bien qu'une telle syntaxe soit apparue dans la documentation de PostgreSQL 8.2. Dans la version 10, il semble que cette syntaxe ait été amenée à un standard qui est utilisé dans d'autres versions de PostgreSQL. Aussi étrange que cela puisse paraître, il est possible d'insérer un tel morceau de code. |
Caractéristiques intéressantes
Publier / Souscrire la réplication logique
Une fonctionnalité utile qui peut être utilisée pour mettre à niveau avec un temps d'arrêt minimal.
Partitionnement déclaratif des tables
La nouvelle syntaxe déclarative simplifie le partitionnement des tables.
Amélioration de la parallélisation des requêtes
Au départ, la version 9.6 a introduit la prise en charge de l'exécution parallèle de requêtes volumineuses. Mais cela ne concernait que les scans, les jointures et les agrégations.
Dans 10.0, à son tour, la possibilité d'une exécution parallèle est apparue:
- Balayage d'index B-Tree
- Analyse Bitmap
- Fusionner les jointures
- Sous-requêtes non corrélées
Protection renforcée par mot de passe avec SCRAM-SHA-256
Peut être incompatible avec certaines bibliothèques de connexion PostgreSQL non standard (non-libpq).
PostgreSQL 10.0 -> 11.0
Fonctionnalité | Risque | À qui prêter attention | Commentaire |
---|---|---|---|
La manipulation correcte des expressions avec des chemins relatifs dans xmltable() , xpath() et d' autres fonctions que le travail avec XML (Markus Winand)
Selon la norme SQL, les chemins relatifs doit être considéré à partir du nœud de document XML, et non à partir du nœud racine, comme ces fonctions oeuvraient . |
SQL. , XML. , . | ||
pg_dump , ( )
, GRANT/REVOKE ALTER DATABASE SET , pg_dumpall . pg_dump --create pg_restore --create . pg_dumpall -g , . pg_dumpall ( -g ) .
pg_dump pg_restore --create / ; .
pg_dumpall , , , . CREATE DATABASE , .
pg_dumpall --clean postgres template1, , . |
. , .. . . , pg_dump/pg_restore --create . , , . |
||
( , )
, . |
|||
adminpack pg_file_read() , pg_file_length() pg_logfile_rotate() ( )
. adminpack , ALTER EXTENSION ... UPDATE . |
|||
replacement_sort_tuples ( )
, . |
text ^@ text
SP-GiST ( )
LIKE '%'
btree, .
La recherche par préfixe est assez courante. Pour cela, nous avons ajouté un opérateur spécial prenant en charge les index spéciaux. Et ce qui est le plus intéressant, la documentation officielle ne dit pas un mot sur cet opérateur. Au lieu de cela, une fonction
starts_with
est mentionnée - une fonction interne sur laquelle cet opérateur est basé, mais son utilisation ne fournit pas d'accélération à l'aide d'un index.
Réduire une expression=
à une expressionIS NOT NULL
où elles sont équivalentes (Tom Lane)
Cela améliore le score de sélectivité.
Curieusement, nous avons rencontré une telle conception dans la pratique. Apparemment, de tels cas ne sont pas rares.
PostgreSQL 11.0 -> 12.0
btree ( , )
/ , , . .
,pg_upgrade
.
Un autre argument n'est pas en faveur
pg_upgrade
.
Conclusion
Cette liste de contrôle est notre extrait des ressources officielles de PostgreSQL. En pratique, selon les approches de développement, la criticité d'une certaine compatibilité pour vous peut être différente. Je serais ravi que l'article sauve quelqu'un de la perte de données ou réduise les coûts de main-d'œuvre de la mise à jour de PostgreSQL.
PS
Merci à Oleg Samoilov (Splarv) pour vous aider à préparer l'article.