Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug

[译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug

作者头像
yzsDBA
发布于 2023-02-26 05:11:02
发布于 2023-02-26 05:11:02
98400
代码可运行
举报
运行总次数:0
代码可运行

利用pg_walinspect对WAL事件进行debug

Write Ahead Log即WAL是Postgres的核心部件,存储着写操作,帮助实现其事务的原子性、一致性和持久性。因为是二进制格式存储,如果需要调试写入活动,不借助工具仅靠肉眼很难读取。幸运的是,从9.3版本开始出现了“人类可读”的格式显示WAL记录的工具pg_xlogdump/pg_waldump。该工具可解析WAL日志,解读出人们可读的格式。

PostgreSQL15发布了一种新方法。通过pg_walinspect扩展使用纯SQL语言查看WAL内部发生情况。该扩展允许更加方便地检查WAL记录,用于调试和报告,甚至用于探索Postgres如何工作。

体验下pg_walinspect

第一步当然是安装扩展:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# CREATE EXTENSION pg_walinspect;

该扩展允许我们检查2个有效的WAL日志序列号(LSN)之间的记录:start_lsnend_lsn。这些LSN可以通过pg_current_wal_lsn函数获取。

start_lsn可以通过下面方式获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# SELECT pg_current_wal_lsn(),now();
pg_current_wal_lsn |              now              
--------------------+-------------------------------
0/157BA88          | 2022-10-23 15:51:21.532482-03
(1 row)

我们为示例生成一些写入活动:CREATE TABLE-INSERT-DELETE操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# create table my_tab(i int, j text);
CREATE TABLE
postgres=# INSERT INTO my_tab VALUES(1,'1'),(2,'2');
INSERT 0 2
postgres=# DELETE FROM my_tab where i=1;
DELETE 1

以与start_lsn相同的方式获取end_lsn:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# SELECT pg_current_wal_lsn(),now();
pg_current_wal_lsn |              now              
--------------------+-------------------------------
0/157E768          | 2022-10-23 15:51:37.255149-03
(1 row)
pg_get_wal_record_info函数与提取的LSN0/157BA88和 0/157E768)结合一起使用:
postgres=# select start_lsn, end_lsn, xid, resource_manager, record_type, record_length, main_data_length, fpi_length, description::varchar(30) from pg_get_wal_records_info('0/157BA88', '0/157E768');
--- the whole output will be at the end in a linked file
start_lsn | end_lsn  | xid | resource_manager |  record_type  | record_length | main_data_length | fpi_length |          description           
-----------+-----------+-----+------------------+---------------+---------------+------------------+------------+--------------------------------
0/157BA88 | 0/157BAB8 |   0 | Storage          | CREATE        |            42 |               16 |          0 | base/5/16415
0/157BAB8 | 0/157BB90 | 747 | Heap             | INSERT        |           211 |                3 |          0 | off 16 flags 0x00
0/157BB90 | 0/157BBD0 | 747 | Btree            | INSERT_LEAF   |            64 |                2 |          0 | off 252
...
...
...
0/157E6E0 | 0/157E708 | 748 | Transaction      | COMMIT        |            34 |                8 |          0 | 2022-10-23 15:51:29.170343-03
0/157E708 | 0/157E740 | 749 | Heap             | DELETE        |            54 |                8 |          0 | off 1 flags 0x00 KEYS_UPDATED 
0/157E740 | 0/157E768 | 749 | Transaction      | COMMIT        |            34 |                8 |          0 | 2022-10-23 15:51:34.056308-03
(100 rows)

WAL详细程度

输出的详细程度取决于wal_level设置。从最低(minimal)到最高(logical)。本案例中使用默认值replica。第一印象是 wal 记录的数量很多:仅针对几个 SQL 操作就生成了 100 条记录。如果wal_level设置为logical,记录数会增加(如果设置为minimal则记录数当然会减少)。

另一个观察结果是并非所有记录都具有相同的长度。这就是为什么并非所有活动都对数据库具有相同权重或影响的原因。

一般统计

