Mein Name ist Alexander Kotsyuruba, ich leite die Entwicklung der internen Dienste bei DomClick.ru.
Der Artikel ist in Teile mit Überschriften unterteilt. Jede Überschrift bezieht sich auf das Upgrade von PostgreSQL von einer Version auf eine andere. In jedem Kapitel haben wir Folgendes hervorgehoben:
- Merkmal
- Risikopotential Inkompatibilität
- Anwendungsstörung
- Leistungsabfall
- Wen Sie beim Aktualisieren suchen sollten
- Systemadministrator
- Entwickler
- Kommentar
Also fangen wir an.
Methoden aktualisieren
pg_upgrade
Ist nicht der zuverlässigste Weg, um PostreSQL zu aktualisieren. Beispielsweise kann bei REINDEX aus einer früheren PostgreSQL-Version eine Fehlermeldung angezeigt werden.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 . . , , , , .
Behebt das Problem des "Aufblähens" der Datenbank aufgrund von "Öffnen einer Transaktion und Urlaub". vorschnelle Updates, die Stunden dauern; lange
select
auf Master und Slave. Dies ist eine von zwei Optionen, mit denen das Problem gelöst werden kann, wodurch lange Anforderungen vom Master zum Slave nicht erneut geladen werden können.
PostgreSQL 9.6 -> 10.0
Merkmal | Risiko | Auf wen soll man achten? | Kommentar |
---|---|---|---|
Nach dem Upgrade von pg_upgrade einer früheren Hauptversion von PostgreSQL müssen die Hash-Indizes neu erstellt werden (Mithun Sai, Robert Haas, Amit Kapila).
Diese Anforderung ist auf erhebliche Verbesserungen des Mechanismus für Hash-Indizes zurückzuführen. Um die Neuindizierung zu vereinfachen, pg_upgrade wird ein Hilfsskript erstellt. |
Anwendungsstörung | Systemadministrator | Ein weiteres Argument dagegen 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 , , . _.* _ , _ . |
Dies sind die üblichen Regeln für row_constructor . Es ist nur ungewöhnlich, es auf UPDATE diese Weise zu verwenden. In der Praxis habe ich solche Fälle nicht gesehen, obwohl eine solche Syntax in der Dokumentation in PostgreSQL 8.2 enthalten war. In Version 10 wurde diese Syntax anscheinend auf einen Standard gebracht, der in anderen Versionen von PostgreSQL verwendet wird. Egal wie seltsam es auch erscheinen mag, es ist möglich, einen solchen Code einzufügen. |
Interessante Features
Logische Replikation durch Publish / Subscribe-Schema
Eine nützliche Funktion, mit der ein Upgrade mit minimalen Ausfallzeiten durchgeführt werden kann.
Deklarative Tabellenpartitionierung
Neue deklarative Syntax vereinfacht die Tabellenpartitionierung.
Verbessern der Abfrageparallelisierung
In 9.6 wurde zunächst die Unterstützung für die parallele Ausführung großer Abfragen eingeführt. Es handelte sich jedoch nur um Scans, Verknüpfungen und Aggregationen.
In 10.0 erschien wiederum die Möglichkeit einer parallelen Ausführung:
- B-Tree-Index-Scan
- Bitmap-Scan
- Zusammenführungen verbinden
- Nicht korrelierte Unterabfragen
Stärkerer Passwortschutz mit SCRAM-SHA-256
Möglicherweise nicht kompatibel mit einigen nicht standardmäßigen (nicht libpq) PostgreSQL-Verbindungsbibliotheken.
PostgreSQL 10.0 -> 11.0
Merkmal | Risiko | Auf wen soll man achten? | Kommentar |
---|---|---|---|
Die richtige Umgang mit Ausdrücke mit relativen Pfaden in xmltable() , xpath() und anderen Funktionen , die die Arbeit mit XML (Markus Winand)
Nach dem SQL - Standard sollten relative Pfade aus den XML - Dokument Knoten betrachtet werden, und nicht von dem Wurzelknoten, da diese Funktionen zu tun. |
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, .
Die Suche nach Präfix ist weit verbreitet. Zu diesem Zweck haben wir einen speziellen Operator hinzugefügt, der spezielle Indizes unterstützt. Und was am interessantesten ist, die offizielle Dokumentation sagt kein Wort über diesen Operator. Stattdessen wird eine Funktion erwähnt
starts_with
- eine interne Funktion, auf der dieser Operator basiert, deren Verwendung jedoch keine Beschleunigung mithilfe eines Index liefert.
Reduzieren eines Ausdrucks=
auf einen Ausdruck,IS NOT NULL
bei dem sie äquivalent sind (Tom Lane)
Dies verbessert den Selektivitätswert.
Seltsamerweise haben wir ein solches Design in der Praxis getroffen. Anscheinend sind solche Fälle nicht ungewöhnlich.
PostgreSQL 11.0 -> 12.0
btree ( , )
/ , , . .
,pg_upgrade
.
Ein anderes Argument ist nicht dafür
pg_upgrade
.
Fazit
Diese Checkliste ist unser Auszug aus den offiziellen PostgreSQL-Ressourcen. In der Praxis kann je nach Entwicklungsansatz die Kritikalität bestimmter Kompatibilität für Sie unterschiedlich sein. Ich würde mich freuen, wenn der Artikel jemanden vor Datenverlust bewahrt oder die Arbeitskosten für die Aktualisierung von PostgreSQL senkt.
PS
Danke an Oleg Samoilov (splarv) für Hilfe bei der Vorbereitung des Artikels.