Hubert 'depesz' Lubaczewski:在给定的WAL LSN范围内哪些表被修改?

💡 原文英文,约1900词,阅读约需7分钟。
📝

内容提要

数据库故障转移导致CDC工具未能解码并发送给Debezium的WAL数据。需要查看WAL流中是否有未被看到的表被修改,并获取其ID/位置。数据量约为3kB。获取WAL文件名称可用于进一步处理。

🔎

延伸解读

WAL范围与文件定位

文章通过计算两个LSN的差值(约3kB)来评估需要检查的WAL数据量。使用pg_walfile_name函数可以确定这些LSN落在哪个WAL文件中,本例中起始和结束LSN位于同一个文件,简化了后续操作。如果起始LSN不同,可能需要多个WAL文件,且文件可能位于pg_wal目录或需要从归档中恢复。

使用pg_waldump解析WAL内容

pg_waldump是解析WAL文件的关键工具,通常位于PostgreSQL安装目录的bin子目录下。通过指定--start和--end参数以及WAL文件名,可以输出指定范围内的所有WAL记录。输出中包含资源管理器类型(如Heap、Heap2)、事务ID、LSN、描述和块引用等信息,其中Heap/Heap2行与表修改直接相关。

从WAL记录识别被修改的表

在pg_waldump输出中,关注描述以DELETE、INSERT、UPDATE、HOT_UPDATE等开头的Heap记录,这些代表数据修改操作。每条记录末尾的rel字段包含三个数字:表空间OID、数据库OID和关系文件节点(relfilenode)。通过查询pg_database和pg_class可以分别解析出数据库名和表名(需在对应数据库中执行)。注意,如果记录前缀是Heap,则关系是表;如果是Btree等,则是索引。

潜在复杂性与限制

如果表在LSN范围之后被重写(如CLUSTER、VACUUM FULL或某些ALTER TABLE操作),其relfilenode会改变,导致无法通过当前pg_class查询到原表名。此外,尝试获取具体行数据(如主键)可能很复杂,因为行可能已被更新,且使用pageinspect扩展也可能遇到问题。因此,建议在故障切换后尽快进行检查,以避免此类复杂性。

❓

Q&A

数据库故障转移后,如何确认哪些表被修改?

可以通过查询WAL流中未被Debezium看到的表及其ID/位置来确认被修改的表。

如何获取WAL文件的名称?

可以使用查询 `SELECT pg_walfile_name('起始LSN')` 和 `SELECT pg_walfile_name('结束LSN')` 来获取WAL文件的名称。

WAL文件可能存放在哪里?

WAL文件可能在pg_wal目录中,也可能需要从WAL归档中恢复。

如何使用pg_waldump查看WAL内容?

可以使用命令 `pg_waldump --start=起始LSN --end=结束LSN WAL文件名` 来查看指定范围内的WAL内容。

如何判断WAL记录的修改操作类型?

可以通过查看WAL记录中的描述字段,识别操作类型,如DELETE、INSERT、UPDATE等。

如果表在LSN范围内被重写,会有什么影响?

如果表在LSN范围内被重写,可能会导致查找变得复杂,因为其relfilenode会改变。

🏷️

标签

➡️

继续阅读