2. プロセスとメモリー
3.5 ファイルのフォーマット
3.5.4 pg_control
pg_controlファイルは{PGDATA}/global ディレクトリに保存される小さなバイナリ・フ
ァ イ ル で す 。 サ イ ズ は 8 KB で す ( src/include/catalog/pg_control.h 内 に
PG_CONTROL_SIZE で定義)。実際に書き込まれるデータは構造体 ControlFileData で
定義されています(src/include/catalog/pg_control.h)。
□ pg_controlファイルの内容
pg_controlファイルの主な内容はpg_controldataコマンドまたは専用の関数で確認する
ことができます。
$ cd /usr/local/pgsql/data
$ cat PG_VERSION 9.6
$
例 77 pg_controldataコマンドの実行
バージョン情報やデータベースのIDのような固定情報、最終更新時刻、インスタンス の状態、チェックポイントの情報、コンパイル時の情報が出力されます。pg_controldata
$ pg_controldata data
pg_control version number: 960 Catalog version number: 201608131
Database system identifier: 6335932445819631823 Database cluster state: in production
pg_control last modified: Fri Feb 11 12:55:16 2017 Latest checkpoint location: 0/9000098
Prior checkpoint location: 0/8000060 Latest checkpoint's REDO location: 0/9000060
Latest checkpoint's REDO WAL file: 000000010000000000000009 Latest checkpoint's TimeLineID: 1
<<途中省略>>
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint: Fri Feb 11 12:55:16 2017 Fake LSN counter for unlogged rels: 0/1
Minimum recovery ending location: 0/0 Min recovery ending loc's timeline: 0 Backup start location: 0/0 Backup end location: 0/0 End-of-backup record required: no
<<途中省略>>
Blocks per segment of large relation: 131072 WAL block size: 8192 Bytes per WAL segment: 16777216 Maximum length of identifiers: 64 Maximum columns in an index: 32 Maximum size of a TOAST chunk: 1996 Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers Float4 argument passing: by value
Float8 argument passing: by value Data page checksum version: 0
コマンドの出力結果から判るとおり、pg_controlはチェックポイント時およびインスタン スのステータス変更時に情報が更新されます。
pg_controlファイルの情報は以下の関数を使うことでも取得できます。これらの関数は
PostgreSQL 9.6で追加されました。
表 39 pg_control情報取得関数
関数名 説明
pg_control_checkpoint チェックポイントの実行状況
pg_control_init コンパイル時に決定された各種制限値の情報
pg_control_recovery バックアップ/リカバリー情報
pg_control_system バージョン情報、システムID情報
例 78 pg_control_system関数の実行
□ Database cluster state
pg_controldataコマンド実行結果のDatabase cluster stateには現在のpg_controlフ ァイルが認識しているデータベース・クラスターの状態が出力されます。
postgres=> \x
Expanded display is on.
postgres=> SELECT * FROM pg_control_system() ; -[ RECORD 1 ]---+--- pg_control_version | 960
catalog_version_no | 201608131
system_identifier | 6335932445819631823 pg_control_last_modified | 2017-02-11 13:00:16+09
表 40 Database cluster state出力
値 出力 説明 備考
0 starting up インスタンスは起動中
1 shut down インスタンスは正常終了
2 shut down in recovery リカバリー中の停止
3 shutting down 終了中
4 in crash recovery クラッシュ・リカバリ中
5 in archive recovery レプリケーション実行中
6 in production 正常起動状態
- unrecognized status code ステータス不明 pg_control破壊?
□ Database system identifier
Database system identifier項目には、各データベース・クラスターを一意に識別する
ID番号が出力されます(符号なし64ビット整数)。この番号はデータベース・クラスタ ー作成時に決定され、変更されることはありません。ストリーミング・レプリケーション は、このIDが同一であるデータベース・クラスター間で行われます。また、WALファイ ルの最初のブロック内にもこの番号が記録されます(XlogLongPageHeaderData構造 体)。これにより異なるデータベースのWALファイルを誤ってリカバリーに使用すること を防ぐことができます。
Database system identifierは以下のコードにより一意な番号を生成しています
(BootStrapXLOG関数内)。
例 79 BootStrapXLOG関数(src/backend/access/transam/xlog.c)
uint64 sysidentifier;
gettimeofday(&tv, NULL);
sysidentifier = ((uint64) tv.tv_sec) << 32;
sysidentifier |= ((uint64) tv.tv_usec) << 12;
sysidentifier |= getpid() & 0xFFF;
例 80 WALファイルの先頭(src/include/access/xlog_internal.h)