- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- PostgreSQL/解析/WALアーカイブ へ行く。
- 1 (2019-04-20 (土) 09:33:59)
- 2 (2019-04-20 (土) 11:49:44)
- 3 (2019-04-20 (土) 22:11:25)
- 4 (2019-04-21 (日) 02:44:04)
- 5 (2019-04-21 (日) 06:52:21)
- 6 (2019-04-21 (日) 07:28:01)
- 7 (2019-04-22 (月) 09:23:12)
- 8 (2019-04-23 (火) 09:58:32)
- 9 (2019-04-25 (木) 06:29:12)
- 10 (2019-05-25 (土) 23:05:08)
- 11 (2019-05-26 (日) 04:58:49)
- 12 (2019-05-26 (日) 05:51:57)
アーカイブ †
データベースをPITR(ポイントタイムリカバリ)で任意の地点に復旧させるのにデータベースの先行書き込みログ(WAL)が必要となる。アーカイブ設定を行なうことで、PostgreSQLの機能により、walディレクトリのWALを定期的にバックアップ領域に保存できるようになる。PITRでは、ファイルシステムレベルのバックアップ(ex: pg_basebackup)とWALバックアップを用いて復旧させる。
Archiver †
- WALアーカイブを実行しているのは、Archiverプロセスである。
- Archiverプロセスは、起動後はメインループ内でアーカイブコピーを繰り返し行なう。
- メインループはLatchでwaitし、およそ
PGARCH_AUTOWAKE_INTERVAL
(60秒)ごとにループ内の処理を実行する。Latchのタイムアウトは以下で計算される。last_copy_timeは最後にアーカイブされた時間、curtimeはLatchに入る前に取得される時間。よってアーカイブされない時間がPGARCH_AUTOWAKE_INTERVAL秒となるとLatchが外れ(TIMEOUT)、wakened = true
となる。PGARCH_AUTOWAKE_INTERVAL - (curtime - last_copy_time)
- archive_statusディレクトリから、.readyがサフィックスであるファイルを探す。
historyファイルが存在する場合はそれが優先され、複数のhistoryファイルが存在する場合は、最も古いhistoryファイルが優先される。
アーカイブコピーの契機は以下。
- Latchでタイムアウト秒経過する
- シグナル(SIGUSR1)を受けとる
- postmasterのsigusr1_handlerでPMSIGNAL_WAKEN_ARCHIVERのシグナルであることを確認し、postmasterがarchiverにSIGUSR1を送る
アーカイブコピーの処理の流れは以下。
- archive_statusディレクトリに.readyファイルがあるかチェックする
- archive_commandがセットされているか確認する、セットされていない場合はアーカイブを実行しない。WARNINGが出る。
- archive_mode enabled, yet archive_command is not set
- walディレクトリから、.readyで示されるwalログファイルを探す。該当するファイルが存在しない場合、孤児となった.readyを消す。消すのに失敗した場合、1秒のインターバルで
NUM_ORPHAN_CLEANUP_RETRIES
(3回)失敗するまで試行する。 - アーカイブする。
- アーカイブは、
archive_command
で指定されるコマンドをsystem
関数でキックする。 - アーカイブに成功した場合は、.readyを.doneにする。
- アーカイブは、
- 統計情報コレクタに、archiverの統計情報を送る(pg_stat_archiverビュー)。
参考
- backend/postmaster/pgarch.c - https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE
- pg_stat_archiverビュー - on https://www.postgresql.jp/document/10/html/monitoring-stats.html#PG-STAT-ARCHIVER-VIEW
pg_switch_wal() †
pg_switch_wal
関数は、強制的にWALログの切り替えを行なう。
pg_waldump
でWALの内部を解析すると、XLOG rmgrのinfo値でXLOG_SWITCH
という種別のWALが書き込まれる。
rmgr: XLOG len (rec/tot): 24/ 24, tx: 0, lsn: 0/18000060, prev 0/18000028, desc: SWITCH
参考
SWITCH切り替え時、WALセグメントはセグメントサイズまで消費される。
引用 backend/access/transam/xlog.c#CopyXLogRecordToWAL()
/* * XLogArchiveNotify * * Create an archive notification file * * The name of the notification file is the message that will be picked up * by the archiver, e.g. we write 0000000100000001000000C6.ready * and the archiver then knows to archive XLOGDIR/0000000100000001000000C6, * then when complete, rename it to 0000000100000001000000C6.done */ void XLogArchiveNotify(const char *xlog) { char archiveStatusPath[MAXPGPATH]; FILE *fd; /* insert an otherwise empty file called <XLOG>.ready */ StatusFilePath(archiveStatusPath, xlog, ".ready"); fd = AllocateFile(archiveStatusPath, "w"); if (fd == NULL) { ereport(LOG, (errcode_for_file_access(), errmsg("could not create archive status file \"%s\": %m", archiveStatusPath))); return; } if (FreeFile(fd)) { ereport(LOG, (errcode_for_file_access(), errmsg("could not write archive status file \"%s\": %m", archiveStatusPath))); return; } /* Notify archiver that it's got something to do */ if (IsUnderPostmaster) SendPostmasterSignal(PMSIGNAL_WAKEN_ARCHIVER); } /* * Convenience routine to notify using segment number representation of filename */ void XLogArchiveNotifySeg(XLogSegNo segno) { char xlog[MAXFNAMELEN]; XLogFileName(xlog, ThisTimeLineID, segno); XLogArchiveNotify(xlog); }
また、強制切り替えを行なった後、切り替わりでSWITCHが書き込まれたWALログは、即座にアーカイブできるようにしている。内部的にはPostmasterに対し、archiverを起こすためのシグナルが送られている。(PMSIGNAL_WAKEN_ARCHIVER
)
postgres=# select pg_switch_wal(); pg_switch_wal --------------- 0/18000078 (1 row)
以下はバックトレース(master: pg12)。
-- Archiverの統計情報確認 SELECT * FROM pg_stat_archiver -[ RECORD 1 ]------+------------------------------ archived_count | 1 last_archived_wal | 000000010000000000000001 last_archived_time | 2019-03-20 21:44:59.918306+09 failed_count | 0 last_failed_wal | last_failed_time | stats_reset | 2019-03-20 21:42:17.409563+09 -- リセット SELECT pg_stat_reset_shared('archiver') -[ RECORD 1 ]--------+- pg_stat_reset_shared | -- リセットした後 SELECT * FROM pg_stat_archiver -[ RECORD 1 ]------+------------------------------ archived_count | 0 last_archived_wal | last_archived_time | failed_count | 0 last_failed_wal | last_failed_time | stats_reset | 2019-04-20 21:46:54.795811+09
XLogArchiveNotify
関数でpostmasterにシグナルが送られていることが分かる。
引用 backend/access/transam/xlog.c#XLogInsertRecord()
-- 失敗 SELECT * FROM pg_stat_archiver -[ RECORD 1 ]------+------------------------------ archived_count | 0 last_archived_wal | last_archived_time | failed_count | 36 last_failed_wal | 000000010000000000000002 last_failed_time | 2019-03-21 23:28:10.222111+09 stats_reset | 2019-03-20 21:46:54.795811+09 -- 失敗 -- failed_countは +3 -- last_failed_timeは、+62 (sec) SELECT * FROM pg_stat_archiver -[ RECORD 1 ]------+------------------------------ archived_count | 0 last_archived_wal | last_archived_time | failed_count | 39 last_failed_wal | 000000010000000000000002 last_failed_time | 2019-03-21 23:29:12.234861+09 stats_reset | 2019-03-20 21:46:54.795811+09 ... 省略 -- 成功 -- archived_countは、溜まっていたWALファイルの数で6 SELECT * FROM pg_stat_archiver -[ RECORD 1 ]------+------------------------------ archived_count | 6 last_archived_wal | 000000010000000000000007 last_archived_time | 2019-03-21 23:31:14.954457+09 failed_count | 42 last_failed_wal | 000000010000000000000002 last_failed_time | 2019-03-21 23:30:14.245314+09 stats_reset | 2019-03-20 21:46:54.795811+09
引用 backend/access/transam/xlog.c#XLogWrite()
# SELECT pg_switch_wal();を実行している postgres=# \watch 1 土 4/20 17:38:51 2019 (every 1s) pg_switch_wal --------------- 0/45000078 (1 ROW) 土 4/20 17:38:55 2019 (every 1s) pg_switch_wal --------------- 0/46000078 (1 ROW) 土 4/20 17:38:56 2019 (every 1s) pg_switch_wal --------------- 0/47000000 (1 ROW) 土 4/20 17:38:57 2019 (every 1s) pg_switch_wal --------------- 0/47000000 (1 ROW) 土 4/20 17:38:58 2019 (every 1s) pg_switch_wal --------------- 0/47000000 (1 ROW) 土 4/20 17:38:59 2019 (every 1s) pg_switch_wal --------------- 0/47000000 (1 ROW) 土 4/20 17:39:00 2019 (every 1s) pg_switch_wal --------------- 0/47000000 (1 ROW)
参考
- backend/access/transam/xlogarchive.c - https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE