WAL日志

1.WAL概述

PG WAL(Write-Ahead Logging)日志是PostgreSQL数据库中的一种重要机制,用于保证数据库的完整性和数据恢复。

1.1定义与功能

WAL日志是PostgreSQL的持久性技术,它将所有对数据库的修改操作(如INSERT、UPDATE、DELETE等)记录到一个称为WAL日志的文件中。这些记录是在对数据库中的数据进行任何修改之前进行的,即“先记后做”。这种机制确保了即使系统崩溃或发生意外停机,也可以使用WAL日志来恢复数据库的一致性状态。

1.2工作原理

  • 事务开始:当一个事务开始时,PostgreSQL会记录下相关操作。
  • 写入WAL:在事务中对数据库做出的任何修改首先会被写入WAL日志。这些日志被顺序写入,通常存储在磁盘上的预定义路径中(如pg_wal或pg_xlog目录)。
  • 刷新到磁盘:在事务提交之前,涉及的所有WAL记录必须首先被刷新(写入)到磁盘上。这确保了即使在发生故障时,这些修改也不会丢失。
  • 背景写入:数据库的后台写入进程(如checkpointing和background writer)会将数据从内存中写入磁盘,但不必在每次事务提交时立即这样做,因为已经有了WAL记录。

没有日志的insert
将数据从磁盘读取到缓冲区,然后插入数据,提交直接在缓冲区,没有将数据刷新到磁盘,当发生故障时,数据丢失
在这里插入图片描述
有日志的WAL
LSN(Log Sequence Number)是用于标识和跟踪事务日志的一种方式,用于标识特定记录的位置
在这里插入图片描述
使用WAL日志恢复数据
在这里插入图片描述
恢复

create unlogged table t1(id int);

解决坏一致问题,当页有问题,怎么解决,看下面的全页写
在这里插入图片描述

2.全页写

全页写(Full Page Write,FPW)是PostgreSQL数据库中的一种日志记录机制,用于确保在数据库恢复过程中,能够恢复修改过的数据页,即使在写入过程中发生故障导致部分页面数据损坏

2.1全页写的工作原理 :

当数据库在检查点(checkpoint)之后第一次修改一个页面时,整个页面会被写入WAL(Write-Ahead Logging)日志中,而不仅仅是修改的部分。

这种机制确保了在恢复过程中,遇到损坏的页面时,可以从WAL中恢复完整的页面数据,而不需要从数据文件中读取可能已经损坏的部分

2.2全页写的模式 :

非强制模式 :这是默认模式。在最后一次检查点之后,第一次修改的数据块会进行全页写,之后再次修改时不会进行全页写,直到下一次检查点发生。通过设置full_page_writes=on可以启用非强制模式。

强制模式 :当使用pg_basebackup工具对数据库进行备份时,会自动执行强制模式。在备份期间,任何被修改的数据库块都会被写入WAL中,无论是否是第一次修改或是否有检查点。执行pg_start_backup函数时,系统也会进入全页写模式,执行pg_stop_backup后停止

全页写

在这里插入图片描述
全页写恢复机制
在这里插入图片描述

3.WAL物理结构与逻辑结构

3.1WAL物理结构

文件命名与格式

  • 在PostgreSQL中,WAL文件默认以16MB为单位进行切分,每个文件称为WAL段。
  • WAL文件名由24个字符组成(每个字符以十六进制数表示),命名规则包括时间线ID(8位)、逻辑ID(8位)和逻辑段号(8位,但通常只需最后2位即可表示,因为每个逻辑ID包含256个16M的物理WAL文件)。
  • 例如,文件名“000000010000000000000001”表示时间线ID为1,逻辑ID为0,是本逻辑ID的第1个WAL文件。

文件内部布局

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

存储路径

  • 在PostgreSQL中,WAL文件默认存储在$PGDATA/pg_wal/目录下(在PostgreSQL 10及之前版本,该目录名为pg_xlog)。

