首页 > 其他分享 >pg 崩溃恢复篇(二)—— WAL文件结构及管理

pg 崩溃恢复篇(二)—— WAL文件结构及管理

时间:2023-04-18 10:40:24浏览次数:51  
标签:文件 WAL wal pg 归档 日志 崩溃


第二篇我们来看WAL文件逻辑、物理结构以及管理方法。

一、 事务日志和WAL文件

1. 命名规则

       在逻辑上,pg用一个地址空间长度为8B的虚拟文件表示事务日志(最大可达16EB)。

pg中的事务日志默认切分为16 MB的文件,每个文件称为WAL段。pg 11开始,使用initdb命令初始化时可以使用 –wal-segsize选项 配置WAL段文件的大小。

pg 崩溃恢复篇(二)—— WAL文件结构及管理_数据库

        黄框部分表示WAL文件名由24个字符组成(每个字符以十六进制数表示),命名规则如下:

  • 前8位:timelineId,即时间线id(备份恢复篇会提到)
  • 中间8位:WAL的逻辑id,每个逻辑id默认大小为 256*16M(逻辑段*日志大小),即每个逻辑id包含256个16M的物理WAL文件
  • 最后8位:当前WAL文件是本逻辑id的第几个(逻辑段号),由于最大是256个,因此其实只要最后2位就可以表示。

       例如下面这个文件,就表示时间线=1,逻辑id=0,是本逻辑id的第1个WAL文件

pg 崩溃恢复篇(二)—— WAL文件结构及管理_归档日志_02

2. 查看当前日志与文件名

默认日志大小

postgres=# show wal_segment_size;
 wal_segment_size
------------------
 16MB
(1 行记录)

查看当前日志

postgres=# select pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn
---------------------------
 0/1893A00
(1 行记录)

转为WAL文件名

pg 10开始用 pg_walfile_name,10之前用 pg_xlogfile_name

postgres=# select pg_walfile_name('0/1893A00');
     pg_walfile_name
--------------------------
 000000010000000000000001
(1 行记录)

postgres=# select pg_walfile_name(pg_current_wal_insert_lsn());
     pg_walfile_name
--------------------------
 000000010000000000000001
(1 行记录)

二、 WAL的内部结构

默认情况下,WAL段是一个16 MB的文件,内部切分为8192字节(8K)的页面。第一个page包含由结构体XLogLongPageHeaderData定义的头数据,而其他的page包含结构体XLogPageHeaderData定义的头数据。在页头之后,则是以降序写入page的XLOG记录。

pg 崩溃恢复篇(二)—— WAL文件结构及管理_归档日志_03

XLogLongPageHeaderData和XLogPageHeaderData结构体在src/include/access/xlog_internal.h中定义。这里省略了对这两种结构体的说明,因为在以下描述中不需要这些结构。

typedef struct XLogPageHeaderData
{
	uint16		xlp_magic;		/* 用于正确性检查的魔数(magic value) */
	uint16		xlp_info;		/* 标记位 */
	TimeLineID	xlp_tli;		/* 页面中第一条记录的时间线id */
	XLogRecPtr	xlp_pageaddr;	/* 当前页面的clog地址 */

	/*
	 * When there is not enough space on current page for whole record, we
	 * continue on the next page.  xlp_rem_len is the number of bytes
	 * remaining from a previous page.
	 *
	 * Note that xlp_rem_len includes backup-block data; that is, it tracks
	 * xl_tot_len not xl_len in the initial header.  Also note that the
	 * continuation data isn't necessarily aligned.
	 */
	uint32		xlp_rem_len;	/* total len of remaining data for record */
} XLogPageHeaderData;

#define SizeOfXLogShortPHD	MAXALIGN(sizeof(XLogPageHeaderData))

typedef XLogPageHeaderData *XLogPageHeader;

/*
 * When the XLP_LONG_HEADER flag is set, we store additional fields in the
 * page header.  (This is ordinarily done just in the first page of an
 * XLOG file.)	The additional fields serve to identify the file accurately.
 */
typedef struct XLogLongPageHeaderData
{
	XLogPageHeaderData std;		/* standard header fields */
	uint64		xlp_sysid;		/* system identifier from pg_control */
	uint32		xlp_seg_size;	/* just as a cross-check */
	uint32		xlp_xlog_blcksz;	/* just as a cross-check */
} XLogLongPageHeaderData;

#define SizeOfXLogLongPHD	MAXALIGN(sizeof(XLogLongPageHeaderData))

typedef XLogLongPageHeaderData *XLogLongPageHeader;

三、 WAL段文件切换与管理

PostgreSQL将XLOG记录写入在pg_xlog目录(10开始为pg_wal目录)的WAL段文件中。旧文件写满时则切换到新文件。 WAL文件的数量由参数配置而定。

1. WAL文件切换

发生以下任一情况时,会发生WAL文件切换:

  1. WAL文件已经写满
  2. 执行pg_switch_xlog()函数,10后为pg_switch_wal()
  3. 启用archive_mode且超过archive_timeout设置值

切换后的段文件通常会被回收(重命名或重用)以供将来使用,如果不需要,也可能会被删除。


2. 9.5开始的WAL段管理

每当检查点启动时,PostgreSQL都会预估并准备下一个检查点周期所需的WAL段文件数。这种估计基于前一个检查点周期中消耗的文件数量,即从包含上一个重做点的段文件开始计数,这个值范围在min_wal_size(默认80 MB,即5个文件)和max_wal_size(默认1GB,即64个文件)之间。如果检查点进程启动,必要的文件会被保留或回收,不必要的文件会被删除。

具体例子如下图,假设在检查点开始前有6个文件,WAL_3包含了上一个重做点(11之前版本为上一个重做点,11开始为当前重做点),pg预估需要5个文件。在这种情况下,WAL_1被重命名为WAL_7回收利用,而WAL_2将被删除。

