news 2026/6/11 19:51:55

数据库日志挖掘指导

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库日志挖掘指导

文章目录

  • 文档用途
  • 详细信息

文档用途

学习和使用数据库挖掘工具XlogMiner/WalMiner。

详细信息

1、介绍
WalMiner是从PostgreSQL的WAL(write ahead logs)日志中解析出执行的SQL语句的工具,并能生

成出对应的undo SQL语句。

referenceXlogMiner renamed to WalMiner

XlogMiner Enhancements Released and Renamed to WalMinerPosted on 2019-02-22 by Highgo Software

reference XLogMiner

reference WalMiner

注意:walminer是Highgo开源的一款软件。

2、walminer安装
1)配置要求

需要将数据库日志级别配置需要大于minimal

创建归档路径

mkdir /home/hgdb565/archive/ -p

必须设置如下三个参数,据库日志级别配置需要大于minimal

wal_level minimal, archive, hot_standby, or logical ,若想做最完整的日志挖掘,建议设

置为logical。

alter system set wal_level = ‘logical’;

alter system set archive_mode = on;

alter system set archive_directory = ‘/home/hgdb565/archive’;

修改后重启数据库生效。

2)版本查看

查看本机环境数据库版本

select kernel_version();

PG版本支持

PG9.5.0之前的版本没有做过测试

PG9.5.0~PG10.X版本使用WalMiner_10_X

PG11之后的版本使用WalMiner_11_X

3)编译安装

下载软件,读README.md参考安装和使用步骤。

下载地址:

WalMiner

unzip movead-XLogMiner-WalMiner_10_0_1.zip

cp -rpi ./XLogMiner/walminer/ ./postgresql-10.6/contrib/

cd ./postgresql-10.6/contrib/walminer

make && make install

make install

/bin/mkdir -p ‘/opt/pg106/lib/postgresql’

/bin/mkdir -p ‘/opt/pg106/share/postgresql/extension’

/bin/mkdir -p ‘/opt/pg106/share/postgresql/extension’

/bin/install -c -m 755 walminer.so ‘/opt/pg106/lib/postgresql/walminer.so’

/bin/install -c -m 644 ./walminer.control ‘/opt/pg106/share/postgresql/extension/’

/bin/install -c -m 644 ./walminer–1.0.sql ‘/opt/pg106/share/postgresql/extension/’

注意:将walminer目录放置到编译通过的PG源码的"…/contrib/"目录下

hgdb无源码编译目录。可在对应版本的pg中编译好,再将文件拷贝到hgdb的目录下。

cd /opt/pg106/share/postgresql/extension/

scp wal* hgdb565@x.x.6.10:/opt/HighGo5.6.5/share/postgresql/extension

cd /opt/pg106/lib/postgresql

scp walminer.so hgdb565@x.x.6.10:/opt/HighGo5.6.5/lib/postgresql/

4)创建扩展

创建walminer的extension

create extension walminer;

注意HGDBV5之前为: create extension xlogminer;

2、使用方法
场景一:从WAL日志产生的数据库中直接执行解析
1.创建walminer的extension

create extension walminer;
注意:已创建可忽略

2 Add wal日志文件

– 增加wal文件:

select walminer_wal_add(‘/opt/HighGo5.6.5/data/pg_wal’);

– 注:参数可以为目录或者文件

3 Remove wal日志文件

– 移除wal文件:

select walminer_wal_remove(‘/opt/HighGo5.6.5/data/pg_wal’);

– 注:参数可以为目录或者文件

4 List wal日志文件

– 列出wal文件:

select walminer_wal_list();

5 执行解析

select walminer_start(’START_TIMSTAMP’,’STOP_TIMESTAMP’,’START_XID’,’STOP_XID’)

—如果分析全部日志:

select walminer_start(‘null’,‘null’,0,0);

—将系统表修改结果输出到$PGDATA/walminer/temp下:

select walminer_start(‘null’,‘null’,0,0,true);

  • START_TIMESTAMP:指定输出结果中最早的记录条目,即从该时间开始输出分析数据;若该参数值为空,则以分析日志列表中最早数据开始输出;若该参数值指定时间没有包含在所分析xlog列表中,即通过分析发现全部早于该参数指定时间,则返回空值。

  • STOP_TIMESTAMP:指定数据结果中最晚的记录条目,即输出结果如果大于该时间,则停止分析,不需要继续输出;如果该参数值为空,则从START_TIMESTAMP开始的所有日志都进行分析和输出。

  • START_XID:作用与START_TIMESTAMP相同,指定开始的XID值;

  • STOP_XID:作用与STOP_TIMESTAMP相同,指定结束的XID

注意:两组参数只能有一组为有效输入,否则报错。

  1. 解析结果查看

select * from walminer_contents;
7 结束walminer操作

该函数作用为释放内存,结束日志分析,该函数没有参数。

select walminer_stop();

场景二:从非WAL产生的数据库中执行WAL日志解析
注意:要求执行解析的PostgreSQL数据库和被解析的为同一版本

于生产数据库
1.创建walminer的extension

create extension walminer;
2.生成数据字典

select walminer_build_dictionary(‘/opt/HighGo5.6.5/store_dictionary’);

– 注:参数可以为目录或者文件

于测试数据库

1.创建walminer的extension

create extension walminer;

将字典文件和日志传输到测试数据库

将父目录创建出来

mkdir -p /opt/pg106/data/archive_hgdb565

cd /opt/pg106/

scp pg10@x.x.6.12:/opt/HighGo5.6.5/store_dictionary .

copy wal or archive

cd /opt/pg106/data/archive_hgdb565

scp pg10@x.x.6.12:/opt/HighGo5.6.5/data/pg_wal/0* .

  1. load数据字典

