首页 > 数据库 >PostgreSQL WALMINER 插件的安装和数据恢复

PostgreSQL WALMINER 插件的安装和数据恢复

时间:2024-11-16 16:18:30浏览次数:3  
标签:WALMINER 插件 recovery 数据恢复 lsn walminer id test public

我们说数据恢复是数据库 DBA 在日常数据库维护过程中一项难点技能,也是标志一个人是否达到 DBA 的重要指标。

其他关系型数据库比如常用的 MySQL SQLServer Oracle 等都有一些比较成熟的产品可以直接恢复。但是 PostgreSQL 比较特殊一些,不好直接解析 WAL 日志。或者直接解析也是不可读的。

我们可以通过第三方的一个插件 WALMINER  来解析 WAL 日志,生成逆向的 SQL 语句进行数据误操作的恢复。

创建数据库和对象并初始化数据
CREATE DATABASE data_recovery;

DROP TABLE IF EXISTS public.recovery_test;
CREATE TABLE public.recovery_test (
  id bigserial,
  cno int8 NOT NULL,
  cage int4,
  PRIMARY KEY (id));
ALTER TABLE public.recovery_test OWNER TO postgres;

INSERT INTO public.recovery_test (cno, cage) VALUES (508227500950822913, 10);
INSERT INTO public.recovery_test (cno, cage) VALUES (508227500950822914, 20);
INSERT INTO public.recovery_test (cno, cage) VALUES (507936989916569601, 30);
INSERT INTO public.recovery_test (cno, cage) VALUES (507924225600921600, 40);
INSERT INTO public.recovery_test (cno, cage) VALUES (507924225600921601, 50);
INSERT INTO public.recovery_test (cno, cage) VALUES (508227500950822915, 60);
INSERT INTO public.recovery_test (cno, cage) VALUES (507924225600921602, 70);
INSERT INTO public.recovery_test (cno, cage) VALUES (508953287031136257, 80);
......

SELECT * FROM public.recovery_test;

模拟误操作的语句
DELETE FROM public.recovery_test WHERE id >= 5;

配置环境变量
[root@localhost ~]# vim /etc/profile
export PATH=/usr/local/pgsql-12.8/bin:$PATH

安装插件
[root@localhost ~]#
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# chmod -R 755 ./XLogMiner-master.zip
[root@localhost src]# unzip XLogMiner-master.zip
[root@localhost src]# cd XLogMiner-master/walminer/

修改编译文件中 PG_CONFIG 参数的值
[root@localhost walminer]# vim Makefile
PG_CONFIG = /usr/local/pgsql-12.8/bin/pg_config

[root@localhost walminer]# USE_PGXS=1 MAJORVERSION=12 make
[root@localhost walminer]# USE_PGXS=1 MAJORVERSION=12 make install
/usr/bin/mkdir -p '/usr/local/pgsql-12.8/lib'
/usr/bin/mkdir -p '/usr/local/pgsql-12.8/share/extension'
/usr/bin/mkdir -p '/usr/local/pgsql-12.8/share/extension'
/usr/bin/install -c -m 755  walminer.so '/usr/local/pgsql-12.8/lib/walminer.so'
/usr/bin/install -c -m 644 .//walminer.control '/usr/local/pgsql-12.8/share/extension/'
/usr/bin/install -c -m 644 .//walminer--3.0.sql  '/usr/local/pgsql-12.8/share/extension/'
[root@localhost walminer]#

在数据库中安装插件
[root@localhost walminer]# su - postgres
[postgres@localhost walminer]$ psql
postgres=# CREATE EXTENSION walminer;
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'walminer';
postgres=# SELECT * FROM pg_extension WHERE extname = 'walminer';
postgres=# \c data_recovery
data_recovery=# CREATE EXTENSION walminer;
data_recovery=# SELECT * FROM pg_available_extensions WHERE name = 'walminer';
data_recovery=# SELECT * FROM pg_extension WHERE extname = 'walminer';

添加需要解析的 WAL 日志文件
data_recovery=# SELECT walminer_wal_add('/usr/local/pgsql-12.8/data/pg_wal');

移除旧的 WAL 日志文件
data_recovery=# SELECT walminer_wal_remove('/usr/local/pgsql-12.8/data/pg_wal');

列出所有的 WAL 日志文件
data_recovery=# SELECT walminer_wal_list();

执行解析
data_recovery=# SELECT walminer_all();

