2. プロセスとメモリー
3.9 チェックサム
PostgreSQL 9.3からブロック・チェックサムの機能が加わりました。ブロック毎に、更
新時にチェックサムが付与され、読み込み時にチェックが行われます。
3.9.1 チェックサムの指定
チェックサム機能は標準では無効化されていますが、initdb コマンドに-k9オプションを 指定することでチェックサムを有効化したデータベース・クラスターを作成することがで きます。
例 99 チェックサムの有効化
3.9.2 チェックサムの場所
チェックサムはページヘッダ内のpd_lsnフィールドの後ろに16ビット領域として保存 されます。この場所はPostgreSQL 9.2まではタイムラインID(pd_tli)が格納されてい た部分です。チェックサムを追加してもヘッダ・サイズは変化していないため、旧バージョ ンと比較しても I/O 量には変化がありません。チェックサムの計算やチェックのための CPUリソースは増加すると予想されます。ページヘッダの構造体(PageHeaderData)は、
ヘッダ・ファイルsrc/include/storage/bufpage.hで定義されています。
チェックサムの付与は、ページの書き込み時に実施されます。実際のチェックサム作成は、
ヘッダ・ファイルinclude/storage/checksum_impl.hのpg_checksum_page関数で作成さ れます。
9 または--data-checksumsオプション
$ initdb -k datak
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are enabled. ← チェックサムの有効化
<< 以下省略 >>
例 100 ページヘッダ内のチェックサム
3.9.3 チェックサム・エラー
□ チェックサムの確認
チェックサムの確認はブロックが共有バッファに読み込みが完了した時点で行われます。
チ ェ ッ ク サ ム の エ ラ ー が 検 知 さ れ た 場 合 は 、 ソ ー ス コ ー ド src/backend/storage/buffer/bufmgr.cのReadBuffer_common関数でログ出力されます。実 際のチェックは、ソースコードsrc/backend/storage/page/bufpage.c の PageIsVerified 関 数で実行しています。チェックサムの不正が検知されると以下のエラーが発生します。
例 101 チェックサム不正エラー
チェックサム・エラーが発生したテーブルに対しては、その後はDMLの実行はすべて同 じエラーが発生します。
□ チェックサムの無視
パラメーターignore_checksum_failureをonに設定すると、チェックサムのエラーを無 視します(デフォルト値off)。
typedef struct PageHeaderData {
/* XXX LSN is member of *any* block, not only page-organized ones */
PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog * record for last change to this page */
uint16 pd_checksum; /* checksum */
uint16 pd_flags; /* flag bits, see below */
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
ItemIdData pd_linp[1]; /* beginning of line pointer array */
} PageHeaderData;
WARNING: page verification failed, calculated checksum 2773 but expected 29162 ERROR: invalid page in block 0 of relation base/12896/16385
3.9.4 チェックサムの有無確認
データベース・クラスターのチェックサム指定を確認するためには、pg_controldata ユ ーティリティの実行結果、パラメーターdata_checksumsまたはpg_control_init 関数を確 認します。パラメーターdata_checksumsはPostgreSQL 9.3.4から利用できます。
例 102 チェックサム機能の確認
$ pg_controldata ${PGDATA} | grep checksum
Data page checksum version: 1 ← チェックサム有効
$
$ psql
postgres=> SHOW data_checksums ; data_checksums
---
on ← チェックサム有効
(1 row)
postgres=> SELECT data_page_checksum_version FROM pg_control_init() ; data_page_checksum_version
---
1 ← チェックサム有効
(1 row)