可以使用pg_get_wal_stats函数查看LSN间隔中的一般统计信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# select * from pg_get_wal_stats('0/157BA88', '0/157E768', true) order by count_percentage desc;
resource_manager/record_type | count | count_percentage | record_size | record_size_percentage | fpi_size | fpi_size_percentage | combined_size | combined_size_percentage 
------------------------------+-------+------------------+-------------+------------------------+----------+---------------------+---------------+--------------------------
Btree/INSERT_LEAF            |    65 |               65 |        4456 |     39.725416778104666 |        0 |                   0 |          4456 |       39.416187527642634
Heap2/MULTI_INSERT           |    10 |               10 |        3181 |     28.358741196398324 |        0 |                   0 |          3181 |        28.13799203892083
Heap/INSERT                  |     7 |                7 |        1299 |     11.580636533832575 |        0 |                   0 |          1299 |        11.49049093321539
Transaction/COMMIT           |     3 |                3 |        1161 |     10.350361059106714 |        0 |                   0 |          1161 |       10.269792127377267
Storage/CREATE               |     3 |                3 |         126 |      1.123294998662744 |        0 |                   0 |           126 |       1.1145510835913313
Heap/INPLACE                 |     2 |                2 |         376 |      3.352054916644379 |        0 |                   0 |           376 |       3.3259619637328615
Heap2/PRUNE                  |     2 |                2 |         180 |     1.6047071409467772 |        0 |                   0 |           180 |        1.592215833701902
Standby/LOCK                 |     2 |                2 |          84 |     0.7488633324418293 |        0 |                   0 |            84 |       0.7430340557275542
Btree/DELETE                 |     1 |                1 |          60 |     0.5349023803155925 |        0 |                   0 |            60 |       0.5307386112339673
Standby/RUNNING_XACTS        |     1 |                1 |          50 |      0.445751983596327 |        0 |                   0 |            50 |      0.44228217602830605
Heap/DELETE                  |     1 |                1 |          54 |     0.4814121422840332 |        0 |                   0 |            54 |       0.4776647501105705
Heap/HOT_UPDATE              |     1 |                1 |          80 |     0.7132031737541232 |        0 |                   0 |            80 |       0.7076514816452897
Heap/INSERT+INIT             |     1 |                1 |          61 |      0.543817419987519 |        0 |                   0 |            61 |       0.5395842547545334
XLOG/FPI                     |     1 |                1 |          49 |     0.4368369439244005 |       88 |                 100 |           137 |       1.2118531623175586
(14 rows)

在这种情况下,显示按resource_manager 和 record_type分组的统计信息。此外,由于Btree索引占用WAL大小最大,但没有在SQL语句示例中定义任何btree索引,因此这些活动可能与pg_class的索引有关。这有助于提醒我们索引维护如何在数据库中产生工作负载,如果将未使用的索引从数据库中删除,将有助于提高性能。该函数的输出将有助于了解什么活动最能生成记录wal,并检测到一些异常或解释服务器行为。

CREATE操作

现在让我们关注resource_manager 和 record_type 列,它们分别显示了 wal 类型的一种分类和具体的 wal 记录类型。有关每个含义的更多详细信息,请参见:Postgres 源代码中的rmgrlist.h和rmgrdesc文件头文件。

Storage/CREATE组合意味着创建了一个对象,但在这种情况下,这些组合出现了 3 次,而我们的测试只写了一次。这怎么可能?

如果我们查看描述列,可以看到创建对象的路径和 OID,如果我们分析这些路径,我们可以看到以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  relname,
  CASE 
    when relkind = 'r' then 'tab'
    when relkind = 'i' then 'idx'
    when relkind = 'S' then 'seq'
    when relkind = 't' then 'toast'
    when relkind = 'v' then 'view'
    when relkind = 'm' then 'matview'
    when relkind = 'c' then 'composite'
    when relkind = 'f' then 'F tab'
    when relkind = 'p' then 'part tab'
    when relkind = 'I' then 'part idx'
  END as object_type
FROM
    pg_class
  WHERE
    oid IN ('16415', '16418', '16419');
