PG中通过pg_waldump来分析pg_wal日志

0    795    1

Tags:

👉 本文共约4167个字,系统预计阅读时间或需16分钟。

简介

读取MySQL的binlog 并将其解析为可读的日志是一件简单的事情,mysqlbinlog 命令就可以将bin日志解析, 那postgresql是否可以将pg_wal 中的日志进行解析,并且提供一些特殊的功能,例如想查询某个时间短插入的数据量。pg_waldump 可以解决这个问题,通过pg_waldump来解析pg_wal 日志来分析和解决一些问题。

pg_waldump 是PG 内部用来对 wal日志进行查看的命令,值需要pg_waldump执行命令对于要读取的日志有只读的权限即可。

在 pg_wal 中日志是有管理类型的,也就是日志记录的东西是什么的标签。

  • 展示 wal 中所有的资源管理名称

WAL内部

WAL是自动被启用的。除了确保满足WAL日志存放所需要的磁盘空间以及一些必要的调优外(参阅第 29.4 节),管理员无需执行任何操作。

当每个新记录被写入时,WAL记录被追加到WAL日志中。 插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量, 随每个新记录单调递增。LSN值作为数据类型 pg_lsn返回。 值可以进行比较以计算分离它们的WAL数据量,因此它们用于衡量复制和恢复的进度。

WAL日志被存放在数据目录的pg_wal目录里,它是作为一个文件段的集合存储的,通常每个段16MB大小(不过这个大小可以通过initdb配置选项--with-wal-segsize来修改)。每个段分割成多个页,通常每个页为8K(该尺寸可以通过--with-wal-blocksize配置选项来修改)。日志记录头部在access/xlogrecord.h里描述;日志内容取决于它记录的事件类型。段文件的名字是不断增长的数字,从000000010000000000000001开始。目前这些数字不能回卷,不过要把所有可用的数字都用光也需要非常非常长的时间。

日志被放置在和主数据库文件不同的另外一个磁盘上会比较好。你可以通过把pg_wal目录移动到另外一个位置(当然在此期间服务器应当被关闭),然后在原来的位置上创建一个指向新位置的符号链接来实现重定位日志。

WAL的目的是确保在数据库记录被修改之前先写了日志,但是这可能会被那些谎称向内核写成功的破坏, 这时候它们实际上只是缓冲了数据而并未把数据存储到磁盘上。 这种情况下的电源失效仍然可能导致不可恢复的数据崩溃。 管理员应该确保保存PostgreSQL的WAL日志文件的磁盘不会做这种谎报(参见第 29.1 节)。

在完成一个检查点并且刷写了日志文件之后,检查点的位置被保存在文件pg_control里。因此在恢复的开始, 服务器首先读取pg_control,然后读取检查点记录; 接着它通过从检查点记录里标识的日志位置开始向前扫描执行 REDO操作。 因为数据页的所有内容都保存在检查点之后的第一个页面修改的日志里(假设full_page_writes没有被禁用), 所以自检查点以来的所有变化的页都将被恢复到一个一致的状态。

为了处理pg_control被损坏的情况, 我们应该支持对于现有日志段反向扫描的功能 — 从最新到最老 — 这样才能找到最后的检查点。但这些目前还没有被实现。pg_control很小(比一个磁盘页小),因此它不会出现页断裂问题, 并且到目前为止还没有发现仅仅由于无法读取pg_control本身导致数据库失败的报告。 因此,尽管这在理论上是一个薄弱环节,但是pg_control看起来似乎并不是实际会发生的问题。

示例

  • 展示 STARTSEGENDSEG 的事务日志

  • 日志参数介绍

连接数据库,表中插入数据

查看此时 wal 日志,如果没有日志则通过手动切换select pg_switch_wal()

INSERT off 9 可以看到我们刚刚执行的sql 有日志记录,并且事务的提交,COMMIT 2021-09-26 15:47:47.340016 CST 提交事务

执行 update 语句

查看此时的日志

发现此时 desc: HOT_UPDATE off 9 xmax 569 ; 事务日志已经写入,desc: COMMIT 2021-09-26 16:22:19.062823 CST 完成提交

