Postgres 先行書き込みログ (WAL) は、データベースの機能要素です。 WAL は、考慮に入れることができる多くの重要な機能を作成します。
試合からの回復、ストリーミングレプリケーション など。 場合によっては、データベースの奥深くにいる人が、WAL ファイルを直接操作して診断するか、より安全に 保護する必要があります。 Crunchy Records の可能性を秘めた会社の 1 つと一緒に仕事をするのはそれほど昔ではありませんでしたが、名前とシーケンス番号を理解することが以前は非常に重要であった場所で偶然に偶然見つけました。 Postgres チャレンジに取り組んでいる何人かの同僚と協力する中で、私は WAL 内のいくつかの重要な点について黙秘しました。 この日の目的は、LSN と WAL の命名規則を調べて、ユーザー チケットの WAL ファイルを待つことです。 ログ シーケンス番号
PostgreSQL のトランザクションは、WAL ログ (ファイル) に追加された slay にある WAL レコードを保持します。 挿入が発生するブループリントは、ログ シーケンス番号 (LSN) によって識別されます。 LSN の値 (pg_lsn
の形式) は、比較して決定することもできます。 2 つの多数のオフセット間で生成された WAL の量 (バイト単位)。 この形式で実行する場合、大量の WAL ログが穏やかである場合、肉厚の WAL セグメント (16MB) が以前は穏やかであると仮定して計算されることを知ることは非常に深刻です。 ここでの穏やかな計算は、ほとんどの場合、レプリカのレイテンシーを得るために穏やかです.
LSN は 64 ビットの整数で、 write-forward ログ ドラッグのブループリント。 この 64 ビット整数は、2 つのセグメント (上位 32 ビットと下位 32 ビット) に分割されます。 これは、reduce で区切られた 2 つの 16 進数 (XXXXXXXX/YYZZZZZZ) として印刷されたマイルです。 「X」は LSN の上位 32 ビットを表し、「Y」は減少する 32 ビット ピースの上位 8 ビットを表します。 「Z」は、ファイル内のオフセット ブループリントを表します。 すべての要素は 16 進数の量です。 ‘X’ と ‘Y’ の値は、既定の PostgreSQL デプロイの WAL ファイルの 2 番目のセクションで緩やかです
WALファイル
WALファイル名はTTTTTTTTXXXXXXXXYYYYYYYYの構造になっています。 ここで、「T」はタイムライン、「X」は LSN の上位 32 ビット、「Y」は LSN の下位 32 ビットです。
新しい WAL LSN と挿入 LSN。
pg_current_wal_lsn は、クロージング書き込みの代入です。 pg_current_wal_insert_lsn は論理的な苦境であり、存在しないバッファ内のファイルを表示します。ディスクに書き込まれなくなりました。 永続ストレージに何が書き込まれたかを示すフラッシュ値があります。
# 解決する pg_current_wal_lsn(), pg_current_wal_insert_lsn(); pg_current_wal_lsn | pg_current_wal_insert_lsn ——————+—————————————– 76 /7D000000 | 76/7D000028 (1行) 上記の出力に応じて WAL ファイルの名前を賭けることができる場合でも、 pg_walfile_name 目的。
# 解決する pg_walfile_name('76/7D000028'); pg_walfile_name -------------------------- 00000001000000760000007D (1行) ファイル デバイスを見ると、実際にセグメント 00000001000000760000007D が最も好まれている変更済みファイルであることがわかります。 データベースが遅延している場合、00000001000000760000007D がおそらく最も古いファイルである可能性があることを表示します (O/S の終了変更日付に応じて)。 考慮できる動機は、PostgreSQL が古い WAL セグメントを再利用した結果です。 pg_wal_switch の長さについては、古いファイルの名前が変更されていました。 変更された O/S の日付/時刻は、ファイルが書き込まれるときに最も簡単に交換されます。 ls の図で -i を実行すると、ファイルの inode (最初の列) が表示されます。 ファイルが再利用されると、ファイルの名前が適切に変更されるため、この量はスワップされなくなります。
# 解決する pg_walfile_name('76/7D000028'); pg_walfile_name -------------------------- 00000001000000760000007D (1行) ファイル デバイスを見ると、実際にセグメント 00000001000000760000007D が最も好まれている変更済みファイルであることがわかります。 データベースが遅延している場合、00000001000000760000007D がおそらく最も古いファイルである可能性があることを表示します (O/S の終了変更日付に応じて)。 考慮できる動機は、PostgreSQL が古い WAL セグメントを再利用した結果です。 pg_wal_switch の長さについては、古いファイルの名前が変更されていました。 変更された O/S の日付/時刻は、ファイルが書き込まれるときに最も簡単に交換されます。 ls の図で -i を実行すると、ファイルの inode (最初の列) が表示されます。 ファイルが再利用されると、ファイルの名前が適切に変更されるため、この量はスワップされなくなります。
ちっぽけなテーブルを我慢して、WALスイッチを発信しましょう.
# bear テーブル (a char(1)) を見てみましょう。 テーブルの作成時間: 23.770 ミリ秒 # 解決する pg_switch_wal(); pg_switch_wal ————– 76/7D018FD8 (1行) 
すべてのファイルを再試行すると、00000001000000760000007D ファイルがこれまでにアップしていることがわかります (O/S の観点から変更された日付/時刻)。 バックグラウンドで発生する他のすべてのモデルでは、次のセグメント 00000001000000760000007E も pg_switch_wal の後にいくつかの書き込みを受け取りました.
新しく作成したテーブル内に、伝記。 データベースが平和的であることを確認し、スワップの前後に新しい WAL LSN をぶら下げます。 1 バイト (‘a’) を 1 列の 1 つのテーブルに入れていることを表示します
# 解決する pg_current_wal_lsn(), pg_current_wal_insert_lsn(); pg_current_wal_lsn | pg_current_wal_insert_lsn ——————+—————————————– 76 /7E000060 | 76/7E000060 (1行) # insert into (a) 値 (‘a’); 挿入 0 1 # 解決する pg_current_wal_lsn(), pg_current_wal_insert_lsn(); pg_current_wal_lsn | pg_current_wal_insert_lsn ——————+—————————————– 76 /7E000108 | 76/7E000108 (1行)
成功した 2 つの LSN 位置の演習により、INSERT
によって生成された WAL の量を計算できます。 (この場合は 168 バイト).
# 解決 ’76/7E000108′::pg_lsn – ’76/7E000060′::pg_lsn size_bytes; size_bytes ———— 168 (1行)
新しい WAL LSN と WAL 挿入 LSN のコツをつかみ、もう 1 つのスイッチを開始します。 次に、ファイルをリストします。
# 解決する pg_switch_wal(); pg_switch_wal --------------- 76/7E0001D0 (1 行) $ ls -larti 00169034323 -rw ---------- 作業員の 1 bpace 体格 376 Jan 30 09: 13 0000000100000075000000A0. 00000060.Backup 167120673 -RW ------- 1 BPACE WORKERS 16777216 FEB 13 16:000000000000000080 167120686 -RW ------- 1 BPACE WHORSIQUIQUIQUE OF WORKERS 16777216 16: ------- 1 bpace の労働者の体格 16777216 Feb 13 16: 24 000000010000007600000082 169564733 -rw ------- 1 bpace の労働者の体格 16777216 Feb 13 16: 26 00000001000000760000076--7E - 労働者の 1 bpace 体格 16777216 Feb 13 16: 26 00000001000000760000007F前の手順で取得したガイドラインを使用して、pg_waldump
を実行します。 WAL セグメントの内容の人間が読める要約を作成します。 次の図では、開始ブループリント (-s) と終了ブループリント (-e) が WAL ファイル名 (00000001000000760000007E) と共に指定されています。 元の設計図は、以前はcurrent_wal_lsn
でしたINSERT
とエンディングの設計図は以前はcurrent_wal_lsn 挿入後。 古い、適切な LSN の実行により、トランザクションから WAL に 168 バイトが書き込まれたことは間違いありません。 waldump を見ると、INSERT が 103 バイト (57 INSERT の場合、 の場合は 46 専念)。sh-4.4$ pg_waldump -s 76/7E000060 -e 76/7E000108 00000001000000760000007E rmgr: ヒープlen (rec/tot): 57/ 57, tx: 59555584, lsn: 76/7E000060, prev 76/7E000028, desc: INSERT+INIT off 1 flags 0x08, blkref #0: rel 1663/5/53434 blk 0 rmgr:トランザクション len (rec/tot): 46/ 46、tx: 59555584、lsn: 76/7E0000A0、prev 76/7E000060、desc: COMMIT 2023-02-13 16: 25: 19.441483 EST rmgr: Standby len (rec/tot) : 50/ 50、tx: 0、lsn: 76/7E0000D0、前の 76/7E0000A0、desc: RUNNING_XACTS nextXid 59555585 latestCompletedXid 59555584 olderRunningXid 59555585目的から WAL ファイル全体を見てみましょう
INSERT、INSERT
自体を表示してから、COMMIT を表示することもできます。 最後に、チェックポイントがログに記録され、pg_wal_switch() からの切り替えが記録されます。行われていた。 RUNNING_XACTS エントリは、 の場合に追加されます。 wal_level はレプリカまたは昇格に生きています。 RUNNING_XACTS エントリのブループリントは、新しいスナップショット (アクティブなトランザクション) の小さなプリントを閉じます. 最後のエントリ SWITCH は pg_switch_wal を行っていた.
sh-4.4$ pg_waldump 00000001000000760000007E rmgr: スタンバイ len (rec/tot ): 50/ 50、tx: 0、lsn: 76/7E000028、前の 76/7D018FC0、desc: RUNNING_XACTS nextXid 59555584 latestCompletedXid 59555583 olderRunningXid 59555584 rmgr: ヒープの長さ (rec/tot): 57/ 5tlsn5: 57/5tls5 76/7E000060、前の 76/7E000028、desc: INSERT+INIT off 1 flags 0x08、blkref #0: rel 1663/5/53434 blk 0 rmgr: トランザクション len (rec/tot): 46/46、tx: 59555584、lsn : 76/7E0000A0、前の 76/7E000060、desc: COMMIT 2023-02-13 16: 25: 19.441483 EST rmgr: スタンバイ len (rec/tot): 50/50、tx: 0、lsn: 76/7E0000D0、前の 76 /7E0000A0、DESC:Running_Xacts NextXid 59555585最新のCompletedXid 59555584 OldestrunningXid 595555585 RMGR:Standby Len(Rec/TOT):50/50、TX:0、LSN:76/7E000108、76/76/76/76/7E0000DCEC:5900D5を実行している letedXid 59555584 olderRunningXid 59555585 rmgr: XLOG len (rec/tot): 114/ 114, tx: 0, lsn: 76/7E000140, prev 76/7E000108, desc: CHECKPOINT_ONLINE redo 76/7E000108; tli 1; 前へ 1; fpw 魅惑的です。 xid 0: 59555585; oid 61620; マルチ799; オフセット 1657; DB 1 の最も古い xid 716。 DB 1 の最も古いマルチ 1。 最も古い/最も気に入ったコミット タイムスタンプ xid: 0/0; 最も古い実行中の xid 59555585。 on-linermgr: XLOG len (rec/tot): 24/ 24, tx: 0, lsn: 76/7E0001B8, prev 76/7E000140, desc: SWITCH![]()
おわりに
WAL を何度も掘り下げて、pg_wal_switch
を黙らせてください。 機会はほとんどありません。 注意点として、さまざまな initdb 代替推奨事項と collecttime 代替推奨事項は、calc の結果を入れ替えることができます。 作成された計算と仮定。 WAL は世俗的な話題であり、WAL に関連するあらゆる要因は、細心の注意を払って処理する必要があります。 お問い合わせして、待ち合わせが成功したかどうか見てみましょう