PostgreSQL(十一)WAL日志管理

PostgreSQL(十一)WAL日志管理

码农世界 2024-06-10 后端 85 次浏览 0个评论

目录

一、什么是WAL日志

1、WAL日志的概念

2、WAL日志的作用

二、WAL物理与逻辑结构

1、wal文件的命名规则

2、wal文件的使用规则

三、WAL数据内部布局

1、wal内部存储逻辑(内核)

2、XLOG数据记录的内容(部分,9.5及以后版本)

四、WAL数据写进程

1、写XLOG记录

2、WAL写进程-WAL writer

(1)概念

(2)触发WAL Writer的条件

五、WAL日志管理

1、存储路径

2、存储内容

3、WAL日志切换

(1)WAL segment has been filled up.

(2)The function pg_switch_wal has been issued.

(3)Archive_mode is enabled and the time set to archive_timeout has been exceeded.

4、WAL日志的删除与回收

5、重要参数

(1)控制wal文件数量的参数:

(2)控制wal文件/目录的大小:

六、WAL归档日志

1、连续归档:

2、发生切换时归档图示:


一、什么是WAL日志

1、WAL日志的概念

PG的WAL(Write Ahead Log)日志,意为 预写式日志,特点是先记后做。

例如:假设发生一个update事务,数据库的操作步骤:

(1)将update事务转化为特定格式,形成日志条目,记录至内存中的wal buffer;

(2)从磁盘的数据文件中读取需要update的数据至内存中的buffer cache,然后进行update,得到脏块;

(3)commit这个事务(或满足其他触发条件),wal writer进程将wal buffer中日志条目记录至磁盘的wal文件中;

(4)background writer(后台写进程)将脏块写入磁盘数据文件中。

PostgreSQL(十一)WAL日志管理

2、WAL日志的作用

WAL日志主要用于数据库恢复,保证数据库故障时数据不丢失。

具体对比及说明如下:

(1)没有WAL日志时的insert操作过程

在这种情况下,新插入的数据没有写入磁盘时,数据库发生宕机,会导致数据的丢失。

PostgreSQL(十一)WAL日志管理

(2)有WAL日志时的insert操作过程

所有的数据块在进行修改时,都在数据缓冲区中进行修改;

所有操作的日志将先记录在日志缓冲区中;

当事务提交之后,日志缓冲区的内容将写入磁盘中的日志文件;

PostgreSQL(十一)WAL日志管理

(3)使用wal进行数据库恢复的过程图

此时发生实例崩溃后,虽然数据文件存储层依然没有记录插入的数据,但是可以根据磁盘中wal日志的内容重新将数据插入。

PostgreSQL(十一)WAL日志管理

二、WAL物理与逻辑结构

1、wal文件的命名规则

WAL文件的名字是一串24位的数字,具体含义如图:

PostgreSQL(十一)WAL日志管理

16兆:可以记录大约几十万的数据日志;

时间线:当对pg数据库进行一次恢复之后,时间线会发生变化(+1),初始值为1;

日志序列号:可用于判断日志循环的次数。当写到日志末尾以FF结尾时(16进制),再次写日志,此值将会+1,初始值为0。

2、wal文件的使用规则

pg为了管理方便,会一次产生多个wal文件,因此并不是文件号最大的文件为当前写入的日志文件。可以用以下方式判断当前事务使用的包含LSN的wal文件名:

(1)9.6及更早版本:select pg_xlogfile_name

(2)10及以后版本:select pg_walfile_name(pg_current_wal_lsn());

PostgreSQL(十一)WAL日志管理

三、WAL数据内部布局

1、wal内部存储逻辑(内核)

PostgreSQL(十一)WAL日志管理

XLOG record:代表一个事务

2、XLOG数据记录的内容(部分,9.5及以后版本)

(1)backup block:备份块  

PostgreSQL(十一)WAL日志管理

(2)XLOG record of INSERT statement:DML操作

PostgreSQL(十一)WAL日志管理

(3)XLOG record of CHECKPOINT action:检查点

