私の名前はAlexanderKotsyurubaです。DomClick.ruで内部サービスの開発を管理しています。
記事は見出し付きの部分に分かれています。各見出しは、PostgreSQLをあるバージョンから別のバージョンにアップグレードすることを示しています。各章では、次の点を強調しています。
- 特徴
- 潜在的な非互換性が伴うリスク
- アプリケーションの中断
- パフォーマンスの低下
- 更新時に誰を探すか
- システム管理者
- 開発者
- コメント
それでは、始めましょう。
更新方法
pg_upgrade
PostreSQLを更新するための最も信頼できる方法ではありません。たとえば、以前の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_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 ^@ text
SP-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)記事の準備に役立ちます。