Postgresql WAL日志解析挖掘(walminer 3.0)

1.walminer介绍

WalMiner是PostgreSQL的WAL(write ahead logs)日志解析工具,旨在挖掘wal日志所有的有用信息,从而提供PG的数据恢复支持。

目前主要有如下功能:

  • 从waL日志中解析出SQL,包括DML和少量DDL。
    解析出执行的SQL语句的工具,并能生成对应的undo SQL语句。与传统的logical decode插件相比,walminer不要求logical日志级别且解析方式较为灵活。

  • 数据页挽回。
    当数据库被执行了TRUNCATE等不被wal记录的数据清除操作,或者发生磁盘页损坏,可以使用此功能从wal日志中搜索数据,以期尽量挽回数据。

Walminer 3.0版本是以插件的模式进行使用。
walminer 4.0版本摒弃插件模式改为bin模式,现已脱离对目标数据库的编译依赖和安装依赖,一个walminer工具可以解析PG10~PG15的WAL日志。💻walminer 4.0安装使用看这里👀

2.下载walminer

https://gitee.com/movead/XLogMiner

3.安装walminer

## 解压walminer_3.0
[postgres@pg tmp]$ unzip XLogMiner-walminer_3.0_stable.zip## 将解压后的 walminer 目录放置到编译通过的PG工程的"../contrib/"目录下
[postgres@pg tmp]$ cd XLogMiner-walminer_3.0_stable/
[postgres@pg XLogMiner-walminer_3.0_stable]$ cp -r walminer/ /tmp/soft/postgresql-15.4/contrib/## 编译安装walminer_3.0
[postgres@pg XLogMiner-walminer_3.0_stable]$ cd /tmp/soft/postgresql-15.4/contrib/walminer/
[postgres@pg walminer]$ make && make install## 数据库中创建 walminer 插件
postgres=# create extension walminer;
CREATE EXTENSION
postgres=# \dxList of installed extensionsName   | Version |   Schema   |         Description          
----------+---------+------------+------------------------------plpgsql  | 1.0     | pg_catalog | PL/pgSQL procedural languagewalminer | 3.0     | public     | analyse wal to SQL
(2 rows)

4.WAL日志解析挖掘测试