select walminer_load_dictionary(‘/opt/pg106/store_dictionary’);

– 注:参数可以为目录或者文件

如出现一下错误,将父目录创建出来即可

postgres=# select walminer_load_dictionary(‘/opt/pg106/store_dictionary’);

ERROR: It is failed to create dictionary “/opt/pg106/data/walminer/temp”.

将父目录创建出来

mkdir -p /opt/pg106/data/walminer

  1. add wal日志文件

– 增加wal文件:

select walminer_wal_add(‘/opt/pg106/data/archive_hgdb565’);

– 注:参数可以为目录或者文件

  1. remove wal日志文件

– 移除wal文件:

select walminer_wal_remove(‘/opt/test/wal’);

– 注:参数可以为目录或者文件

  1. list wal日志文件

– 列出wal文件:

select walminer_wal_list();

– 注:参数可以为目录或者文件

  1. 执行解析

select walminer_start(‘null’,‘null’,0,0);
7. 解析结果查看

select * from walminer_contents;

select timestamptz,record_user,op_type,op_text,op_undo from walminer_contents where timestamptz >= ‘2020-05-12 14:10:00’::timestamp and timestamptz <= ‘2020-05-12 14:20:00’::timestamp and op_type=‘DELETE’;

timestamptz | record_user | op_type | op_text | op_undo

-------------------------------±------------±--------±-------------------------------------------------------------------------------------------±-----------------------------------------------------------


2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=1 AND “name”=‘4e4ff1685131a4cdc6643b523620e10f’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(1, '4e4f

f1685131a4cdc6643b523620e10f’);

2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=2 AND “name”=‘126ce4b149a49d1a68f6c2a0af4b2bdd’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(2, '126c

e4b149a49d1a68f6c2a0af4b2bdd’);

2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=3 AND “name”=‘dc65893ca95dee5e6547854d3fd4f505’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(3, 'dc65

893ca95dee5e6547854d3fd4f505’);

2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=4 AND “name”=‘f04daec7b38fe12ced141b1c6a01346a’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(4, 'f04d

aec7b38fe12ced141b1c6a01346a’);

2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=5 AND “name”=‘05bba4c686505ec88bd65ddc8ff42498’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(5, '05bb

a4c686505ec88bd65ddc8ff42498’);

2020-05-12 14:14:49.189156+08 | highgo | DELETE | DELETE FROM “public”.“test_t” WHERE “id”=6 AND “name”=‘a8fa80d0188d37629e057aa6a52fe8d8’; | INSERT INTO “public”.“test_t”(“id”, “name”) VALUES(6, 'a8fa

80d0188d37629e057aa6a52fe8d8’);

8.结束walminer操作

该函数作用为释放内存,结束日志分析,该函数没有参数。

select walminer_stop();
注意:walminer_contents是walminer自动生成的临时表,因此当session断开再重新进入或其他session中解析数据不可见。这么做主要是基于安全考虑。如果希望保留解析结果,可利用create xxx as select * from walminer_contents;写入普通表中。

使用限制

  1. 本版本只解析DML语句,不处理DDL语句

  2. 执行了删除表、truncate表、更改表的表空间、更改表字段的类型、vacuum full,这样的DDL语句后,发生DDL语句之前的此表相关的DML语句不会再被解析。

  3. 解析结果依赖于数据字典。(举例:创建表t1,所有者为user1,但是中间将所有者改为user2。那解析结果中,所有t1相关操作所有者都将标示为user2)

  4. wal日志如果发生缺失,在缺失的wal日志中发生提交的数据,都不会在解析结果中出现

  5. 解析结果中undo字段的ctid属性是发生变更“当时”的值,如果因为vacuum等操作导致ctid发生变更,这个值将不准确。对于有可能存在重复行的数据,我们需要通过这个值确定undo对应的tuple条数,不代表可以直接执行该undo语句。

  6. 执行了表字段drop的DDL语句后,发生DDL语句之前的这个字段相关的值都会被解析为encode(‘AD976BC56F’,hex)的形式,另外自定义类型也会解析为这种形式

  7. 只能解析与数据字典时间线一致的wal文件

  8. 不建议使用walminer解析大宗copy语句(在同一个事务中插入大量数据行)产生的wal日志,这会导致解析过程中的效率低下和内存占用过高

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 19:49:09

计算机Android毕设实战-基于 SpringBoot+Android 移动端的校园文化展示平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/11 19:43:30

ComfyUI-LTXVideo完全指南:轻松上手LTX-2视频生成技术

ComfyUI-LTXVideo完全指南&#xff1a;轻松上手LTX-2视频生成技术 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 想要体验最先进的AI视频生成技术却苦于复杂的配置&#xff1f;…

作者头像 李华
网站建设 2026/6/11 19:35:52

【Qt控件之QTabBar】从入门到精通:构建现代化应用界面的核心组件

1. QTabBar&#xff1a;现代化应用界面的基石 第一次接触QTabBar时&#xff0c;我正为一个数据分析工具设计界面。当时需要实现多个数据视图的快速切换&#xff0c;这个看似简单的需求却让我纠结了很久。直到发现QTabBar这个神器&#xff0c;才明白原来Qt早就为我们准备好了完美…

作者头像 李华
网站建设 2026/6/11 19:31:01

87870蓝柏林:AI眼镜热潮背后是一场关于“眼睛“的争夺战

2025年&#xff0c;全球AI智能眼镜销量约600万台&#xff1b;2026年&#xff0c;这个数字预计将飙升至2000万台&#xff0c;市场规模增长四倍。在中国&#xff0c;2025年一季度AI眼镜线上成交同比增长超过8倍。这不是"风口"&#xff0c;这是"海啸"前夜为什…

作者头像 李华