WAL日志

news2024/12/26 18:53:49

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日志文件能够正常用于数据恢复。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习:1658. 将 x 减到 0 的最小操作数

题目链接:1658. 将 x 减到 0 的最小操作数 这道题目的意思就是,给定一个整数数组,和一个x,只能从数组最左边或者最右边进行删除,使得x恰好等于0,并且要操作次数最少的情况,否则返回-1. 这道题直…

51c大模型~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/11599989 #关于大模型「越狱」的多种方式 此项目是由伊利诺伊大学香槟分校(UIUC)的汪浩瀚教授主导,汇集了多名intern的共同努力而成。长久以来,这个跨学科的团队一直在前沿科…

Vue前端开发之自定义动画样式

在上一小节中,我们介绍了动画的实现源于6个类别样式,它们的名称默认前缀是一个“v”字母或者指定的名称,如“sc”,其实,也可以不使用这些固定的类别样式,开发者可以自定义任意的类别样式,供动画…

数据库SQL学习笔记

第 1 章 绪论 1.1 数据库系统概述 1.1.1 四个基本概念 数据库系统(DBS) 定义:是指在计算机系统中引入数据库后的系统构成 构成:数据库,数据库管理系统(及其开发工具),应用系统,数据库管理员…

前端好用的网站分享——CSS(持续更新中)

1.CSS Scan 点击进入CSS Scan CSS盒子阴影大全 2.渐变背景 点击进入color.oulu 3.CSS简化压缩 点击进入toptal 4.CSS可视化 点击进入CSS可视化 这个强推,话不多说,看图! 5.Marko 点击进入Marko 有很多按钮样式 6.getwaves 点击进入getwaves 生…

云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例

云集电商,一家聚焦于社交电商的电商公司,专注于‘精选’理念,致力于为会员提供超高性价比的全品类精选商品,以“批发价”让亿万消费者买到质量可靠的商品。面对近年来外部环境的变化,公司对成本控制提出了更高要求&…

软考高级架构 - 8.3 - ATAM方法架构评估实践 - 超详细讲解+精简总结

总结: ATAM时评估架构的质量属性方法,帮助权衡和识别风险,分为四个阶段。 阶段1——演示 介绍ATAM方法,介绍软件商业目标和关键需求,详细介绍要被评估的架构。 阶段2——调查和分析 深入分析系统架构,评估…

Redis - Hash 哈希

一、基本认识 ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数 组、映射。在Redis中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如key"key",value{{ field1, v…

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

岛屿数量 广搜版BFS C#

和之前的卡码网深搜版是一道题 力扣第200题 99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。…

动态规划 之 路径问题 算法专题

一. 不同路径 不同路径 状态表示 dp[i][j] 表示走到[i][j]位置, 有几种不同的路径状态转移方程 以离[i][j] 最近的位置划分问题 1.从[i - 1][j] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i - 1][j]位置的不同路径数相同, 即dp[i][j] dp[i - 1][j] 2.从[i][j - 1] 到[i…

别名路径联想设置

如何使用/进行路径提示? 找到jsconfig.json文件,如何项目中没有的话,自行创建 {"compilerOptions": {"paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dis…

40V耐压 降压恒压芯片 SL3061替换XL4301 支持2.5A电流 内置MOS管

一、基本性能参数对比 二、替换可行性分析 耐压能力:SL3061的耐压能力为40V,而XL4301的工作电压范围为8V至40V,最大耐压可能更高(达到45V)。在多数应用场景下,SL3061的耐压能力应能满足需求,但…

字节青训-小D的 abc 变换问题

问题描述 小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换: 将 a 变成 bc将 b 变成 ca将 c 变成 ab 小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。 例如:对于初…

设计模式09-行为型模式2(状态模式/策略模式/Java)

5.4 状态模式 5.4.1 状态模式的定义 1.模式动机:有些对象具有多种状态,这些状态在某些情况下能够相互转换,对象在不同的状态下将具有不同的行为,将拥有状态的对象中和状态的行为分离。 2.模式定义:允许一个对象在其…

Postman上传图片如何处理

打开Postman,创建一个新的请求 URL: http://90.104.232.49:80/dev-api/appcommon/upload 如果有解密进入上传就在请求头添加 点击“Body”选项卡。 选择“form-data”类型。 在“KEY”列中输入文件字段的名称,例如file。 在“VALUE”列中&#xff0…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree?1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

MongoDB Shell 基本命令(三)聚合管道

管道含义 类似Linux中的管道,前一个命令的输出作为后一个命令的输入。 显示网络连接、路由表和网络接口统计信息 netstat -ano -netstat:network statistics 网络统计 -a:显示所有连接和监听端口,包括所有活动的TCP和UDP连接。 -n:以数字形式显示地址…

2024年10月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2024年10月国产数据库大事件和重要产品发布消息。 目录 2024年10月国产数据库大事记 TOP102024年10月国产数据库大事记(时间线)产品/版本发布代表厂商大事记信创数据库上市公司2024年Q3财报 达梦数据:2024年前三季度…

SQL Server 日志记录

SQL Server是一个关系数据库管理系统(RDBMS),旨在有效地存储、组织、检索和操作大量结构化数据。SQL Server日志是监控数据库活动、排查问题和确保数据一致性的基础,这些日志记录了SQL Server实例中发生的事件的时间顺序。它们充当…