## 创建测试表
postgres=# create table t1(id int,note text);
CREATE TABLE
postgres=# insert into t1 values (1,'aaa');
INSERT 0 1
postgres=# insert into t1 values (2,'bbb');
INSERT 0 1
postgres=# insert into t1 values (3,'ccc');
INSERT 0 1
postgres=# select * from t1;id | note 
----+------1 | aaa2 | bbb3 | ccc
(3 rows)## 模拟误操作
postgres=# update t1 set note='bbbbbbbbbbb' where id=2;
UPDATE 1
postgres=# delete from t1 where id=1;
DELETE 1
postgres=# select * from t1;id |    note     
----+-------------3 | ccc2 | bbbbbbbbbbb
(2 rows)## 切换wal日志
postgres=# select pg_switch_wal();pg_switch_wal 
---------------0/70580F0
(1 row)## 根据误操作时间选择合适的wal日志
[postgres@pg ~]$ cd /pgsql15.4/data/pg_wal
[postgres@pg pg_wal]$ ls -lrt
total 32768
-rw-------. 1 postgres postgres 16777216 Nov 21 16:31 000000010000000000000008
drwx------. 2 postgres postgres       43 Nov 21 16:31 archive_status
-rw-------. 1 postgres postgres 16777216 Nov 21 16:31 000000010000000000000009
注:如果pg_wal下的wal日志已经发生归档,或者重用,就需要找到误操作时间范围的归档日志文件。## 添加解析的wal日志
postgres=# select walminer_wal_add('/pgsql15.4/data/pg_wal');walminer_wal_add  
--------------------2 file add success
(1 row)postgres=# select walminer_wal_add('/pgsql15.4/pg_arch/000000010000000000000008');walminer_wal_add  
--------------------1 file add success
(1 row)
注:参数可以为一个目录或文件。## 列出等待解析的wal日志
postgres=# select walminer_wal_list();walminer_wal_list                 
---------------------------------------------------(/pgsql15.4/pg_arch/000000010000000000000008)(/pgsql15.4/data/pg_wal/000000010000000000000009)(/pgsql15.4/data/pg_wal/00000001000000000000000A)
(3 rows)## 移除不需要解析的wal日志
postgres=# select walminer_wal_remove('/pgsql15.4/pg_arch/000000010000000000000008');## 开始解析
postgres=# select walminer_all();
NOTICE:  Switch wal to 000000010000000000000008 on time 2023-11-21 16:53:54.534608+08
NOTICE:  Switch wal to 000000010000000000000009 on time 2023-11-21 16:53:54.535068+08walminer_all     
---------------------pg_minerwal success
(1 row)--指定时间范围解析
select walminer_by_time('2023-11-21 16:20:00','2023-11-21 16:31:00');
'2023-11-21 16:20:00':开始时间
'2023-11-21 16:31:00':结束时间## 查看解析结果
postgres=# \x
Expanded display is on.
postgres=# select * from walminer_contents;
-[ RECORD 1 ]-----------------------------------------------------------------
sqlno      | 1
xid        | 740
topxid     | 0
sqlkind    | 2
minerd     | t
timestamp  | 2023-11-21 16:29:47.905102+08
op_text    | UPDATE public.t1 SET note='bbbbbbbbbbb' WHERE id=2 AND note='bbb'
undo_text  | UPDATE public.t1 SET note='bbb' WHERE id=2 AND note='bbbbbbbbbbb'
complete   | t
schema     | public
relation   | t1
start_lsn  | 0/8000060
commit_lsn | 0/8000180
-[ RECORD 2 ]-----------------------------------------------------------------
sqlno      | 1
xid        | 741
topxid     | 0
sqlkind    | 3
minerd     | t
timestamp  | 2023-11-21 16:30:52.479069+08
op_text    | DELETE FROM public.t1 WHERE id=1 AND note='aaa'
undo_text  | INSERT INTO public.t1(id ,note) VALUES(1 ,'aaa')
complete   | t
schema     | public
relation   | t1
start_lsn  | 0/80001B8
commit_lsn | 0/8000218## walminer_contents各字段解释
(sqlno int, 		--本条sql在其事务内的序号xid bigint,		--事务IDtopxid bigint,		--如果为子事务,这是是其父事务;否则为0sqlkind int,		--sql类型1->insert;2->update;3->delete(待优化项目)minerd bool,		--解析结果是否完整(缺失checkpoint情况下可能无法解析出正确结果)timestamp timestampTz, --这个SQL所在事务提交的时间op_text text,		--sqlundo_text text,	--undo sqlcomplete bool,		--如果为false,说明有可能这个sql所在的事务是不完整解析的schema text,		--目标表所在的模式relation text,		--目标表表名start_lsn pg_lsn,	--这个记录的开始LSNcommit_lsn pg_lsn	--这个事务的提交LSN
)## 结束wal日志分析
postgres=# select walminer_stop();walminer_stop   
------------------walminer stoped!
(1 row)## 通过undo_text,对误操作进行恢复
postgres=# UPDATE public.t1 SET note='bbb' WHERE id=2 AND note='bbbbbbbbbbb';
UPDATE 1
postgres=# INSERT INTO public.t1(id ,note) VALUES(1 ,'aaa');
INSERT 0 1
postgres=# select * from t1;id | note 
----+------3 | ccc2 | bbb1 | aaa
(3 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/169925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连接docker swarm和凌鲨

docker swarm相比k8s而言,部署和使用都要简单很多,比较适合中小研发团队。 通过连接docker swarm和凌鲨,可以让研发过程中的常用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 使用步骤 部署swarm proxy 你可以通过linksaas…

所里网连不上,我服了

所里网连不上,我服了所里网连不上,我服了所里网连不上,我服了

手撕AVL_二叉平衡树(图文并茂)

目录 前言 一 . AVL树的概念 二 . AVL树节点的定义 三 . AVL树的插入 1.插入节点 2.调节负载因子 四 . AVL树的旋转 1.左单旋 2.左右双旋 五 . AVL树性能分析 总结 前言 大家好,今天带大加手撕AVL树的插入 一 . AVL树的概念 二叉搜索树虽可以缩短查找的效率&#x…

2023年【安全员-C证】考试试卷及安全员-C证试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证考试试卷是安全生产模拟考试一点通生成的,安全员-C证证模拟考试题库是根据安全员-C证最新版教材汇编出安全员-C证仿真模拟考试。2023年【安全员-C证】考试试卷及安全员-C证试题及解析 1、【多选…

鸿蒙(HarmonyOS)应用开发——生命周期、渲染控制、状态管理装饰器

生命周期 任何程序都是有一定的生命周期的。生命周期是记录从产生到销毁的过程;如果熟悉前端vue.js的话,就可以很好的理解生命周期。 自定义组件生命周期 ArkTS中,自定义组件提供了两个生命周期函数:aboutToAppear() 和aboutTo…

【数据集】全网最全的常见已公开医学影像数据集

目录 一,极市医学数据集汇总 1.CT 医学图像 ​编辑 2.恶性与良性皮肤癌 3.白内障数据集 4.胸部 X 光图像(肺炎) 5.用于图像增强的内窥镜真实合成曝光过度和曝光不足帧 6.医学家 7.乳房组织病理学图像 8.皮肤癌 MNIST:HA…

cephadm部署ceph quincy版本

环境说明 IP主机名角色 存储设备 192.168.2.100 master100 mon,mgr,osd,mds,rgw 大于5G的空设备192.168.2.101node101mon,mgr,osd,mds,rgw大于5G的空设备192.168.2.102node102mon,mgr,osd,mds,rgw大于5G的空设备 关闭防火墙 关闭并且禁用selinux 配置主机名/etc/hosts …

JAVA之异常详解

1. 异常的概念与体系结构 1.1 异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常 1. 算术异常 public class Test {public static void main(String[] args) {System.out.println(10/0);} } 因为 0 不能当被除数,所以报出了异常&#…

JSP宾馆预定管理系统数据库设计过程ER图

**Hi**,今天给大家带来一款使用JSP和Servlet开发的宾馆预定管理系统的论文写作指导。需要使用本项目写文档的童鞋可以好好看看文末附项目的效果查看地址哦~ 一、项目功能 具体的功能看下面这张表,表里面只是截取了主要功能来说的。 员工角色管理员角色员…

JS事件代理(事件委托)

JS事件代理(事件委托) 前言什么是事件代理事件代理的优点 事件代理实例代码实例: 总结 前言 本文详细讲解JavaScript中关于事件代理技术相关的内容以及源码实例的讲解。那么好,本文正式开始 什么是事件代理 事件代理作为JavaSc…

Spring6.x对调度和异步执行的注解支持

Spring为任务调度和异步方法执行提供注解支持。 1 启用Scheduling注解 要启用 Scheduled 和 Async ,在 Configuration 类(或者在启动类)添加 EnableScheduling 和 EnableAsync,如下: Configuration EnableAsync Ena…

Nacos身份绕过漏洞复现(QVD-2023-6271)

Nacos身份绕过漏洞复现(QVD-2023-6271) 环境配置 该漏洞主要用了win10_JAVA的环境,参考网上已有的复现文章,使用jdk-11.0.2_windows-x64_bin.exe 由于2.2.0之后的nacos已将本漏洞修复,所以本次复现使用2.2.0的包 下…

使用CMake交叉编译Arm Linux程序

下载安装aarch64-linux-gnu-gcc arm交叉编译工具链 apt-get install aarch64-linux-gnu-gccapt-get install aarch64-linux-gnu-gcc创建编译目录构建makefle 注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 … 后面构建arm架构cmake mkdir arm…

力软vue前端开发:使用params跳转传参404问题解决

问题描述 this.$router.push({ name: page, query: { id: 001 } }) // 根据路由名称 query 的方式跳转传参 使用query传参时,参数会拼接在链接后,点击搜索条件链接参数也还在。用户需要重新进入搜索页面。 所以,使用nameparams进行传参。参…

【JavaEE】多线程 (1)

目录 1. 认识线程(Thread) 1) 线程是什么 2) 为啥要有线程 3) 进程和线程的区别 2.第⼀个多线程程序 3.多线程的其他创建方式 方法二:实现 Runnable 接⼝ 方法三:匿名内部类 方法四:实现Runable, 重写run, 匿名内部类 方法五:使用lambda表达式…

