#author("2019-10-02T14:21:51+00:00","default:haikikyou","haikikyou")
[[PostgreSQL/解析]]
#contents
* WAL(Write Ahead Logging)[#v52df659]
- Write Ahead Loggingの略で、トランザクションログのことである。
- データベースでは、一般にデータの書き込みの前にログに変更内容を書き出す。~
これにより、データベースが何らかの異常でダウンしても、WALログから障害発生前の状態まで復旧することができる。
* WALの構造 [#mfab8c81]
PostgreSQLでは、データベースクラスタの下のpg_wal(ver10以降、以前はpg_xlog)にWALログがかかれる。
** 論理構造 [#d74f22b3]
- WALは、通常16MBのファイルで管理される。
- WALレコードは、タイムライン+ログID+ログID内のオフセットで決まる。~
|~項目|~サイズ|h
|tli(タイムラインID)|4byte|
|xlogid(ログID)|4byte|
|xrecoff(オフセット)|4byte|
WALファイル名は、これらの値で構成される。
#geshi{{{
タイムラインID:1
セグメント0 00000001 00000000 00000000 start xlogid=0
セグメント1 00000001 00000000 00000001
セグメント2 00000001 00000000 00000002
...
セグメント255 00000001 00000000 000000FE end xlogid=0
セグメント256 00000001 00000001 00000001 start xlogid=1
...
-- ログIDごとのセグメント数
XLogSegmentsPerXLogId(wal_segsz_bytes) = 256
-- WALファイル名
例:タイムライン = 1、LSN = 0/14000028 の時
xlogid = 0
xrecoff = 335544360
オフセットNO = 335544360 - 1 / 16MB = 20 = 0x14
ファイル名 = 000000010000000000000014
}}}
&label(warn){参考};
- [[access/xlog_internal.h>https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/xlog_internal.h;h=7453dcbd0eb26e809586ef25877a124dfe65381a;hb=7ca35472cbf36bb822fe56b40cd5af1031e5081a]] - &size(11){&color(gray){https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE};};
- [[Write Ahead Logging — WAL>http://www.interdb.jp/pg/pgsql09.html]] - &size(11){&color(gray){on http://www.interdb.jp/pg/pgsql09.html};};
** WALログ内部構造 [#w4b2dee3]
* 参考リンク [#x2cc3c2f]
- 学習用に便利なWALの中身をSQLで出力する拡張機能
-- [[walreader >https://github.com/moritetu/walreader]] - &size(11){&color(gray){on https://github.com/moritetu/walreader};};