PostgreSQLバージョンの更新、または更新時にデータベースを削除しない方法は?

PostgreSQLアップグレードチームのメモ(チェックリスト)を共有することにしました。その中で、PostgreSQLの公式ドキュメントのリリースで提示された機能を基礎として、互換性の問題について分析を行い、更新された機能に誰が注意を払う必要があるかを分析しました。





私の名前はAlexanderKotsyurubaです。DomClick.ruで内部サービスの開発を管理しています。



記事は見出し付きの部分に分かれています。各見出しは、PostgreSQLをあるバージョンから別のバージョンにアップグレードすることを示しています。各章では、次の点を強調しています。



  • 特徴
  • 潜在的な非互換性が伴うリスク

    • アプリケーションの中断
    • パフォーマンスの低下
  • 更新時に誰を探すか

    • システム管理者
    • 開発者
  • コメント


それでは、始めましょう。



更新方法



  • pg_upgradePostreSQLを更新するための最も信頼できる方法ではありません。たとえば、以前のPostgreSQLバージョンからREINDEXを実行すると、エラーが発生する場合があります。
  • 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 . . , , , , .


「トランザクションを開いて休暇をとった」ためにデータベースが「肥大化」する問題を解決します。数時間かかるラッシュアップデート。selectマスターとスレーブの両方で長いこれは2つのオプションのうちの1つであり、そのおかげで、マスターからスレーブへの長い要求をオーバーロードできない問題を解決することが可能になります。



PostgreSQL 9.6-> 10.0



特徴 危険 誰に注意を払うべきか コメント
pg_upgrade以前のメジャーバージョンのPostgreSQLからアップグレードした後、ハッシュインデックスを再構築する必要があります(Mithun Sai、Robert Haas、Amit Kapila)



この要件は、ハッシュインデックスの大幅な改善によるものです。インデックスの再作成のタスクを容易にpg_upgradeするために、ヘルパースクリプトを作成します。
アプリケーションの中断 システム管理者 反対の別の議論 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, , . _.* _ , _.
これらはの通常のルールですrow_constructorUPDATEこのように使うのは珍しいことです実際には、そのようなケースは見たことがありませんが、そのような構文はPostgreSQL8.2のドキュメントに記載されています。バージョン10では、この構文は他のバージョンのPostgreSQLで使用されている標準に組み込まれたようです。どんなに奇妙に見えても、そのようなコードを挿入することは可能です。


興味深い機能



公開/サブスクライブスキームによる論理レプリケーション


最小限のダウンタイムでアップグレードするために使用できる便利な機能。



宣言型テーブルパーティショニング


新しい宣言構文により、テーブルのパーティション分割が簡素化されます。



クエリの並列化の改善


当初、9.6では大規模なクエリの並列実行のサポートが導入されました。ただし、スキャン、結合、および集計のみが関係していました。



次に、10.0では、並列実行の可能性が現れました。



  • Bツリーインデックススキャン
  • ビットマップスキャン
  • マージ結合
  • 相関のないサブクエリ


SCRAM-SHA-256を使用したより強力なパスワード保護


一部の非標準(非libpq)PostgreSQL接続ライブラリと互換性がない可能性があります。



PostgreSQL 10.0-> 11.0



特徴 危険 誰に注意を払うべきか コメント
の相対パスを持つ式の正しい処理xmltable()xpath()およびXMLで機能するその他の関数(Markus Winand)



SQL標準によれば、相対パスは、これらの関数が行っていたように、ルートノードからではなくXMLドキュメントノードから考慮する必要があります。
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, .


プレフィックスによる検索は非常に一般的です。このため、特別なインデックスをサポートする特別な演算子が追加されました。そして最も興味深いのは、公式文書にはこのオペレーターについての言葉が書かれていないことです。代わりに、関数starts_with言及されています-この演算子が基づいている内部関数ですが、その使用はインデックスを使用した加速を提供しません。



= IS NOT NULL同等の縮小する(Tom Lane)



これにより、選択性スコアが向上します。


奇妙なことに、私たちは実際にそのような設計に出会いました。どうやら、そのようなケースは珍しいことではありません。



PostgreSQL 11.0-> 12.0



特徴 危険 誰に注意を払うべきか コメント
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.


別の議論は賛成ではありませんpg_upgrade



結論



このチェックリストは、公式のPostgreSQLリソースからの抜粋です。実際には、開発アプローチに応じて、特定の互換性の重要性が異なる場合があります。この記事が誰かをデータ損失から救うか、PostgreSQLを更新するための人件費を削減してくれると嬉しいです。



PS



Oleg Samoilovに感謝します(splarv)記事の準備に役立ちます。



All Articles