2. プロセスとメモリー
3.9 チェックサム
PostgreSQL 9.3からブロック・チェックサムの機能が加わりました。ブロック毎に、更
新時にチェックサムが付与され、読み込み時にチェックが行われます。
3.9.1 チェックサムの指定
チェックサム機能は標準では無効化されていますが、initdb コマンドに-k6オプションを 指定することでチェックサムを有効化したデータベース・クラスタを作成することができ ます。
例 75 チェックサムの有効化
3.9.2 チェックサムの場所
チェックサムはページヘッダ内のpd_lsnフィールドの後ろに16ビット領域として保存 されます。この場所はPostgreSQL 9.2まではタイムラインID(pd_tli)が格納されてい た部分です。チェックサムを追加してもヘッダ・サイズは変化していないため、旧バージ ョンと比較しても I/O 量には変化がありません。チェックサムの計算やチェックのための CPUリソースは増加すると予想されます。ページヘッダの構造体(PageHeaderData)は、
src/include/storage/bufpage.hで定義されています。
6 または--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. ← チェックサムの有効化
<< 以下省略 >>
例 76 ページヘッダ
3.9.3 チェックサム・エラー
□ チェックサムの確認
チェックサムの確認はファイルからページ読み取り時に行われます。チェックサムの不 正が検知されると以下のエラーが発生します。
例 77 チェックサム不正エラー
チェックサム・エラーが発生したテーブルに対しては、その後は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 を確認します。パラメータ data_checksumsはPostgreSQL 9.3.4から利用できます。
例 78 チェックサムの確認
$ pg_controldata ${PGDATA} | grep checksum
Data page checksum version: 1 ← チェックサム有効
$
$ psql
postgres=# SHOW data_checksums ; data_checksums
---
on ← チェックサム有効
(1 row)