PostgreSQL-Versionsaktualisierung oder Wie kann die Datenbank beim Aktualisieren nicht gelöscht werden?

Wir haben beschlossen, ein Memo (Checkliste) unseres PostgreSQL-Upgrade-Teams zu teilen. Darin haben wir die in der Veröffentlichung der offiziellen PostgreSQL- Dokumentation vorgestellten Funktionen zugrunde gelegt , eine Analyse auf Kompatibilitätsprobleme durchgeführt und festgestellt, wer auf die aktualisierten Funktionen achten sollte.





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_upgradeIst 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 selectauf 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_upgradeeiner 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_upgradewird 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_receivexlogpg_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 UPDATEdiese 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 NULLbei 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



Merkmal Risiko Auf wen soll man achten? Kommentar
substring(), SQL, , «» ( )



, , , ; , %#"aa*#"% , a.
, , SQL. - substring() , , . , .
recovery.conf postgresql.conf ( , , -, )



recovery.conf , , . recovery.signal standby.signal. trigger_file promote_trigger_file, standby_mode .
recovery_target* ( )



, recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time recovery_target_xid. , . , , .
( )



recovery_target_timeline latest. current.
pg_verify_checksums pg_checksums ( )
pg_restore -f — ( )



, , .
\pset format psql ( )



, , \pset format a aligned; asciidoc, .
\pset psql. , , psql \pset.
btree 8 ( )



REINDEX , pg_upgrade, .
. , . , . pg_upgrade.
( )



, dynamic_shared_memory_type none.
(CTE), . , , , , . 12- CTE . , , , . , .



, pg_stat_statments . , template1.




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.



All Articles