事务日志与WAL段文件
在这里插入图片描述
wal日志文件命名规则:
我们看到的wal日志是这样的:000000010000000100000092

  • 其中前8位:00000001表示timeline;
  • 中间8位:00000001表示logid;
  • 最后8位:00000092表示logseg

wal日志LSN编号规则:
1/920001F8(高32位/低32位)
在这里插入图片描述

select pg_current_wal_lsn();
3.1.1WAL数据内部布局

PG把日志文件划分为N个大小为16M(默认值)的WAL segment file,pg_resetwal --wal-segsize=64可以将WAL日志文件大小设置为64MB
WAL日志结构
在这里插入图片描述
WAL日志包含的数据类型
在这里插入图片描述

3.1.2WAL数据写进程

在这里插入图片描述
在这里插入图片描述
查看对应的wal日志配置 wal_buffers=512k 默认值为shared_buffers大小的1/32,16284k=16M

elect name,setting from pg_settings where name like '%share%';
            name            | setting
----------------------------+---------
 dynamic_shared_memory_type | windows
 shared_buffers             | 16384
 
postgres=# select name,setting from pg_settings where name like '%wal%';
             name             |    setting
------------------------------+---------------
 max_wal_senders              | 0
 max_wal_size                 | 64
 min_wal_size                 | 5
 wal_block_size               | 8192
 wal_buffers                  | 512
 wal_compression              | off
 wal_keep_segments            | 0
 wal_level                    | minimal
 wal_log_hints                | off
 wal_receiver_status_interval | 10
 wal_receiver_timeout         | 60000
 wal_retrieve_retry_interval  | 5000
 wal_segment_size             | 2048
 wal_sender_timeout           | 60000
 wal_sync_method              | open_datasync
 wal_writer_delay             | 200
 wal_writer_flush_after       | 128
(17 行记录)

什么时候触发写日志

  • 提交事务时 :当一个事务被提交时,日志编写器(LGWR)会将事务日志信息写入联机日志文件。这是数据库管理系统(DBMS)确保数据一致性和恢复能力的关键机制之一。

  • 日志缓冲区满时 :当日志缓冲区达到其容量的1/3时,LGWR会被触发以将日志信息写入磁盘。

  • 日志切换时 :在数据库进行日志切换时,即从一个日志文件切换到下一个日志文件时,LGWR也会被触发进行日志写入。WAL段写满、执行pg_switch_wal命令、开启归档且达到archive_timeout阀值

  • 用户操作触发 :用户执行commit或rollback语句时,会触发日志记录。这是因为这些操作标志着事务的结束,需要将相关信息写入日志以确保事务的持久性和可恢复性。

3.2WAL逻辑结构

3.2.1记录内容

WAL中记录的日志条目是事务记录(原始DML SQL)的格式化版本,而不是直接记录原始SQL。
XLOG记录的内容包括备份块、DML操作的XLOG记录、检查点操作的XLOG记录等。

3.2.2写入机制

所有数据块在进行修改时,都在数据缓冲区中进行。所有操作的日志将首先记录在日志缓冲区中。
当事务提交之后,日志缓冲区的内容将写入磁盘中的WAL文件。
WAL writer是一个后台进程,用于定期检查WAL缓冲区,并将所有未写入的XLOG记录写入WAL段。此过程的目的是避免XLOG记录的突发写入。

3.2.3日志切换

WAL文件切换会在以下情况下发生:

  • WAL文件已经写满、
  • 执行pg_switch_wal()函数(在PostgreSQL 10及之后版本)、
  • 启用归档archive_mode且超过archive_timeout设置值。
    切换后的段文件通常会被回收(重命名或重用)以供将来使用,如果不需要,也可能会被删除。
postgres=# \d pg_proc;
       数据表 "pg_catalog.pg_proc"
      栏位       |     类型     | 修饰词