执行删除sql

查看此时日志

发现此时desc: DELETE off 10 KEYS_UPDATED 写入日志,desc: COMMIT 2021-09-26 16:26:42.487533 CST事务提交

执行查询sql

查看此时日志

查看事务日志

创建数据库

查看日志

desc: COMMIT 2021-09-26 17:18:14.699518 CST; 发现创建数据库日志已经写入wal日志

使用 显示事务 进行插入数据

查看此时 wal日志

发现插入数据后,wal 日志会先进入资源等待 rmgr: Standby ,分配一个事务id 575 ,进入rmgr: Heap,把插入事务写入到指定日志偏移位置 desc: INSERT off 15 ,进入索引资源 rmgr: Btree ,插入索引 desc: INSERT_LEAF off 13,分配下一事务id
RUNNING_XACTS nextXid 576 latestCompletedXid 574 oldestRunningXid 575; 1 xacts: 575

显示事务回滚

查看此时 wal 日志

发现此时 desc: ABORT 2018-06-27 10:58:25.616921 CST 事务已经取消

pg_waldump

pg_waldump — 以人类可读的形式显示一个PostgreSQL 数据库集簇的预写式日志

大纲

pg_waldump [option...] [startseg [endseg]]

简介

pg_waldump显示预写式日志(WAL),它主要 用于调试或者教育目的。

这个工具只能由安装该服务器的用户运行,因为它要求对数据目录的只读访问。

选项

下列命令行选项控制输出的位置和格式:

  • startseg

    从指定的日志段文件开始读取。这也隐含地决定了要搜索文件的路径以及 要使用的时间线。

  • endseg

    在读取指定的日志段文件后停止。

  • -b --bkp-details

    输出有关备份块的细节。

  • -e *end* --end=*end*

    在指定的WAL位置停止读取,而不是一直读取到日志流的末尾。

  • -f --follow

    在到达可用 WAL 的末尾之后,保持每秒轮询一次是否有新的 WAL 出现。

  • -n *limit* --limit=*limit*

    显示指定数量的记录,然后停止。

  • -p *path* --path=*path*

    指定搜索日志段文件的目录或包含这些文件的包含pg_wal子目录的目录。 缺省值是在当前目录中搜索,当前目录的pg_wal子目录和 PGDATApg_wal子目录。

  • -q --quiet

    除错误外,不要打印任何输出。当您想知道一系列WAL记录是否可以成功解析但不关心记录内容时,此选项非常有用。

  • -r *rmgr* --rmgr=*rmgr*

    只显示由指定资源管理器生成的记录。如果把list作为资源管理器名称 传递给这个选项,则打印出可用资源管理器名称的列表然后退出。

  • -s *start* --start=*start*

    要从哪个WAL位置开始读取。默认是从找到的最早的文件的第一个可用日志记录开始。

  • -t *timeline* --timeline=*timeline*

    本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

    要从哪个时间线读取日志记录。默认是使用startseg(如果指定) 中的值,否则默认为 1。

  • -V --version

    打印pg_waldump版本并且退出。

  • -x *xid* --xid=*xid*

    只显示用给定事务 ID 标记的记录。

  • -z --stats[=record]

    显示概括统计信息(记录的数量和尺寸以及全页镜像)而不是显示 每个记录。可以选择针对每个记录生成统计信息,而不是针对每个 资源管理器生成。

  • -? --help

    显示有关pg_waldump命令行参数的帮助并且退出。

Environment

  • PGDATA

    数据目录;另请参阅 -p 选项。

  • PG_COLOR

    规定在诊断消息中是否使用颜色。可能的值为alwaysautonever

注解

当服务器正在运行时可能会给出错误的结果。

只有指定的时间线 会被显示(如果没有指定,则显示默认时间线)。 其他时间线上的记录会被忽略。

pg_waldump不能读取具有后缀.partial 的 WAL 文件。如果需要读取那些文件,需要从文件名中移除 .partial后缀。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

16 − 15 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部