背景:

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:检查点进程启动(这个后台进程是定期执行的),检查点进程负责下面步骤中将xlog记录写入wal段文件的任务。

1:页面加载到共享缓冲池中,当sql语句对数据页面修改,lsn位置创建并记录一条xlog,更新页面lsn.

2:事务提交,wal缓冲区创建并写该提交行为的xlog记录。

3:再将wal缓冲区中所有xlog记录(1, 2的xlog记录?)写入WAL段文件中(进行持久化)。

4:重复1,2,3步骤,所有页面修改,都被当做历史修改记录在wal段文件中

5:数据库故障恢复后,直接wal段文件中恢复。

利用xlog进行数据库恢复(xlog回放):

        从redo点开始,依序读取正确的WAL段文件并回放xlog记录。  按照时间顺序。

1:从redo点开始,读取WAL段文件中第一条语句的xlog记录

2:从数据库集簇文件中加载表A的页到内存中的共享缓冲区中

3:回放xlog: 比较当前页面的lsn和xlog的lsn:

(1): xlog lsn > 页 lsn, xlog的数据就会被插入到当前页面中去。

(2): xlog lsn < 页 lsn, 不会做任何事情,直接读取后面wal数据

4:按照时间顺序读取,重复按照3方式回放其他xlog记录

Pg的xlog整页写入机制:

        备机:为啥整页写入:当pg_writer进程将脏页刷到磁盘过程中,磁盘上页面损坏,此时xlog无法回放损坏的页面。因此需要完整页面及其首部元信息作为一条xlog记录写入(整页写入)。

包含完整页面的xlog记录称为备份区块或整页镜像。

什么时候写:每个页面在最近的检查带点之后第一次发生变更时,进行一次xlog的整页写入。

xlog整页写入和回放:

        1:checkpoint进程启动,(检查点开始)

        2:当insert语句导致数据页面发生修改,写一条xlog,这个xlog记录当前的备份区块(即包含了完整的页面)。注意:之所以xlog整页记录,是因为最近的一次检查点之后该页面第一次写入。

3:当这个事务提交,wal缓冲区创建并记录xlog。之后写入WAL段文件。

4:当再来一条insert语句,不再是第一次修改该数据页面,xlog不再整页写入,正常在lsn位置创建并写xlog记录。

5:当这个事务提交,wal缓冲区创建并记录xlog。之后写入WAL段文件。

6:此时数据库发生crash.

7: 等到数据库恢复。

8:从redo点开始,读取WAL段文件中第一条语句的xlog记录。从数据库集簇目录加载表的页面到共享缓冲池。进行回放xlog。

这里的回放规则:

(1): 当第一条xlog是备份区块,回放规则为:xlog记录是一个备份区块时,直接覆盖当前页面,无视页面或xlog记录的lsn,然后将页面的lsn更新为xlog lsn。

(2): xlog lsn > 页 lsn, xlog的数据就会被插入到当前页面中去。

(3): xlog lsn < 页 lsn, 不会做任何事情,直接读取后面wal数据

9:按照时间顺序,重复上诉步骤8。

WAL段文件:

Pg中事务日志默认被分成大小为16MB的文件。这些文件被称为WAL段文件。

事务日志pg_xlog(目录)中包含多个wal段文件。

WAL段文件命名:24个16进制数(一个数占4位)组成。  每个wal段文件大小为16MB。

命名规则:https://blog.csdn.net/m15217321304/article/details/81152555

WAL段文件的内部布局:

段文件大小为16MB,内部划分为多个8KB的页面。

每个8KB的页面:包括多个XLOG record.

XLOG record : 包括首部 Header 和 数据部分 Data

数据部分 Data: 分为两类,备份区块和非备份区块。