PostgreSQL(十一)WAL日志管理 PostgreSQL(十一)WAL日志管理

四、WAL数据写进程

1、写XLOG记录

从WAL buffer写入WAL磁盘段文件内,由WAL writer后台进程执行写。

PostgreSQL(十一)WAL日志管理

2、WAL写进程-WAL writer

(1)概念

        WAL writer是一个后台进程,用于定期检查WAL缓冲区,并将所有未写入的XLOG记录写入WAL段。此过程的目的是避免XLOG记录的突发写入。如果未启用此进程,则在一次提交大量数据时,XLOG记录的写入可能会 遇到瓶颈。

        WAL writer默认工作,不能禁用。检查间隔设置由配置参数wal_writer_delay来定,缺省200毫秒。

(2)触发WAL Writer的条件

At commit:一个正在运行的事务已经提交或已中止

WAL buffer full:WAL缓冲区已经填满了许多元组(WAL缓冲区尺寸由参数WAL_buffer设置,缺省16M)

Writes periodically:WAL writer进程定期写入发生

五、WAL日志管理

1、存储路径

$PGDATA/pg_wal/

2、存储内容

WAL中记录的日志条目=事务记录(原始DML SQL )的格式化

即:不直接记录原始sql,而是转换为pg能看懂的特定格式

3、WAL日志切换

(1)WAL segment has been filled up.

自动切换:当前WAL文件写满后切换下一个,已有WAL文件写满后产生新文件。

(2)The function pg_switch_wal has been issued.

手动切换:通过使用函数pg_switch_wal

#查看当前使用
select pg_walfile_name(pg_current_wal_lsn());
#执行手动切换
select pg_switch_wal();

PostgreSQL(十一)WAL日志管理

(3)Archive_mode is enabled and the time set to archive_timeout has been exceeded.

定时强制切换:基于主备复制需求,archive_mode参数已启用,并且已超过设置为archive_timeout的时间。

4、WAL日志的删除与回收

此行为判断基于一个ckpt完成过程:

(1)当前的ckpt所在wal日志及其记录的redo点所在wal日志 区间内,为需要的文件;

(2)在此之前的为废弃的文件。

废弃文件有两种处理方式:

(1)删除不需要的wal文件;

(2)将不需要的wal文件改名为新文件名,原有内容被新的日志条目覆盖(复用此文件)

具体如图示:

PostgreSQL(十一)WAL日志管理

PostgreSQL(十一)WAL日志管理

5、重要参数

(1)控制wal文件数量的参数:

checkpoint_segments:v9.5之后已废弃

checkpoint_completion_target:使PostgreSQL尽可能慢地去写数据,能在

                                checkpoint_completion_target*checkpoint_timeout的时间内就行,缺省0.5

WAL_keep_segments:当前机器wal日志文件最少保留个数。用于主备复制,为了预防网络原因导致wal日志未传输到备库。

pg_wal目录下的文件数量计算公式:

((2+ checkpoint_completion_target)* checkpoint_segments+1)

(2)控制wal文件/目录的大小:

max_wal_size:设置wal目录($PGDATA/pg_wal目录)最大可用,缺省1024MB

wal_segment_size:设置单个wal文件最大可用,缺省16MB

wal_buffers:设置WAL缓冲区最大可用,缺省512KB

六、WAL归档日志

1、连续归档:

在WAL文件切换时,将WAL文件复制到归档区域,由archive(后台)进程执行。复制的文件称为归档日志。

#archive_command:配置存档区域的路径
#占位符%p是复制的WAL段,%f是存档日志
#定义归档路径
ALTER SYSTEM SET archive_command='cp %p /data/postgresql/data/pg_wal/arch/%f';
#开启归档
ALTER SYSTEM SET archive_mode=on;

2、发生切换时归档图示:

PostgreSQL(十一)WAL日志管理

转载请注明来自码农世界,本文标题:《PostgreSQL(十一)WAL日志管理》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,85人围观)参与讨论

还没有评论,来说两句吧...

Top