relname        | object_type 
----------------------+-------------
pg_toast_16415       | toast
pg_toast_16415_index | idx
my_tab               | tab
(3 rows)

注意:relkind 值可以在 pg_class 文档中找到

创建了具有相应索引的表和 TOAST 表,因此请记住,在幕后可能会发生许多对象的创建需要一些额外的数据来持久化。这适用于索引、TOAST 对象等实例,因此请注意某些对象可能会生成其他隐式对象,因此会产生一些额外的工作量。

事务个数

让我们看一下 xid 列,它代表事务编号。可以看到三个事务号747、748 和 749。这提醒我们,如果不指定事务的BEGIN和COMMIT/ROLLBACK块,Postgres是如何在事务中封装一个简单的SQL语句的。注意:在执行一些相关的 SQL 语句时,尽可能了解包括事务块(BEGIN…COMMIT/ROLLBACK)是有帮助的。包含一个事务的块可以避免浪费事务的 id,这最终将有助于达到环绕阈值限制并强制执行主动的 autovacuum。这种类型的 autovacuum 可能会直接影响数据库性能。此外,在每个事务结束时,可以看到一个Transaction/COMMIT组合和该事务结束的时间戳。

结论

新扩展提供了所有活动的有用信息,使PG内部正确工作成为可能,并帮助我们更多地了解PG的工作原理。允许我们仅通过使用SQL语句就能了解一些预期行为和其他不为人知的行为。例如索引维护活动的权重。将来,该扩展也许可以帮助我们审计和分析数据库工作流并产生漂亮有趣的报告。

原文

