背景:
1:任何数据库都不允许数据丢失。
2:事务日志:记录数据库所有变更与行为的历史记录。
3:数据库通过事务日志回放来保证数据库故障恢复后数据不丢失。
概念:
WAL(Wrioter Ahead Logging 预写式日志),是一种规则或协议,指的是将变更和行为写入事务日志的规则。
应用:
DB故障恢复后数据不丢失;
时间点恢复(PITR);
流复制(Streaming Replication, SR)
重要性:
如果没有WAL。当发起insert操作,从数据库集簇文件中加载数据(表或索引)的页面--->到共享内存缓冲池(shared buffer pool)的槽中--->insert语句修改此页面--->此页面没有持久化,为脏页--->再次update更新次页面--->该页面继续被修改--->仍为脏页,没有刷盘---->此时数据库宕机--->数据库恢复后,内存中的修改页面不存在--->数据丢失。
标识 xlog:
xlog: 首部数据和完整元组组成的一对值。
历史修改数据<==>xlog记录(或WAL数据);
lsn 唯一标识一条xlog记录。(xlog记录的lsn标识这个xlog在事务日志中的位置)
xlog的持久化:
Pg将所有历史数据写入持久化存储中。
具体的,当插入、删除、提交变更动作发生时、Pg会把xlog记录写入内存的wal缓冲区。当事务提交或终止,会立即被写入持久存储的WAL段文件。
表lsn与页lsn:
表的lsn是表页面首部pd_lsn数据字段、与页面的LSN是一回事。
重做点:
1:数据库故障恢复从哪一个时间点恢复:重做点(redo 点)
2:重做点: 当前最新的检查点开始时xlog记录写入的(写入wal段文件)位置。(检查点: chekpoint进程启动时,检查点xlog写入wal段文件,检查点xlog记录中包含最新的重做点位置)
xlog持久化:
0:检查点进程启动(这个后台进程是定期执行的