任何比包含上一个重做点的WAL文件更旧的WAL文件都可以被删除,因为它们在崩溃恢复时已不会被用到

pg 崩溃恢复篇(二)—— WAL文件结构及管理_重做_04

如果出现了WAL活动尖峰,需要更多WAL文件,新的文件就会被创建,但WAL文件的总大小不能超过max_wal_size的值。

例如下图,如果WAL_7已填充满,则新创建WAL_8。

pg 崩溃恢复篇(二)—— WAL文件结构及管理_归档日志_05

WAL文件的数量会根据数据库的繁忙程度自适应地改变。如果WAL数据写入量不断增加,则WAL文件的预估数及WAL文件的总大小也会逐渐增加。反之则减少。

如果WAL文件的总大小超过max_wal_size,将启动检查点,如下图。检查点将会创建一个新的重做点,之前最新的重做点将变为前一个重做点,不必要的文件会被回收。通过这种方式,pg将始终只保留崩溃恢复必须的WAL文件。配置参数wal_keep_segments和复制槽功能也会影响WAL段文件的数量。

pg 崩溃恢复篇(二)—— WAL文件结构及管理_数据库_06


四、 持续归档和归档日志

持续归档是当WAL文件发生切换时自动将其复制至归档目录的一项功能,归档由archiver process执行,复制出来的文件称为归档日志。此功能常用于物理热备份和PITR(时间点恢复)。

归档目录的路径设置由archive_command参数配置

# %p被复制WAL文件目录占位符,%f是归档日志文件的占位符
archive_command = 'cp %p /home/postgres/archives/%f'

在WAL_7文件发生切换时,该文件作为 归档日志7 被复制到归档目录。


pg 崩溃恢复篇(二)—— WAL文件结构及管理_重做_07

archive_command可以配置为任何Unix命令或程序,因此也可以通过scp命令将归档日志传输到其他主机,或使用任意的文件备份工具来代替普通复制命令。

pg不会自动清理归档日志,因此打开归档时需要妥善管理。如你什么都不做,归档日志的数量将不断增加。pg_archivecleanup是一个实用的归档日志管理工具。

参考

The Internals of PostgreSQL : Chapter 9 Write Ahead Logging — WAL

https://github.com/postgres/postgres/blob/master/src/include/access/xlog_internal.h


标签:文件,WAL,wal,pg,归档,日志,崩溃
From: https://blog.51cto.com/u_13631369/6202526

相关文章

  • pg 如何生成创建表sql语句?
    oracle有dbms_metadata.get_ddl;sqlserver可以直接右键;mysql有showcreatetable但pg好像没有直接的方法,网上找到了几种自己创建函数的方法,收集一下。法一:支持生成包含:字段(支持数组类型字段)、约束、索引(支持唯一索引、全类型索引)在内的建表语句。CREATEORREPLACEFUNCTION"public......
  • pg 10 主要参数配置整理
    一、查看参数设置show参数名select*frompg_settingswherename='参数名';查看 postgresql.conf文件  二、参数是否可修改pg中主要可优化参数都位于postgresql.conf文件中,其中参数是否可修改可通过pg_settings的context字段查询。postgres=#selectdistinctcontextfrom......
  • pg 物理架构
    架构图各部分用途......
  • pg事务篇(一)—— 事务与多版本并发控制MVCC
    一、MVCC常用实现方法一般MVCC有2种实现方法:写新数据时,把旧数据快照存入其他位置(如oracle的回滚段、sqlserver的tempdb)。当读数据时,读的是快照的旧数据。写新数据时,旧数据不删除,直接插入新数据。PostgreSQL就是使用的这种实现方法。1.PostgreSQL的MVCC实现方式优缺点优点无论事务......
  • Oracle 单进程可用PGA为4G限制导致的ORA-4030报错
    一、问题背景收到开发反馈,系统报表运行过程中报错,一看发现是ORA-4030,内存的问题查看alert日志,发现期间有大量ORA-4030报错,并且主要是pga相关的打开trace文件,可以看到报错进程使用内存接近4G但是查看pga参数设置,发现设置的上限是20G,完全没到,并且期间总的PGA使用率也不高 二、报错......
  • 【FPGA】vivado使用时的问题汇总
    今天在使用vivado的时候,出现了之前的错误,但是我忘记了解决方案,只能再去网上找方法。所以我建了个这个问题汇总博客,以后再碰到问题可以先来这里翻一翻。1、MIGIP核在重新打开工程的时候会丢失一些文件,导致无法仿真,需要重新生成一遍IP核才能够正常使用。同样的,在OpenIPExample......
  • firewalld 和 iptables 区别
    在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。firewalld跟iptables比起来至少有两大好处:1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以......
  • CentOS 7 :Failed to start IPv4 firewall with iptables
    关闭firewalld:systemctlstopfirewalldsystemctlmaskfirewalld使用iptables服务:#开放443端口(HTTPS)iptables-AINPUT-ptcp--dport443-jACCEPT#保存上述规则serviceiptablessave#开启服务systemctlrestartiptables.service一切正常。......
  • 【FPGA 仿真和调试脚本】常用系统任务
    一、显示任务$display和$write系统显示任务$display和$write在仿真测试中是最为常用的信息显示方式。$display和$write任务最主要的区别在于,$display在一次输出后会自动换行,而$write则不会,他们的其他用法格式基本类似。【语法结构】【任务名】(“【可选字符串】+【格式】”,【信......
  • PG技术大讲堂 - 第14讲:PostgreSQL 检查点
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。Part14:PostgreSQL检查点内容1:检查点触发机制内容2:检查点作用......