-----------------+--------------+--------
 proname         | name         | 非空
 pronamespace    | oid          | 非空
 proowner        | oid          | 非空
 prolang         | oid          | 非空
 procost         | real         | 非空
 prorows         | real         | 非空
 provariadic     | oid          | 非空
 protransform    | regproc      | 非空
 proisagg        | boolean      | 非空
 proiswindow     | boolean      | 非空
 prosecdef       | boolean      | 非空
 proleakproof    | boolean      | 非空
 proisstrict     | boolean      | 非空
 proretset       | boolean      | 非空
 provolatile     | "char"       | 非空
 proparallel     | "char"       | 非空
 pronargs        | smallint     | 非空
 pronargdefaults | smallint     | 非空
 prorettype      | oid          | 非空
 proargtypes     | oidvector    | 非空
 proallargtypes  | oid[]        |
 proargmodes     | "char"[]     |
 proargnames     | text[]       |
 proargdefaults  | pg_node_tree |
 protrftypes     | oid[]        |
 prosrc          | text         | 非空
 probin          | text         |
 proconfig       | text[]       |
 proacl          | aclitem[]    |
索引:
    "pg_proc_oid_index" UNIQUE, btree (oid)
    "pg_proc_proname_args_nsp_index" UNIQUE, btree (proname, proargtypes, pronamespace)


postgres=#
postgres=# select proname from pg_proc where proname like '%wal%';
         proname
--------------------------
 pg_stat_get_wal_senders
 pg_stat_get_wal_receiver
(2 行记录)

# 正常有个pg_watch_wal
select pg_switch_wal();

在这里插入图片描述

3.2.4检查点与日志管理

检查点是一个定期发生的数据库状态保存点,它确保所有在检查点之前提交的事务的更改都已写入数据文件。
在检查点期间,PostgreSQL会预估并准备下一个检查点周期所需的WAL段文件数,并基于前一个检查点周期中消耗的文件数量来进行文件保留或回收。
重要的参数包括max_wal_size(控制WAL目录的最大大小)和WAL_keep_segments(控制当前机器WAL日志文件最少保留个数)等。

3.2.5WAL核心参数
  • min_wal_size
    定义 :设置WAL文件保留的最小尺寸。在检查点(checkpoint)之后,用于保留未来循环使用的WAL文件。

默认值 :80MB(具体值可能因PostgreSQL版本和配置而异)。此值必须大于segment size的两倍,16M*2=32M

  • max_wal_size
    定义 :两个检查点(checkpoint)之间,WAL文件可增长的最大大小。

默认值 :无明确默认值,但通常会根据系统需求和性能进行调整。

  • wal_keep_segments
    定义 :控制WAL文件在达到max_wal_size后保留的秒数3。在达到最大尺寸后,旧的WAL文件会在这个时间后被删除,以释放空间。

默认值 :无明确默认值,但通常会根据系统需求和性能进行调整

当调整为20M小于32M会报错
在这里插入图片描述
在这里插入图片描述

4. WAL管理

4.1 WAL的基本概念

WAL是一种用于数据库系统以保证数据一致性和持久性的技术。在使用WAL的系统中,所有的修改在生效之前都要先写入log文件中。这些log文件通常包含了redo和undo信息,以便在系统崩溃或发生故障时,能够通过重新执行这些日志记录来恢复数据库到一致的状态。

4.2 WAL的管理策略

1.日志写入策略:

  • 对于对象的任何变更,都要首先记入日志。
  • 日志必须要先于对象被写入磁盘,以确保在发生故障时,日志记录能够作为恢复数据库的依据。

2.日志切换与归档:

  • 当WAL段文件被填满或达到预设的切换条件时,会触发日志切换,生成新的WAL段文件。
  • 在归档模式下,切换后的WAL段文件会被复制到归档区域进行保存,以便后续可能需要的数据恢复或分析。

3.日志删除与回收:

  • 旧的、不再需要的WAL段文件会被删除或回收,以释放存储空间。
  • 删除或回收的时机通常基于检查点的完成和预设的保留策略。

4.4 WAL日志大小变更步骤

