PostgreSQL(十一)WAL日志管理

本文详细介绍了PostgreSQL中的WAL日志系统,包括其概念、物理与逻辑结构、数据内部布局、WAL写进程、日志管理策略以及归档日志的连续性和触发机制。重点讲解了WALwriter的工作原理和重要参数设置。
摘要由CSDN通过智能技术生成

目录

一、什么是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;

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

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值