WAL记录的写入流程(xlog写入wal段文件的过程)

        伪代码流程:

        (1)insert into table1 values(1); 

        (2)exec_simple_query() // 执行sql语句

        (3)ExtendClog()    // 记录当前事务状态为in_progress, 写入内存的clog中。

        (4)heap_insert()   // 向共享缓冲池的目标页面上插入元组,创建一条当前页面的xlog记录,调用XLogInsert()。

         (5)XlogInsert()   // 将插入元组的xlog记录写入到WAL缓冲区LSN_1处,更新被修改页面pd_lsn从LSN_0为LSN_1。

         (6)finish_xact_command()  // 执行事务提交,创建提交动作的xlog

           (7)  XLogInsert()   //将该提交行为的xlog记录写入到WAL缓冲区LSN_2处

         (8)XLogWrite()    //将WAL缓冲区所有的xlog记录写入WAL段文件中

         (9)TransactionIdCommitTree()    // 在Clog中将当前事务的状态由"in_progress"修改为"commit".

           (10)以下场景,wal缓冲区的xlog记录都会被写入wal文件

                        1:运行中的事务提交或终止

                         2:wal缓冲区被元组xlog记录写满(wal_buffer满了)

                         3:wal写入进程周期性的执行写入操作。

什么操作会写xlog?

        (1) DML

        (2) Commit操作,包含提交id的xlog记录

        (3) checkpoint进程会写关于该检查点概述信息的xlog记录。检查点xlog记录也会写入WAL缓冲区。

检查点进程(负责脏页刷盘和数据库恢复工作准备):

        (1):检查点进程启动时,会将重做点存储在内存中。(这里的重做点是上一次检查点开始时刻XLOG记录的写入位置,也是数据库恢复的开始位置)

(2):该检查点相应的XLOG记录(即检查点xlog记录)会被写入WAL缓冲区。该XLOG记录是由checkpoint结构体定义的,包含一些变量,如(1)中的重做点的位置。

(3):会将共享内存中的所有数据,如CLOG的内容,都会被刷入磁盘中。

(4):共享缓冲池中的所有脏页都会被刷写到存储中。

(5):更新pg_control文件。该文件包含上一次检查点的位置。检查点进程会创建包含重做点的检查点,并将检查点位置与其他信息存储到pg_control文件中。

Pg的重做点是从检查点中获取的。检查点存储在pg_control文件。由检查点进程写入的。

Pg的数据库恢复:

(1):读取pg_control文件中的所有项:(in production 数据库正在运行,进入恢复模式,意味着数据库没有正常停止)

(2):Pg从合适的WAL段文件中读取最近(最新)的检查点记录(检查点相应的xlog),该xlog记录的位置(检查点)写在pg_control文件中。从这个检查点中获取redo点。如果这个最新的检查点是无效的,就会读取前一个检查点。

(3):基于读取的redo点回放xlog记录,直到最新的WAL段文件的最后位置。

(4):具体的回放机制,见上面所讲。

WAL段文件管理(wal的回收利用机制):

1:Pg中xlog记录写入在pg_xlog子目录的WAL段文件中。当旧的段文件写满,就会切换到新的段文件。

2:单检查点进程启动时,pg都会估计并准备一个检查点周期所需的WAL段文件。

估计的准则,是依据当前检查点周期消耗的文件数量。这个文件数量从重做点的段文件开始计数,计数的值在min_wal_size到max_wal_size之间。

3:实例:假设检查点开始之前共有6个wal段文件,wal_3包含上一个检查点周期的redo点。Pg估计需要5个文件,这种情况wal_1-->回收利用为wal_7,wal_2被移除。任何一个比redo点老的段文件理论上都可以被移除。