停库
pg_resetwal -D $PGDATA --wal_segsize=64
启库

4.5 WAL自动清理场景

超过了max_wal_size
触发了检查点(手工、自动及超时)
正常停库

在这里插入图片描述
自动清理并不会直接删除对应的wal日志,它会重命名

4.6WAL归档日志

4.6.1WAL归档的定义

WAL归档是指将数据库系统中的WAL日志文件备份到指定的存储位置,以便在数据库系统发生故障时能够通过这些归档的日志文件进行数据恢复。

4.6.2 WAL归档的作用
  1. 数据恢复:在数据库系统发生故障时,可以通过归档的WAL日志文件恢复数据,确保数据的完整性和一致性。
  2. 在线备份:WAL归档支持在线备份,即在不停止数据库服务的情况下进行备份操作。
  3. 时间点恢复:通过归档的WAL日志文件,可以实现数据库的时间点恢复,即恢复到某个特定的时间点。
4.6.3 WAL归档的配置

在PostgreSQL等数据库系统中,WAL归档的配置通常涉及以下几个参数:

  1. wal_level:决定了写入WAL的信息量。对于归档模式,通常需要将其设置为replica或更高的级别。
  2. archive_mode:用于设置是否开启归档模式。当设置为on时,表示开启归档模式。
  3. archive_command:指定归档WAL日志的命令。该命令通常是一个shell脚本或命令,用于将WAL日志文件复制到指定的存储位置。
# - Archiving -

#archive_mode = off		# enables archiving; off, on, or always
				# (change requires restart)
#archive_command = ''		# command to use to archive a logfile segment
				# placeholders: %p = path of file to archive
				#               %f = file name only
				# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0		# force a logfile segment switch after this
				# number of seconds; 0 disables
4.6.4 WAL归档的流程
  1. 生成WAL日志文件:数据库系统在执行事务时,会先将变更写入WAL日志缓冲区,然后在适当的时候将其刷新到WAL日志文件中。
  2. 触发归档操作:当WAL日志文件达到一定大小或满足其他归档条件时,数据库系统会触发归档操作。
  3. 执行归档命令:数据库系统执行配置的archive_command命令,将WAL日志文件复制到指定的存储位置。
  4. 更新状态信息:归档操作完成后,数据库系统会更新相关的状态信息,以便后续的恢复操作。
4.6.5 WAL归档的注意事项
  1. 存储空间:归档的WAL日志文件会占用大量的存储空间,因此需要合理规划存储资源。
  2. 备份策略:建议定期备份归档的WAL日志文件,以防止数据丢失。
  3. 监控和报警:建议对WAL归档过程进行监控,并在出现异常时及时报警和处理。
  4. 恢复测试:定期进行数据恢复测试,以确保归档的WAL日志文件能够正常用于数据恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910524.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开放寻址法、链式哈希数据结构详细解读

一、开放寻址法(Open Addressing) 1. 定义 开放寻址法是一种哈希冲突解决策略,所有元素都存储在哈希表中。当发生冲突时,即两个键计算出的哈希值相同时,会按照一定的探查序列查找下一个可用的位置来存储新元素。 2.…

算法通关(4)-- 前缀树

前缀数原理和代码 原理 前缀树(Trie树),也称为字典树,是一种用于高效存储和检索字符串的数据结构。它是一种树形结构,能够利用字符串的公共前缀来减少存储空间和查询时间。 现在有“acb”,"cba","ac…

CSS3新增渐变(线性渐变、径向渐变、重复渐变)

1.线性渐变 代码: 效果图: 使文字填充背景颜色: 效果图: 2.径向渐变 代码: 效果图: 代码图: 效果图: 3.重复渐变 代码: 效果图:

Python 学习完基础语法知识后,如何进一步提高?

入门Python后,就可以拿些小案例练手了,这时候千万不要傻乎乎地成天啃语法书。 编程是一门实践的手艺,讲究孰能生巧。不管是去手撸算法、或者照葫芦画瓢写几个小游戏都可以让你的Python突飞猛进。 之前看github比较多,推荐给大家…

