一、简介

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

二、wal内部

WAL是自动被启用的。除了确保满足WAL日志存放所需要的磁盘空间以及一些必要的调优外,管理员无需执行任何操作。当每个新记录被写入时,WAL记录被追加到WAL日志中。 插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量, 随每个新记录单调递增。WAL日志被存放在数据目录的pg_wal目录里,它是作为一个文件段的集合存储的,通常每个段16MB大小(不过这个大小可以通过initdb配置选项--with-wal-segsize来修改)。每个段分割成多个页,通常每个页为8K。段文件的名字是不断增长的数字,从000000010000000000000001开始。目前这些数字不能回卷。

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

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

pg_control很小(比一个磁盘页小),因此它不会出现页断裂问题, 并且到目前为止还没有发现仅仅由于无法读取pg_control本身导致数据库失败的报告。 因此,尽管这在理论上是一个薄弱环节,但是pg_control看起来似乎并不是实际会发生的问题。

三、分析示例

1、展示 STARTSEG 到 ENDSEG 的事务日志

2、日志参数介绍

rmgr : 资源名称

lsn: 0/0162D3F0 日志编号
prev 0/0162D3B8
desc : 对日志详细信息的描述
xid 事务id
3、连接数据库,表中插入数据

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

发现插入数据后,wal 日志会先进入资源等待 rmgr: Standby ,分配一个事务id  15718 ,进入rmgr: Heap,把插入事务写入到指定日志偏移位置 desc: INSERT off 5  ,进入索引资源 rmgr: Btree ,插入索引 desc: INSERT_LEAF off 3,分配下一事务id RUNNING_XACTS nextXid 15720 latestCompletedXid 15719 oldestRunningXid 15720
4、执行 update 语句

查看日志

发现此时 desc:  UPDATE off 1 xmax 15725 ; 事务日志已经写入,desc: COMMIT 2022-02-14 00:37:59.569893 PST 完成提交

5、执行delete语句

查看日志

发现此时descDELETE off 15  KEYS_UPDATED 写入日志,desc:COMMIT 2022-02-14 00:42:00.195505 PST事务提交

6、显示事务回滚

查看日志

发现此时 desc: ABORT 2022-02-14 00:46:03.515257 PST 事务已经取消

7、创建数据库

查看日志

四、pg_waldump参数

pg_waldump --help pg_waldump decodes and display

PostgreSQL write-ahead logs for debugging.

Usage:   pg_waldump [OPTION]... [STARTSEG [ENDSEG]]

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

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

Options:

-b, --bkp-details      输出有关备份块的细节。

-e, --end=RECPTR       在指定的日志位置停止读取,而不是一直读取到日志流的末尾。

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

-n, --limit=N          显示指定数量的记录,然后停止。

-p, --path=PATH        要在哪个目录中寻找日志段文件。默认是在当前目录的pg_xlog 子目录中搜索。

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

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

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

-V, --version          打印pg_xlogdump版本并且退出。

-x, --xid=XID         只显示用给定事务 ID 标记的记录。

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

-?, --help             show this help, then exit

Postgresql通过pg_waldump来分析pg_wal日志的更多相关文章

  1. 烂泥:利用awstats分析nginx日志

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 昨天把nginx的日志进行了切割,关于如何切割nginx日志,可以查看<烂泥:切割 ...

  2. 用OSSIM轻松分析网络设备日志

    用OSSIM轻松分析网络设备日志 基于插件的日志收集与处理模式,使得用户可以轻松的利用OSSIM来分析异构网络环境下的各种网络设备日志,下面展示一些硬件设备日志的实例,我们在RAW LOG界面里,搜索 ...

  3. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  4. elk实战分析nginx日志文档

    elk实战分析nginx日志文档 架构: kibana <--- es-cluster <--- logstash <--- filebeat 环境准备:192.168.3.1 no ...

  5. PHP性能分析 - ngnx日志分析

    最终结果展示图: 图解:响应时间在40ms以内的请求数占请求总量的7%,40到80ms的的请求数占32.9%,依次类推... 性能问题有很多种可能,普通的情况通过xhprof可查得主要的性能损耗.但有 ...

  6. web后门排查与高效分析web日志技巧

    今年一直大大小小的事情忙,很少有时间能静下心写个文章,所以最近博客更新也越来越少了,公司现在安全团队在我这边,一直在玩命的招人.下个月8号有一个互联网金融的会,4月在qcon北京站,都以嘉宾的身份去分 ...

  7. elk+redis分布式分析nginx日志

    一.elk套件介绍 ELK 由 ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.官方网站: https://www.elastic.co/products El ...

  8. elk平台分析nginx日志的基本搭建

    一.elk套件介绍 ELK 由 ElasticSearch . Logstash 和 Kiabana 三个开源工具组成.官方网站: https://www.elastic.co/products El ...

  9. 一天,python搞个分析NGINX日志的脚本

    准备给ZABBIX用的. 统计接口访问字次,平均响应时间,4XX,5XX次数 以后可以再改进.. #!/usr/bin/env python # coding: utf-8 ############# ...

  10. 用c#读取并分析sql2005日志

    用过logExplorer的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692. ...

随机推荐

  1. Ubuntu 22.04 搭建K8s集群

    目录 1. 虚拟机基础配置 配置静态ip 设置主机名 设置hosts 安装ssh 2. Ubuntu系统设置 禁用swap 修改内核参数 3. 安装containerd 4. 安装Kubernetes ...

  2. Qt操作Json小结

    Qt操作Json 1.QJsonDocument 1.详细说明 QJsonDocument类提供了读写JSON文档的方法. QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF ...

  3. Law of Iterated Expectations & Covariance

    Law of Iterated Expectations \(E[Y] = E_X[E[Y |X]].\) The notation \(E_X[.]\) indicates the expectat ...

  4. 区块链特辑——solidity语言基础(三)

    Solidity语法基础学习 五.映射类型: 映射型态 Mapping Type 映射钥匙Key → 真实资料 Value mapping(KeyType → ValueType) VariableN ...

  5. [Unity]限制两个物体之间的距离

    //限制两个物体之间的距离 if (Vector3.Distance(B.position, A.position) > maxDistance) { //获得两个物体之间的单位向量 Vecto ...

  6. Java入门与进阶 P-2.1+P-2.2

    比较运算符 关系运算符(relational operators)也可以称为"比较运算符",用于用来比较判断两个变量或常量的大小.关系运算符是二元运算符,运算结果是 boolean ...

  7. Vue.js 前端项目在常见 Web 服务器上的部署配置

    Web 服务器是一种用于存储,处理和传输Web内容的软件.它是一种特殊类型的服务器,具有处理 HTTP 请求并向浏览器返回 Web 页面和其他内容的能力.Web服务器支持多种编程语言,如 PHP,Ja ...

  8. mysql 错误解决大法 Specified key was too long; max key length is 767 bytes

    高版本mysql向低版本(5.7以下)导入sql时可能会发生此问题 开启索引最大长度 SET GLOBAL INNODB_LARGE_PREFIX = ON; 将表改为动态表SET GLOBAL in ...

  9. C++ 从数组中拿值,每个值不相同

    代码和思路 原理就是生成0,n个索引,每个索引不相同即可. 索引再到数组拿数据就行 #include <iostream> #include <vector> #include ...

  10. LeetCode_单周赛_328

    6291. 数组元素和与数字和的绝对差 代码 模拟即可 class Solution { public int differenceOfSum(int[] nums) { int ans = 0; i ...