前奏
WalMiner是从PostgreSQL的WAL(write ahead logs)日志的解析工具,旨在挖掘wal日志所有的有用信息,从而提供PG的数据恢复支持。如果出现业务误操作DML的情况,可以及时挽回数据。
1.1 安装WalMiner
make: opt/rh/llvm-toolset-7/root/bin/clang: Command not found
make: *** [pg_logminer.bc] Error 127复制
cd app/pg/pg_156_5432/postgresql/lib/postgresql/pgxs/src/makefiles/
vi pgxs.mk
#ifeq ($(with_llvm), yes)
#all: $(addsuffix .bc, $(MODULES)) $(patsubst %.o,%.bc, $(OBJS))
#endif
#ifeq ($(with_llvm), yes)
# $(foreach mod, $(MODULES), $(call install_llvm_module,$(mod),$(mod).bc))
#endif # with_llvm
#ifeq ($(with_llvm), yes)
# $(call install_llvm_module,$(MODULE_big),$(OBJS))
#endif # with_llvm
#ifeq ($(with_llvm), yes)
# $(foreach mod, $(MODULES), $(call uninstall_llvm_module,$(mod)))
#endif # with_llvm
#ifeq ($(with_llvm), yes)
# $(call uninstall_llvm_module,$(MODULE_big))
#endif # with_llvm复制
1.2 重新编译,记得刷新postgresql环境变量
/usr/bin/mkdir -p '/app/pg/pg_156_5432/postgresql/lib/postgresql'
/usr/bin/mkdir -p '/app/pg/pg_156_5432/postgresql/share/postgresql/extension'
/usr/bin/mkdir -p '/app/pg/pg_156_5432/postgresql/share/postgresql/extension'
/usr/bin/install -c -m 755 walminer.so '/app/pg/pg_156_5432/postgresql/lib/postgresql/walminer.so'
/usr/bin/install -c -m 644 .//walminer.control '/app/pg/pg_156_5432/postgresql/share/postgresql/extension/'
/usr/bin/install -c -m 644 .//walminer--1.0.sql '/app/pg/pg_156_5432/postgresql/share/postgresql/extension/'复制
1.3 进库创建
postgres=# create extension walminer;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+-----------------------------------------------------------
pg_stat_statements | 1.7 | public | track execution statistics of all SQL statements executed
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
telepg_monitor | 2.7.6 | public | Expansion monitoring module
walminer | 1.0 | public | inspect the contents of database pages at a low level复制
解析步骤
2.1 添加要解析的wal日志文件
postgres=# select walminer_wal_add('/app/pg/data_156_5432/data/pg_wal');
NOTICE: Get data dictionary from current database.
walminer_wal_add
---------------------
13 file add success
(1 row)复制
2.2 查看可以解析的文件
postgres=# select walminer_wal_list();
walminer_wal_list
---------------------------------------------------------------
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000001)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000002)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000003)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000004)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000005)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000006)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000007)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000008)
(/app/pg/data_156_5432/data/pg_wal/000000010000000000000009)
(/app/pg/data_156_5432/data/pg_wal/00000001000000000000000A)
(/app/pg/data_156_5432/data/pg_wal/00000001000000000000000B)
(/app/pg/data_156_5432/data/pg_wal/00000001000000000000000C)
(/app/pg/data_156_5432/data/pg_wal/00000001000000000000000D)
(13 rows)复制
2.3 解析wal
postgres=# select walminer_start('null','null',0,0);
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000001
NOTICE: wal record after time 2022-02-24 18:17:44+08 or 0/166aff0 will be analyse completely
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000002
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000003
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000004
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000005
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000006
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000007
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000008
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/000000010000000000000009
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/00000001000000000000000A
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/00000001000000000000000B
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/00000001000000000000000C
NOTICE: Change Wal Segment To:/app/pg/data_156_5432/data/pg_wal/00000001000000000000000D
walminer_start
---------------------
walminer sucessful!
(1 row)复制
2.4 查看解析结果
postgres=# select * from walminer_contents;
-[ RECORD 1 ]-----+-------------------------------------------------------------
xid | 609
virtualxid | 1
timestamptz | 2022-06-13 16:25:42.259986+08
record_database | postgres
record_user | root
record_tablespace | pg_default
record_schema | public
op_type | INSERT
op_text | INSERT INTO "public"."test"("id") VALUES(1);
op_undo | DELETE FROM "public"."test" WHERE "id"=1 AND ctid = '(0,1)';
lsn | 0/DAA6138
commit_end_lsn | 0/DAA61A8复制
walminer_contents字段含义:
sqlno int, --本条sql在其事务内的序号; xid bigint, --事务ID; topxid bigint, --如果为子事务,这是是其父事务;否则为0; sqlkind int, --sql类型1->insert;2->update;3->delete(待优化项目); minerd bool, --解析结果是否完整(缺失checkpoint情况下可能无法解析出正确结果); timestamp timestampTz, --这个SQL所在事务提交的时间; op_text text, --sql; undo_text text, --undo sql; complete bool, --如果为false,说明有可能这个sql所在的事务是不完整解析的; schema text, --目标表所在的模式; relation text, --目标表表名; start_lsn pg_lsn, --这个记录的开始LSN; commit_lsn pg_lsn --这个事务的提交LSN。
2.5 结束walminer操作
select walminer_stop();
复制
常规操作
select walminer_by_time(starttime, endtime);
复制
select walminer_by_xid(xid,'true',reloid);
复制
注:'true'和‘false’代表是否为精确解析模式,reloid为目标表的oid(注意不是relfilenode)
适用性
4.2 使用注意事项
1)walminer对DDL支持力度不大,很多无法解析,不建议作为解析DDL依靠。 2)walminer版本有三个,建议用2.0,telepg12.4不支持3.0。 3)PG11/PG12中WAL文件大小必须16MB。

本文作者:饶茂林(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
明明想执行的SQL是DELETE、UPDATE,但为什么看到的是SELECT(FDW的实现原理解析)
小满未满、
373次阅读
2025-03-19 23:11:26
PostgreSQL初/中/高级认证考试(3.15)通过考生公示
开源软件联盟PostgreSQL分会
335次阅读
2025-03-20 09:50:36
IvorySQL 4.4 发布 - 基于 PostgreSQL 17.4,增强平台支持
通讯员
216次阅读
2025-03-20 15:31:04
命名不规范,事后泪两行
xiongcc
194次阅读
2025-03-13 14:26:08
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
182次阅读
2025-04-07 12:14:29
55.HarmonyOS NEXT 登录模块开发教程(九):部署与发布
若城
173次阅读
2025-03-13 21:13:14
PG vs MySQL 执行计划解读的异同点
进击的CJR
137次阅读
2025-03-21 10:50:08
版本发布| IvorySQL 4.4 发布
IvorySQL开源数据库社区
126次阅读
2025-03-13 09:52:33
openGauss 7.0.0-RC1 版本正式发布!
Gauss松鼠会
124次阅读
2025-04-01 12:27:03
PostgreSQL分区管理扩展——pg_partman
chirpyli
109次阅读
2025-03-19 15:48:31