目录
一、什么是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(后台写进程)将脏块写入磁盘数据文件中。
2、WAL日志的作用
WAL日志主要用于数据库恢复,保证数据库故障时数据不丢失。
具体对比及说明如下:
(1)没有WAL日志时的insert操作过程
在这种情况下,新插入的数据没有写入磁盘时,数据库发生宕机,会导致数据的丢失。
(2)有WAL日志时的insert操作过程
所有的数据块在进行修改时,都在数据缓冲区中进行修改;
所有操作的日志将先记录在日志缓冲区中;
当事务提交之后,日志缓冲区的内容将写入磁盘中的日志文件;
(3)使用wal进行数据库恢复的过程图
此时发生实例崩溃后,虽然数据文件存储层依然没有记录插入的数据,但是可以根据磁盘中wal日志的内容重新将数据插入。
二、WAL物理与逻辑结构
1、wal文件的命名规则
WAL文件的名字是一串24位的数字,具体含义如图:
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());
三、WAL数据内部布局
1、wal内部存储逻辑(内核)
XLOG record:代表一个事务
2、XLOG数据记录的内容(部分,9.5及以后版本)
(1)backup block:备份块
(2)XLOG record of INSERT statement:DML操作
(3)XLOG record of CHECKPOINT action:检查点
四、WAL数据写进程
1、写XLOG记录
从WAL buffer写入WAL磁盘段文件内,由WAL writer后台进程执行写。
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();
(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文件改名为新文件名,原有内容被新的日志条目覆盖(复用此文件)
具体如图示:
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;
还没有评论,来说两句吧...