walminer4.0使用方法简介
1. Walminer工具简介
Walminer是PostgreSQL预写式日志(wal)的解析工具,walminer可以将wal解析为引起数据库变化的SQL语句。walminer3.0版本可以解析所有的DML语句与部分重要的DDL语句,从而可以提供数据恢复支持。
Walminer是从 Xlogminer 基础上进行开发的,Xlogminer需要wal_level为logical而且需要将用户表设定IDENTIFY FILL级别,这限制了工具的使用场景。Walminer第一个版本可以允许在非logical级别下进行wal解析,Walminer2.0实现了精确解析和替身解析,walminer3.0实现了DDL解析和数据也挽回功能。 walminer3.0的开源地址 。
2. Walminer4.0功能介绍
之前的walminer版本需要在数据库安装walminer插件生成数据字典后才能完成解析,这种插件的方式可能在部署使用上有些不便,为了安装、部署、使用的方便,walminer4.0改变使用机制,无需在目标数据库做任何操作,即可完成wal解析。
另外walminer工具的编译安装不再依赖任何数据库版本,因此一份walminer工具可以支持多个PG版本的解析(目前支持version>PG10), 演示地址 。
有兴趣的PG小伙伴联系我获取license,有需要者联系我可定制功能(邮箱:lchch1990@sina.cn)。
3. Walminer4.0使用
3.1 下载walminer4.0测试版本
下载
wget https://gitee.com/movead/XLogMiner/releases/download/walminer_dev_4.0_20221108/walminer_x86_64_centos.tar.gz
解压
[lchch@localhost h3]$ tar -xzvf walminer_x86_64_centos.tar.gz
walminer/
walminer/bin/
walminer/bin/walminer
walminer/lib/
walminer/lib/libpq.so.5.15
walminer/lib/libpq.so.5
walminer/lib/libpq.so
walminer/readme
walminer/walminer.license
[lchch@localhost h3]$
3.2 环境准备
3.2.1 建立walminer运行目录
手动创建walminer运行目录/usr/local/walminer
[lchch@localhost walminer]$ sudo mkdir -p /usr/local/walminer
[lchch@localhost walminer]$ sudo chown -R lchch.lchch /usr/local/walminer/
[lchch@localhost walminer]$
3.2.2 安装准备文件
将walminer.license文件拷贝到/usr/local/walminer/目录
[lchch@localhost walminer]$ ll
总用量 8
drwxrwxr-x. 2 lchch lchch 22 11月 8 22:11 bin
drwxrwxr-x. 2 lchch lchch 61 11月 8 22:12 lib
-rw-r--r--. 1 lchch lchch 274 11月 8 22:13 readme
-rw-r--r--. 1 lchch lchch 921 11月 8 22:13 walminer.license
[lchch@localhost walminer]$ cp walminer.license /usr/local/walminer/
[lchch@localhost walminer]$
3.2.3.PATH环境准备
[lchch@localhost walminer]$ export PATH=$PATH:/home/lchch/h3/walminer/bin/
[lchch@localhost walminer]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lchch/h3/walminer/lib/
[lchch@localhost walminer]$
3.2.4.测试安装情况
[lchch@localhost walminer]$ walminer help
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
walminer [command] [options]
COMMANDS
---------
#wal2sql
options
-D dic file for miner
-w wal file path to miner
-t dest of miner result(1 stdout, 2 file, 3 db)(stdout default)
-k boundary kind(1 all, 2 lsn, 3 time, 4 xid)(all default)
-m miner mode(0 nomal miner, 1 accurate miner)(nomal default) if k=2
-r the relname for single table miner
-s start location if k=2 or k=3, or xid if k = 4
if k=2 default the min lsn of input wals
if k=3 or k=4 you need input this
-e end wal location if k=2 or k=3
if k=2 default the max lsn of input wals
if k=3 you need input this
-f file to store miner result if t = 2
-d target database name if t=3(default postgres)
-h target database host if t=3(default localhost)
-p target database port if t=3(default 5432)
-u target database user if t=3(default postgres)
-W target user password if t=3
---------
#builtdic
options
-d target database name(default postgres)
-h target database host(default localhost)
-p target database port(default 5432)
-u target database user(default postgres)
-W target user password
-D dic produce path
-f rewrite walminer dic if exists
---------
#showdic
options
-D dic file to show
---------
#avatardic
options
-r avtar rel that new created
-n avtared relfilenode
-D avtared walminer dic path
---------
#################################################
执行walminer help,如果可以正常打印help信息,则证明安装部署成功。
3.3 使用步骤
3.3.1 生成数据字典
命令参数:
walminer builtdic [options]
-d 目标数据库名(default postgres)
-h 目标数据库的地址(default localhost)
-p 目标数据库的端口(default 5432)
-u 目标数据库的用户名(default postgres)
-W 目标数据库-u用户的密码
-D 数据字典的生成文件()
-f 如果-D指定的文件已经存在那么会重写
注意:如果-h指定的不是localhost,那么需要为-u指定的用户配置流复制权限。
使用举例
[lchch@localhost walminer]$ walminer builtdic -D ~/walminer.dic -f -h localhost -p 15000 -u lchch
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
DIC INFO#
sysid:7159542580689432376 dboid:5 timeline:1 dbversion:150000 walminer:4.0
[lchch@localhost walminer]$ ll ~/walminer.dic
-rw-rw-r--. 1 lchch lchch 356656 11月 8 22:40 /home/lchch/walminer.dic
[lchch@localhost walminer]$
3.3.2.数据字典替身
命令参数:
walminer avatardic [options]
-r 新创建的用于替身的表名
-n 数据字典中被替身的relfilenode
-D 被替身的数据字典
命令作用:
如果一个表执行了drop、truncate、vacuum等操作,导致在数据字典中不存在这个表或者表的relfilenode发生变更。如果还想解析出这个表的数据,那么可以创建一个表结构相同的新表,使用新表承接旧表的数据解析。
使用举例:
数据库数据字典变化
postgres=# create table t1(i int, j int);
CREATE TABLE
postgres=# select oid,relfilenode,relname from pg_class where relname ='t1';
oid | relfilenode | relname
-------+-------------+---------
16452 | 16452 | t1
(1 row)
postgres=# drop table t1;
DROP TABLE
postgres=# create table t2(i int, j int);
CREATE TABLE
postgres=#
新生成数据字典
[lchch@localhost walminer]$ walminer builtdic -D ~/walminer.dic -f -h localhost -p 15000 -u lchch
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
DIC INFO#
sysid:7159542580689432376 dboid:5 timeline:1 dbversion:150000 walminer:4.0
[lchch@localhost walminer]$
执行替身命令
[lchch@localhost walminer]$ walminer avatardic -D ~/walminer.dic -r 't2' -n 16452
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
Avatar rel t2 to relfilenode 16452
[lchch@localhost walminer]$
之后进行解析时在relfilenode 16452的数据都会记录在t2表上。
3.3.3 执行解析wal
命令参数:
walminer wal2sql [options]
-D 数据字典文件路径
-w 需要解析的wal所在的目录
-t 解析结果输出位置(1 标准输出, 2 输出到文件, 3 输出到数据库)(默认1)
-k 解析范围类型(1 解析所有, 2 指定lsn范围, 3 指定时间范围, 4 指定事务ID)(默认1)
-m 解析模式(0 普通模式:对-s指定的范围进行解析; 1 精确模式:k大于1时保证-s指定范围内数据的完全解析)(nomal default)
-r 单表解析的表名
-s 当k=2时为开始lsn; 当k=3时为开始时间;当k=4时为xid
-e 当k=2时为结束lsn; 当k=3时为结束时间;
-f 当t=2时指定解析结果的输出文件
-d 当t=3时指定目标数据库的数据库名(default postgres)
-h 当t=3时指定目标数据库的地址(default localhost)
-p 当t=3时指定目标数据库的端口(default 5432)
-u 当t=3时指定目标数据库的连接用户名(default postgres)
-W 当t=3时指定目标数据库的连接用户的密码
使用举例:
测试数据
postgres=# create table test_walminer(i int, j int, k varchar);
CREATE TABLE
postgres=# insert into test_walminer values(15,15,'walminer');
INSERT 0 1
postgres=# update test_walminer set k = 'walminer4.0' where i = 15;
UPDATE 1
postgres=# delete from test_walminer where i = 15;
DELETE 1
postgres=#
生成数据字典
[lchch@localhost bin]$ walminer builtdic -D ~/walminer.dic -f -h localhost -p 15000 -u lchch
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
DIC INFO#
sysid:7159542580689432376 dboid:5 timeline:1 dbversion:150000 walminer:4.0
[lchch@localhost bin]$
解析并输出到stdout
[lchch@localhost bin]$ walminer wal2sql -D ~/walminer.dic -w /home/lchch/h2/pg15/data/pg_wal
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
[XID]=768, [TOPXID]=0
[SQLNO]=1
[SQL]=INSERT INTO public.test_walminer(i ,j ,k) VALUES(15 ,15 ,'walminer')
[UNDO]=DELETE FROM public.test_walminer WHERE i=15 AND j=15 AND k='walminer'
[LSN]=0/b002cc0
[COMMITLSN]=0/b002d08
[COMMITTIME]=2022-11-08 15:24:42.030009+00
------------------------------------------------------
[XID]=770, [TOPXID]=0
[SQLNO]=1
[SQL]=UPDATE public.test_walminer SET k='walminer4.0' WHERE i=15 AND j=15 AND k='walminer'
[UNDO]=UPDATE public.test_walminer SET k='walminer' WHERE i=15 AND j=15 AND k='walminer4.0'
[LSN]=0/b012938
[COMMITLSN]=0/b012988
[COMMITTIME]=2022-11-08 15:25:02.678489+00
------------------------------------------------------
[XID]=771, [TOPXID]=0
[SQLNO]=1
[SQL]=DELETE FROM public.test_walminer WHERE i=15 AND j=15 AND k='walminer4.0'
[UNDO]=INSERT INTO public.test_walminer(i ,j ,k) VALUES(15 ,15 ,'walminer4.0')
[LSN]=0/b0129b0
[COMMITLSN]=0/b0129e8
[COMMITTIME]=2022-11-08 15:25:10.255133+00
------------------------------------------------------
[lchch@localhost bin]$
解析并输出到数据库临时表
[lchch@localhost bin]$ walminer wal2sql -D ~/walminer.dic -w /home/lchch/h2/pg15/data/pg_wal -t 3 -h localhost -u lchch -p 15000
#################################################
Walminer for PostgreSQL wal
Timelimit License before 2023-01-01 00:00:00+00
#################################################
NOTICE: table "walminer_contents" does not exist, skipping
[lchch@localhost bin]$ psql -p 15000
psql (15beta4)
Type "help" for help.
postgres=# select xid,op_text from walminer_contents ;
xid | op_text
-----+--------------------------------------------------------------------------------------
768 | INSERT INTO public.test_walminer(i ,j ,k) VALUES(15 ,15 ,'walminer')
770 | UPDATE public.test_walminer SET k='walminer4.0' WHERE i=15 AND j=15 AND k='walminer'
771 | DELETE FROM public.test_walminer WHERE i=15 AND j=15 AND k='walminer4.0'
(3 rows)
postgres=# \d walminer_contents
Unlogged table "public.walminer_contents"
Column | Type | Collation | Nullable | Default
------------+--------------------------+-----------+----------+---------
sqlno | integer | | |
xid | bigint | | |
topxid | bigint | | |
sqlkind | text | | |
minerd | boolean | | |
timestamp | timestamp with time zone | | |
op_text | text | | |