
私の名前は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-onlypg_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_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, , . _.* _ , _. |
これらはの通常のルールですrow_constructor。UPDATEこのように使うのは珍しいことです。実際には、そのようなケースは見たことがありませんが、そのような構文は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 ^@ textSP-GiST ( )
LIKE '%'btree, .
プレフィックスによる検索は非常に一般的です。このため、特別なインデックスをサポートする特別な演算子が追加されました。そして最も興味深いのは、公式文書にはこのオペレーターについての言葉が書かれていないことです。代わりに、関数
starts_withが言及されています-この演算子が基づいている内部関数ですが、その使用はインデックスを使用した加速を提供しません。
式=をIS NOT NULL同等の式に縮小する(Tom Lane)
これにより、選択性スコアが向上します。
奇妙なことに、私たちは実際にそのような設計に出会いました。どうやら、そのようなケースは珍しいことではありません。
PostgreSQL 11.0-> 12.0
btree ( , )
/ , , . .
,pg_upgrade.
別の議論は賛成ではありません
pg_upgrade。
結論
このチェックリストは、公式のPostgreSQLリソースからの抜粋です。実際には、開発アプローチに応じて、特定の互換性の重要性が異なる場合があります。この記事が誰かをデータ損失から救うか、PostgreSQLを更新するための人件費を削減してくれると嬉しいです。
PS
Oleg Samoilovに感謝します(splarv)記事の準備に役立ちます。