PostgreSQL12通过WalMiner恢复数据

1、WalMiner简介

官方文档:https://gitee.com/movead/XLogMiner

WalMiner是从PostgreSQL的WAL(write ahead logs)日志的解析工具,旨在挖掘wal日志所有的有用信息,从而提供PG的数据恢复支持。目前主要有如下功能:
• 从waL日志中解析出SQL,包括DML和少量DDL
解析出执行的SQL语句的工具,并能生成对应的undo SQL语句。与传统的logical decode插件相比,walminer不要求logical日志级别且解析方式较为灵活。
• 数据页挽回
当数据库被执行了TRUNCATE等不被wal记录的数据清除操作,或者发生磁盘页损坏,可以使用此功能从wal日志中搜索数据,以期尽量挽回数据

walminer3.0更新内容
• 代码结构变化
• 增加数据页挽回功能(坏块修复)
• 增加对开发库PG14的支持


2、安装WalMiner

  1. 配置pg的bin路径至环境变量
export PATH=/app/telepg/pg12.5/bin:$PATH
export PGHOME=/app/telepg/pg12.5
  1. 进入walminer代码路径
unzip XLogMiner-master.zip
cd ./XLogMiner-master/walminer
  1. 执行编译安装
USE_PGXS=1 MAJORVERSION=12 make
#MAJORVERSION支持‘10’,‘11’,‘12’,‘13’
USE_PGXS=1 MAJORVERSION=12 make install

3、WalMiner通过WAL日志进行SQL解析

3.1、创建walminer的extension

postgres=# select * from pg_available_extensions where name='walminer';
   name   | default_version | installed_version |      comment       
----------+-----------------+-------------------+--------------------
 walminer | 3.0             |                   | analyse wal to SQL
(1 row)
postgres=# create extension walminer;
CREATE EXTENSION
postgres=# 
postgres=# select * from pg_extension;
  oid  | extname  | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
-------+----------+----------+--------------+----------------+------------+-----------+--------------
 13579 | plpgsql  |       10 |           11 | f              | 1.0        |           | 
 24673 | pg_trgm  |       10 |         2200 | t              | 1.4        |           | 
 24896 | walminer |       10 |         2200 | t              | 3.0        |           | 
(3 rows)

3.2、在源库进行误操作

postgres=# select * from test1;
 id | name 
----+------
  1 | asd
  2 | qwe
  3 | zxc
(3 rows)

postgres=# update test1 set name='1111' where id=1;   ---update数据并切换归档
UPDATE 1
postgres=# 
postgres=# select pg_switch_wal();
 pg_switch_wal 
---------------
 20/570003D8
(1 row)

postgres=# select pg_switch_wal();
 pg_switch_wal 
---------------
 20/58000078
(1 row)

postgres=# delete from test1 where id>2; ---delete数据并切换归档
DELETE 1
postgres=# 
postgres=# select pg_switch_wal();      
 pg_switch_wal 
---------------
 20/590000E0
(1 row)

3.3、把wal日志加到walminer

把在误操作时间范围内的wal日志都添加

postgres=# select walminer_wal_add('/app/telepg/pg_data/pg_wal');

postgres=# select walminer_wal_list();
                   walminer_wal_list                   
-------------------------------------------------------
 (/app/telepg/pg_data/pg_wal/000000020000002000000056)
 (/app/telepg/pg_data/pg_wal/000000020000002000000057)
 (/app/telepg/pg_data/pg_wal/000000020000002000000058)
 (/app/telepg/pg_data/pg_wal/000000020000002000000059)
(4 rows)

3.4、解析sql

1、先确认误删表的oid

postgres=# select oid,relname from pg_class where relname='test1';
  oid  | relname 
-------+---------
 24761 | test1
(1 row)

2、解析
• 填入误操作的大致开始时间和结束时间
• 每运行一次以下语句,walminer_contents表就会重新插入一次
• wal日志也需要重新配置一次

--'true'和'false'代表是否为精确解析模式,reloid为目标表的oid(注意不是relfilenode)
--以下俩种显示的结果一致
select walminer_by_time('2022-02-10 15:40:21', '2022-02-10 15:55:21','true',24761);select wal2sql('2022-02-10 15:40:21', '2022-02-10 15:55:21','true',24761);

3.5、查看解析结果

• 精确模式的结果
会把误操作的sql和回滚sql都展示出来,会显示具体到值
通过得到的回滚sql就可以进行恢复数据

postgres=# select * from walminer_contents;                                          
-[ RECORD 1 ]-------------------------------------------------------------
sqlno      | 1
xid        | 870
topxid     | 0
sqlkind    | 2
minerd     | t
timestamp  | 2022-02-10 15:40:54.966033+08
op_text    | UPDATE public.test1 SET name='1111' WHERE id=1 AND name='asd'  ---误操作语句
undo_text  | UPDATE public.test1 SET name='asd' WHERE id=1 AND name='1111'  ---回滚语句
complete   | t
schema     | public
relation   | test1
start_lsn  | 20/57000308
commit_lsn | 20/57000388
-[ RECORD 2 ]-------------------------------------------------------------
sqlno      | 1
xid        | 871
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2022-02-10 15:41:40.97732+08
op_text    | DELETE FROM public.test1 WHERE id=3 AND name='zxc'    ---误操作语句
undo_text  | INSERT INTO public.test1(id ,name) VALUES(3 ,'zxc')   ---回滚语句
complete   | t
schema     | public
relation   | test1
start_lsn  | 20/59000060
commit_lsn | 20/590000C8

• 非精确模式的结果
不会显示具体到值

postgres=# select * from walminer_contents;
-[ RECORD 1 ]-----------------------------------------------
sqlno      | 1
xid        | 870
topxid     | 0
sqlkind    | 2
minerd     | f
timestamp  | 2022-02-10 15:40:54.966033+08
op_text    | UPDATE public.test1 (WALMINER_DATA_MISSED)
undo_text  | UPDATE public.test1 (WALMINER_DATA_MISSED)
complete   | t
schema     | public
relation   | test1
start_lsn  | 20/57000308
commit_lsn | 20/57000388
-[ RECORD 2 ]-----------------------------------------------
sqlno      | 1
xid        | 871
topxid     | 0
sqlkind    | 3
minerd     | f
timestamp  | 2022-02-10 15:41:40.97732+08
op_text    | DELETE FROM public.test1 (WALMINER_DATA_MISSED)
undo_text  | INSERT INTO public.test1) VALUES)
complete   | t
schema     | public
relation   | test1
start_lsn  | 20/59000060
commit_lsn | 20/590000C8

3.6、结束walminer操作

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

postgres=# select walminer_stop();
-[ RECORD 1 ]-+-----------------
walminer_stop | walminer stoped!

运行了之后,walminer_contents表还是会有记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面子拿钱砸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值