https://www.ongres.com/blog/debugging-postgres-wal-events-with-pg_walinspect/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL PG15 新功能 PG_WALINSPECT
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1250人左右 1 + 2 + 3 +4)新人会进入3群(即将关闭自由申请) 默认会进入4群
AustinDatabases
2023/09/06
3440
PostgreSQL  PG15 新功能 PG_WALINSPECT
PostgreSQL 通过pg_waldump 来分析pg_wal日志
读取MYSQL的binlog 并将其解析为可读的日志是一件简单的事情,mysqlbinlog 命令就可以将bin 日志解析, 那postgresql是否可以将pg_wal 中的日志进行解析,并且提供一些特殊的功能,如题目给出的,想查询某个时间短插入的数据量。
AustinDatabases
2021/09/26
2.6K0
[译]PG复制和自动故障转移--2
6)通过pg_waldump --path=/tmp/sd/pg_wal -start=0/1C420B8看下日志文件里内容。使用的是步骤3中的起始LSN。注意WAL中包含创建物理文件的指令:
yzsDBA
2022/04/28
7000
[译]PG复制和自动故障转移--2
AntDB基于WAL日志的DML数据闪回实现
AntDB数据库是一款国产自研的MPP架构的分布式数据库,高度兼容Oracle语法,在通信、金融、交通等多个行业应用广泛。用户在使用AntDB数据库的过程中,经常由于误操作、应用程序Bug等,导致了误删数据或者误更新数据,影响业务正常使用。误删数据不是某个数据库的个例,几乎所有的数据库都会遇到类似问题,并且大多数数据库都会提供一个【数据闪回】的工具,利用该工具可以快速恢复误操作数据。
用户9860216
2022/08/18
5540
PG 13新特性汇总
PostgreSQL 10 版本开始支持逻辑复制,在12版本之前逻辑复制仅支持普通表,不支持分区表,如果需要对分区表进行逻辑复制,需单独对所有分区进行逻辑复制。
AiDBA宝典
2023/08/09
1.3K0
PG 13新特性汇总
[译]PG复制和自动故障转移--1
将数据从一个服务器复制到另一个服务器的过程就是PG复制。源数据库服务器通常称为Master,而接收复制数据的数据库服务器称为Replica服务器。
yzsDBA
2022/04/27
1K0
[译]PG复制和自动故障转移--1
PG 14新特性汇总
从PG1开始,ALTER TABLE DETACH 支持 CONCURRENTLY,避免因ALTER TABLE DETACH忘记设置statement_timeout参数而长时间锁表。
AiDBA宝典
2023/08/09
9670
PG 14新特性汇总
[翻译]PG15新特性-加速WAL日志归档
PG15通过:一次扫描64个待归档的日志,将其放到一个数组中以供归档,当处理完这64个文件后,再进行下一次扫描。这样达到减少archive_status目录扫描次数提升性能的目的。
yzsDBA
2023/02/26
6450
[翻译]PG15新特性-加速WAL日志归档
《Postgresql 内幕探索》读书笔记 - 第一章:集簇、表空间、元组
PostgreSQL天然集群,多个集群可以组成集簇,有点类似军队的连、团、旅这样的组织规则。对于我们日常学习使用的单节点则是单个集簇单个集群,自己就是集群。
阿东
2023/06/27
6460
《Postgresql 内幕探索》读书笔记 - 第一章:集簇、表空间、元组
基于PostgreSQL流复制的容灾库架构设想及实现
这几天在对PostgreSQL流复制的架构进行深入研究,其中一个关键的参数:recovery_min_apply_delay引起了我的注意,设置该参数的大概意思是:在进行流复制的时候,备库会延迟主库recovery_min_apply_delay的时间进行应用。比如说,我们在主库上insert10条数据,不会立即在备库上生效,而是在recovery_min_apply_delay的时间后,备库才能完成应用。
数据和云
2021/07/09
9770
[译]解锁TOAST的秘密:如何优化PostgreSQL的大型列存储以最佳性能和可扩展性
解锁TOAST的秘密:如何优化PostgreSQL的大型列存储以最佳性能和可扩展性
yzsDBA
2023/02/26
2.3K0
[译]解锁TOAST的秘密:如何优化PostgreSQL的大型列存储以最佳性能和可扩展性
Postgresql存储结构
如果阅读过手册一定听过postgresql cluster的概念,第一次听到这个概念可能都会有一些困惑。cluster在安装数据库时,由initdb工具生成,initdb后产生的pgdata文件夹可以理解为cluster的物理存储结构。数据库启动、停止时pg_ctl -D参数指定的文件夹即cluster文件夹,所以一个PG Server可以运行在一个PG Cluster上。
mingjie
2022/05/12
1.2K0
Postgresql存储结构
[ES三周年]PostgreSQL数据的存储基础知识
OID 是 PostgreSQL 内部用于标识数据库对象(数据库,表**,视图,**存储过程等等)的标识符,用4个字节的无符号整数表示。它是PostgreSQL大部分系统表的主键。
宇宙无敌暴龙战士之心悦大王
2023/03/15
2.4K0
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
pg_rewind 相比 pg_basebackup 和 rsync 这样的工具来说,优势是它不需要从源目录拷贝所有的数据文件,而是会对比时间线发生偏离的点,只拷贝变化过的文件,这样对于数据量很大的情况下速度更快。
民工哥
2023/08/22
1.9K0
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试
PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。
AiDBA宝典
2021/07/29
3.3K0
PostgreSQL体系架构介绍
PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解。PostgreSQL的主要结构如下:
用户8006012
2022/07/26
2.3K0
PostgreSQL体系结构
原文:https://www.enmotech.com/web/detail/1/764/1.html
数据和云01
2019/07/31
1.1K0
PostgreSQL体系结构
[译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
获取PG服务产生的所有IO情况历来都是一个挑战。首先,PG将IO行为范围内为写WAL和读写数据目录(也就是数据文件)。真正的挑战是:理解围绕写入的二阶效应:通常数据的写入发生在事务提交后,即异步刷写,这就对理解哪个进程实际写入数据目录(以及何时)带来困难。
yzsDBA
2023/02/26
1K0
[译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2024/02/02
4600
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
史上最全PostgreSQL体系结构
墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。
数据和云
2019/07/22
4.1K0
史上最全PostgreSQL体系结构
相关推荐
PostgreSQL PG15 新功能 PG_WALINSPECT
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验