带你用uniapp从零开发一个仿小米商场_2.创建空白项目及公共样式引入

创建空白项目 打开uniapp 点击新建->项目 如下, 是编辑你项目的名字的地方是你项目存放地址,可以点击浏览器去文件管理里面选地址是模板选择,这里选择默认模板就好是一些其他选择比如uvue能让你项目在编译成软件时运行更快,unicloud能让你用js写后端,且直接就是云开发,g…

Selenium+Pytest自动化测试框架实战

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Linux命令(132)之sshpass

linux命令之sshpass 1.sshpass介绍 linux命令sshpass是用来实现非交换的ssh操作 2.sshpass用法 sshpass [参数] command sshpass参数 参数说明-p指定明文密码 3.实例 3.1.sshpass安装 默认系统中没有sshpass命令,需要安装sshpass rpm包 命令: y…

量化交易:筹码理论的探索-筹码分布计算的实现

前言 很多朋友习惯了同花顺、大智慧等看盘软件,经常问到筹码分布如何计算。 说起来筹码分布的理论在庄股时代堪称是一个划时代产品,虽然历经level2数据、资金流统计、拆单算法与反拆单算法等新型技术的变革,庄股时代也逐渐淡出市场&#xf…

掌握3个Mock工具,轻松玩转单元测试

公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开。 单元测试中的Mock的目的 Mock的主要目的是让单元测试Write Once, Run Everywhere. 即编写一次后,可以在任意时…