解析指定时间范围内的 WAL
SELECT walminer_by_time(starttime, endtime, 'true');
SELECT wal2sql(starttime, endtime ,'true');

解析指定 LSN 范围内的 WAL
SELECT walminer_by_lsn(startlsn, endlsn, 'true');
SELECT wal2sql(startlsn, endlsn, 'true');

解析指定 XID 的 WAL
SELECT walminer_by_xid(xid,'true');
SELECT wal2sql(xid,'true');

单表解析,reloid 是表 pg_class 中对象的 oid
解析指定时间范围内的 WAL
SELECT walminer_by_time(starttime, endtime, 'true', reloid);
SELECT wal2sql(starttime, endtime ,'true', reloid);

解析指定 LSN 范围内的 WAL
SELECT walminer_by_lsn(startlsn, endlsn, 'true', reloid);
SELECT wal2sql(startlsn, endlsn, 'true', reloid);

解析指定 XID 的 WAL
SELECT walminer_by_xid(xid,'true', reloid);
SELECT wal2sql(xid,'true', reloid);

解析结果查询
data_recovery=# SELECT * from walminer_contents;
data_recovery=# SELECT * from walminer_contents WHERE op_text LIKE '%recovery_test%';
-[ RECORD 1 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 843
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.071528+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(1 ,508227500950822913 ,10)
undo_text  | DELETE FROM public.recovery_test WHERE id=1
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907A6A0
commit_lsn | 0/907A7C0
-[ RECORD 2 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 844
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.072039+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(2 ,508227500950822914 ,20)
undo_text  | DELETE FROM public.recovery_test WHERE id=2
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907A7C0
commit_lsn | 0/907A880
-[ RECORD 3 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 845
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.072534+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(3 ,507936989916569601 ,30)
undo_text  | DELETE FROM public.recovery_test WHERE id=3
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907A880
commit_lsn | 0/907A940
-[ RECORD 4 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 846
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.072975+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(4 ,507924225600921600 ,40)
undo_text  | DELETE FROM public.recovery_test WHERE id=4
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907A940
commit_lsn | 0/907AA00
-[ RECORD 5 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 847
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.073393+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(5 ,507924225600921601 ,50)
undo_text  | DELETE FROM public.recovery_test WHERE id=5
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907AA00
commit_lsn | 0/907AAC0
-[ RECORD 6 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 848
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.073788+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(6 ,508227500950822915 ,60)
undo_text  | DELETE FROM public.recovery_test WHERE id=6
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907AAC0
commit_lsn | 0/907AB80
-[ RECORD 7 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 849
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.074163+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(7 ,507924225600921602 ,70)
undo_text  | DELETE FROM public.recovery_test WHERE id=7
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907AB80
commit_lsn | 0/907AC40
-[ RECORD 8 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 850
topxid     | 0
sqlkind    | 1
minerd     | t
timestamp  | 2024-01-29 11:57:05.074527+08
op_text    | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(8 ,508953287031136257 ,80)
undo_text  | DELETE FROM public.recovery_test WHERE id=8
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/907AC40
commit_lsn | 0/907AD00
-[ RECORD 9 ]---------------------------------------------------------------------------------
sqlno      | 1
xid        | 852
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2024-01-29 12:57:47.626491+08
op_text    | DELETE FROM public.recovery_test WHERE id=5
undo_text  | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(5 ,507924225600921601 ,50)
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/90ADD48
commit_lsn | 0/90ADE98
-[ RECORD 10 ]--------------------------------------------------------------------------------
sqlno      | 2
xid        | 852
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2024-01-29 12:57:47.626491+08
op_text    | DELETE FROM public.recovery_test WHERE id=6
undo_text  | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(6 ,508227500950822915 ,60)
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/90ADD90
commit_lsn | 0/90ADE98
-[ RECORD 11 ]--------------------------------------------------------------------------------
sqlno      | 3
xid        | 852
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2024-01-29 12:57:47.626491+08
op_text    | DELETE FROM public.recovery_test WHERE id=7
undo_text  | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(7 ,507924225600921602 ,70)
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/90ADDD8
commit_lsn | 0/90ADE98
-[ RECORD 12 ]--------------------------------------------------------------------------------
sqlno      | 4
xid        | 852
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2024-01-29 12:57:47.626491+08
op_text    | DELETE FROM public.recovery_test WHERE id=8
undo_text  | INSERT INTO public.recovery_test(id ,cno ,cage) VALUES(8 ,508953287031136257 ,80)
complete   | t
schema     | public
relation   | recovery_test
start_lsn  | 0/90ADE20
commit_lsn | 0/90ADE98

data_recovery=#

当我们找到对应的 undo_test 之后执行对应的语句,然后再结束 WAL 解析。

结束 WAL 日志的解析
data_recovery=# SELECT walminer_stop();

标签:WALMINER,插件,recovery,数据恢复,lsn,walminer,id,test,public
From: https://blog.csdn.net/2401_83375581/article/details/143695885

相关文章

  • 【Vue】环境配置(必备插件含vue开发者工具)
    目录必备插件Vue的HelloWorld程序setup函数安装Vue开发者工具​编辑数据响应式响应式函数reactive ​编辑响应式函数refreactive与ref的选择必备插件1、Vue-Offical提供Vue文件的语法高亮支持Vue文件的智能感知和自动完成提供Vue文件的格式化工具2、Vue3S......
  • chainWebpack: config => { // 移除 preload(预载) 插件 config.plugins.dele
    在VueCLI项目中,chainWebpack是一个用于自定义Webpack配置的钩子。通过chainWebpack,你可以对Webpack配置进行更细粒度的控制。你提到的代码片段的作用是移除preload和prefetch插件。下面是对这段代码的详细解释:代码解析chainWebpack:config=>{//移除preload......
  • 删除的文件如何恢复? 5种简单数据恢复方法分享
    数据丢失是一个严重的问题,是数字世界中令人不快的一部分,它会不时影响许多计算机用户。当数据(文件)被意外删除或某些原因导致数据损坏时,可能会发生数据丢失。病毒、物理损坏或格式错误会使数据无法被人类和软件读取。幸运的是,即使您没有备份已删除的文件,数据恢复软件也可以帮助......
  • Mac电脑技巧:适用于Mac的免费外置硬盘数据恢复软件
    “我有一个1TB的外置硬盘,它被意外格式化了。我尝试从中恢复丢失的数据。我把它连接到我的Mac,但里面什么也没找到。我正在寻找适用于Mac的免费外置硬盘数据恢复软件,例如奇客数据恢复Mac版或其他Mac数据恢复免费软件来扫描它并恢复数据。你有什么建议吗?当Mac用户丢失外部硬盘......
  • Windows数据恢复神器
    前言      今日,我要向大家推荐一款出色的数据恢复工具,它不仅专业级别,而且完全免费,更值得一提的是,它可以终身使用!     这款工具的独特之处在于其易用性和高效性。界面设计简洁明了,不含任何广告干扰,让您能够专心致志地进行数据恢复工作。     使用这款工具......
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的
    EasyPlayer.jsH5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式,支持Windows、Linux、Android、iOS全平台终端的H5播放器,使用简单......
  • 金蝶云插件:列表插件单元格格式化事件FormatCellValue --- 采购申请单--列表自动刷新即
    region<<版本注释>>采购申请单--列表自动刷新即时库存/*===================================================类名称:PUR_Requisition_ListJSKCQTY类描述:采购申请单--列表自动刷新即时库存创建人:luohong创建时间:2024/11/1514:59:47电子邮箱:it_luo@finecables......
  • 网页直播/点播播放器EasyPlayer.js网页web无插件播放器渲染页面出现倒挂的原因排查
    EasyPlayer.js网页web无插件播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式,也能支持WebSocket-FLV、HTTP-FLV、HLS(m3u8)、WebRTC、ws......
  • Flutter插件Get(7):实现语言的国际化
    一、前言除了FlutterIntl的方式实现国际化(参考我以前的博客:Flutter进阶(2):国际化开发-fengMisaka-博客园),还可以使用GetX实现国际化(推荐)。先看下效果图:二、GetX实现国际化(推荐)新建一个Flutter工程,使用GetX实现国际化的具体步骤如下:2.1安装Getx在pubspec.yaml......
  • 【Unity相机和角色控制插件】RPG Cameras & Controllers 提供了一套完整的相机和角色
    RPGCameras&Controllers是一款专为RPG游戏设计的Unity插件,提供了一套完整的相机和角色控制系统,帮助开发者快速实现第三人称视角和角色移动控制。这个插件包括了多个自定义选项,允许开发者轻松调整相机和角色控制的行为,适用于动作角色扮演类游戏(ARPG)或传统RPG类型的项......