blender导入的图片渲染看不见,图片预览正常,但渲染不出

在使用Blender时,我们经常会遇到导入图片后在预览渲染中显示,但在实际渲染时图片消失的问题。本文将提供详细的解决方法,帮助大家解决“Blender导入的图片渲染图像不显示”的问题。 问题原因 导入的图片在Blender中只是一张图,并…

【数据结构】选择排序——选择排序 和 堆排序

选择排序 和 堆排序 一、选择排序选择排序的思路及其代码选择排序的弊端 二、堆排序三、速度对比同时排10000个数同时排100000个数同时拍500000个数堆排 1 亿个数 一、选择排序 选择排序的思路及其代码 选择排序思路很简单 就是经过将数组遍历选择最小值 将最小值位置的数与数…

Docker在CentOS上的安装与配置

前言 随着云计算和微服务架构的兴起,Docker作为一种轻量级的容器技术,已经成为现代软件开发和运维中的重要工具。本文旨在为初学者提供一份详尽的指南,帮助他们在CentOS系统上安装和配置Docker及相关组件,如Docker Compose和私有…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据存储分区的艺术与实践(下)(2/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

CLIP论文CLIP 改进工作串讲

文章目录 CLIPViLTCLIP 改进工作串讲Lseg(Language -driven semantic segmentation)Group ViT(Semantic Segmentation Emerges from Text Supervision)ViLDGLIP_V1/V2(Ground Language-Image Pre-train)CLIP PassoCLIP…

C++:set详解

文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同,STL总…

【静态页面】尚品汇 1、设计稿分析及资源准备

目录 1. 准备工作2. 理解设计3. 规划项目结构 1. 准备工作 安装必要的工具:确保你的开发环境已经准备好,包括文本编辑器(如 VSCode)、浏览器等。获取设计文件:获取UI设计稿或者设计文件链接,并确保可以访问…

小时收入:衡量工作效率与个人自由的标准

小时收入,就是按照小时来计算一个人的收入。比如,一个月一共工作200小时,获得的总收入是20000元,那么小时收入就是100元/小时。 小时收入可以反应一个人的赚钱效率。 可能两个人的月收入一样,但是付出的总工作时间不…

RFID文件柜在文件管理中的作用

一、RFID文件柜系统概述 1.1 RFID技术简介 RFID(Radio Frequency Identification,无线射频识别)技术是一种非接触式的自动识别技术,它通过无线电讯号识别特定目标并读写相关数据,无需识别系统与特定目标之间建立机械…

mysql代码生成器

项目 pom 文件内容 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…

域控操作二十四:主域故障辅域接替

模拟环境&#xff1a;上海DC1故障无法开机&#xff0c;导致只有一个DNS的电脑无法上网&#xff08;实际可以添加DC2但是为了实验就不说了&#xff09; FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

Redis(2):内存模型

一、Redis内存统计 工欲善其事必先利其器&#xff0c;在说明Redis内存之前首先说明如何统计Redis使用内存的情况。 在客户端通过redis-cli连接服务器后&#xff08;后面如无特殊说明&#xff0c;客户端一律使用redis-cli&#xff09;&#xff0c;通过info命令可以查看内存使用情…

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…

泷羽sec学习打卡-shodan扫描4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于shodan的那些事儿-4 一、shodan4如何查看公网ip&#xff1f;如何查看自己的ip&#xff1f;如何查看出…

abap 可配置通用报表字段级日志监控

文章目录 1.功能需求描述1.1 功能1.2 效果展示2.数据库表解释2.1 表介绍3.数据库表及字段3.1.应用日志数据库抬头表:ZLOG_TAB_H3.2.应用日志数据库明细表:ZLOG_TAB_P3.3.应用日志维护字段配置表:ZLOG_TAB_F4.日志封装类5.代码6.调用方式代码7.调用案例程序demo1.功能需求描述 …