PostgreSQL的WAL基本原理相关推荐

  1. 预写式日志 - postgresql之WAL(Write Ahead Log)

    oracle中存在重做日志文件(redo log),其作用是保证数据的一致性和事务的完整性,防止在系统崩溃时最近的事务无法恢复.在postgresql中引入了WAL(write ahead log), ...

  2. PostgreSQL数据库WAL——备机回放checkpoint WAL

    从PostgreSQL数据库WAL--资源管理器RMGR文章中,我们知道XLog日志被划分为多个类型的资源管理器,每个资源管理器只需要负责与自己相关的日志处理(抽象出操作函数,不同的日志实现不同的操作 ...

  3. Postgresql关于wal日志总结,一文搞清楚它的所有概念和相关操作

    官方文档 https://www.postgresql.org/docs/11/wal-intro.html https://www.postgresql.org/docs/11/wal-config ...

  4. PostgreSQL:WAL日志归档策略

    文章目录 概述 参数配置 归档策略脚本 概述 今天分享一个PostgreSQL数据库配置wal日志归档的策略.所谓wal日志归档,就是把在线的wal日志备份出来.说起来简单,但是在正式的系统上需要一个 ...

  5. PostgreSQL 在WAL文件中查找drop table、update、delete操作

    配套视频 要还原数据前必须查找对应的wal文件中的lsn号,步骤如下: 根据大致的操作时间先确认大至wal文件的范围. 解析此范围内的wal文件然后输出至文本. 在文本中根据特征中查找.如果未找到请扩 ...

  6. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.5. WAL内部...

    30.5. WAL内部 WAL是自动被启用的.除了做一些设置满足存放WAL日志的磁盘空间需求以及一些必要的调节以外(参阅第 30.4 节),对管理员没有什么其他要求. 当每个新记录被写入时,WAL记录 ...

  7. Postgresql杂谈 20—详解Postgresql中的Checkpoint、WAL日志和热备份恢复

    本文中,我们共同学习下Postgresql的WAL日志.WAL,是Write Ahead Log的简称,翻译过来就是预写日志,或者叫做重做日志.相信大家对数据库事务的四大特性ACID(原子性.一致性. ...

  8. PostgreSQL源码分析

    PostgreSQL源码结构 PostgreSQL的使用形态 PostgreSQL采用C/S(客户机/服务器)模式结构.应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信 ...

  9. PostgreSQL(一)PostgreSQL一主二从集群部署

    (一)基础准备 1.1  创建三台虚拟机 虚拟机名 IP hostname 主从划分 pgpool0 192.168.149.236 node236 主节点 pgpool1 192.168.149.2 ...

最新文章

  1. 汪星人出门也靠脸?狗脸识别技术可识别化妆后的汪星人,准确率99%
  2. laravel5.8笔记一:安装与服务器环境配置
  3. 【励志好文】老爸推荐的好文,受益良多!
  4. Spring 中的编程思想总结
  5. 低至4.7折起!戴尔OptiPlex商用台式机限时特惠,重磅来袭!
  6. ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置详解
  7. jdk1.6的项目可以用1.8吗_摩托车链条的保养项目有哪些?可以用高压水枪清洗吗?...
  8. WordPress 不用插件实现对长文章进行分页
  9. java做爬虫和python做爬虫_为什么常用Python,Java做爬虫,而不是C#C++等?
  10. python扫雷脚本_Python自动扫雷实现方法
  11. vba 生成euc文件的方法
  12. docker 常用命令 五 容器日志
  13. SLAM ---- 误差测评 ATE、RPE、APE,与EVO
  14. map、set、multimap、multiset、hash_map、hah_set、hash_multimap、hash_multiset
  15. 南方航空认沽权证21日上市 初始行权价为7.43元
  16. 重磅干货:30张图读懂当前中国金融体系!
  17. EXCEL中小数点后面的0怎么去掉
  18. 雷军与陈年是真爱:凡客即将“小米化”改造
  19. Hadoop 实战之分析专利引用数据集(三)
  20. 洛谷P5804 [SEERC2019]Absolute Game

热门文章

  1. Python的网络编程[3] - BOOTP 协议[1] - BOOTP 的 Python 实现
  2. Android项目升级到Android12报错集合
  3. python爬虫入门之http协议和 Chrome 浏览器抓包工具
  4. 中国代步平衡车市场销售态势与消费趋势预测报告(2022-2027年)
  5. 俄大学生发明可溶解环保塑料薄膜
  6. Reentrant 可重入解释
  7. 全新的lr2021(Photoshop Lightroom Classic 2021)
  8. java 偏向锁_Java并发之彻底搞懂偏向锁升级为轻量级锁
  9. 2021苹果春季发表会懒人包:AirTags、iMac、iPad Pro、Apple TV 4K
  10. 什么是高防服务器“清洗”,高防清洗具备哪些优势呢?