postgresql数据库pg_dirtyread插件闪回技术 —— 筑梦之路

   闪回查询(Flashback Query)是一种在数据库中执行时间点查询的技术。它允许查询数据库中过去某个时间点的数据状态,并返回相应的查询结果。通常闪回查询分为表级以及行级的闪回查询。PostgreSQL数据库由于MVCC的机制,对于DML的操作,更改或者删除的元祖暂时标记为死元祖并未真正的在物理上清理,直到vacuum运行时才清理这些死元祖,这为行级的闪回查询提供了可能。

前提条件

1.延迟VACUUM,确保误操作的数据还没有被垃圾回收。
vacuum_defer_cleanup_age = 5000000  
# 延迟500万个事务再回收垃圾,误操作后在500万个事务内,如果发现了误操作,才有可能使用本文提到的方法闪回。2.记录未被freeze,确保无操作的数据,以及后面提交的事务号没有被freeze(抹去)。
vacuum_freeze_min_age = 50000000   
# 事务年龄大于5000万时,才可能被抹去事务号。3、开启事务提交时间跟踪,确保可以从xid得到事务结束的时间
track_commit_timestamp = on     
# 开启事务结束时间跟踪,开启事务结束时间跟踪后,会开辟一块共享内存区存储这个信息。

 pg_dirtyread插件

  pg_dirtyread是PostgreSQL数据库的一个扩展插件。当在PG执行了误操作SQL(如UPDATE或DELETE) 后,它可以从表中读取未被vacuum的死元祖,可用于查看意外删除或更改的受损数据,达到类似“闪回查询”的功能。pg_dirtyread基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据,实现行级的数据还原。

使用限制

  • pg_dirtyread很好的解决了误操作导致的数据修改删除问题。但是它最大的缺点就是受制于autovacuum进程,如果autovacuum进程清理掉了死元组,pg_dirtyread就没办法工作了。所以当出现误删数据之后,需先关闭autovacuum,查询误操作的表是否已经发生了vacuum。
  • 闪回查询通常分为表级以及行级的闪回查询。pg_dirtyread目前仅只支持普通表的误DML操作(insert、update、delete)、以及DDL操作中的drop column的闪回查询,实现行级别的闪回查询。对其他DDL操作,如drop table等无法进行闪回操作。

安装插件pg_dirtyread

 

GitHub地址:https://github.com/df7cb/pg_dirtyread# 下载wget  https://github.com/df7cb/pg_dirtyread/archive/refs/tags/2.6.tar.gzcp /opt/pg_dirtyread-2.6.tar.gz /home/postgres/chown postgres:postgres /home/postgres/pg_dirtyread-2.6.tar.gzsu - postgrestar -xzvf pg_dirtyread-2.6.tar.gz
cd pg_dirtyread-2.6makemake install# 登陆数据库 安装插件postgres=# CREATE EXTENSION pg_dirtyread;
postgres=# select * from pg_available_extensions;
postgres=# \dx

 

pageinspect插件

  pageinspect模块提供函数让你从低层次观察数据库页面的内容,这对于调试目的很有用。所有这些函数只能被超级用户使用。pageinspect的源码在postgres源码包的contrib目录下,解压postgre源码包后进入对应的目录。

# 查找find / -name contrib# 登陆数据库安装插件postgres=# create extension pageinspect;
postgres=# select * from pg_available_extensions;
postgres=# \dx

 闪回案例

1. 删除闪回

-创建测试表
CREATE TABLE foo (bar bigint, baz text);  -- 测试方便,先把自动vacuum关闭掉。
ALTER TABLE foo SET (autovacuum_enabled = false, toast.autovacuum_enabled = false
);--插入数据
INSERT INTO foo VALUES (1, 'Test'), (2, 'New Test');  
--删除所有数据
DELETE FROM foo;  postgres=# select * from foo;
postgres=# SELECT * FROM pg_dirtyread('foo') as t(bar bigint, baz text);

 2. drop列闪回

CREATE TABLE ab(a text, b text);  
INSERT INTO ab VALUES ('Hello', 'World');  ALTER TABLE ab DROP COLUMN b;  
DELETE FROM ab; postgres=# select * from ab;postgres=# SELECT * FROM pg_dirtyread('ab') ab(a text, dropped_2 text);虽然b列被drop掉了,但是仍然可以读取到数据。如何指定列:
这里使用dropped_N来访问第N列,从1开始计数。局限:
由于PG删除了原始列的元数据信息,因此需要在表列名中指定正确的类型,这样才能进行少量的完整性检查。包括类型长度、类型对齐、类型修饰符,并且采取的是按值传递。

3. 基于时间点闪回

pg_xact_commit_timestamp函数:查询事务提交时间
如果只想恢复到其中的某一个时间点的数据,首先需要通过系统函数 pg_xact_commit_timestamp,得到每个元祖写入事务的提交时间(xmin)以及删除/更新事务提交时间(xmax)。加以处理后,进而实现基于时间点的闪回查询。--设置参数
track_commit_timestamp = on   --模拟数据
create table bak (id int,info text);
insert into bak values(1,'aaa'),(2,'bbb'),(3,'ccc');
delete from bak;--通过事务提交时间,查询数据历史版本
select pg_xact_commit_timestamp(xmin) as xmin_time,
pg_xact_commit_timestamp(case xmax when 0 then null else xmax end) as xmax_time,*
from pg_dirtyread('bak') as t(tableoid oid,ctid tid,xmin xid,xmax xid,cmin cid,
cmax cid,id int,info text);

根据xmin_time,xmax_time,我们可以查看每个元祖的历史版本操作,何时插入以及何时进行更新/删除的。 

闪回查询某个时间点的数据

根据事务提交顺序,逆序,逐个事务排除,逐个事务回退。其语法为:

$ts表示要查询某个表在ts这个时间点上的数据,ts指一个具体的历史时间。

A is distinct from B:表示排除A表达式与B表达式相匹配的行。 

 

支持查询被删除列的历史数据

DML误操作后,如果又发生了DDL,例如新增字段,修改字段等,只要表没有被重写(例如通过 VACUUM FULL 或 CLUSTER),pg_dirtyread支持检索删除列的内容。使用dropped_N来访问第N列,从1开始计数。

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

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

相关文章

前端webWorker 的介绍以及应用

文章目录 webWorker以下是关于 Web Workers 的一些关键概念:控制台查看使用注意事项消息传递创建subworkerwebWorker的具体使用注意事项 共享worker(SharedWorker)创建方法:与专用worker的主要区别: webWorker JavaScript是单线程的语言&…

vscode调试文件(C++,ROS和cmake文件)

VsCode调试文件 参考文档: code.visualstudio.com/docs/editor/variables-reference code.visualstudio.com/docs/editor/tasks 主要修改task.json下的"args"、launch.json中的"program",“args” 注意task.json中的label以及launch.json中…

Python程序设计 元组和集合

教学案例七 元组和集合 1. 根据年月日计算周几 根据输入的年号、月号、日号,计算是周几(中文、英文) 蔡勒公式 通过蔡勒(Zeller)公式可计算星期几 w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 c&…

【苍穹外卖】Springboot中快速使用mybatis插件-PageHelper

目录 Springboot中快速使用mybatis插件-PageHelper1. 导入Maven坐标2. 拦截查询方法3. 编写查询的方法和mapper接口4. 配置&#xff1a;扫描Mapper.xml的映射文件路径5. 版本说明 Springboot中快速使用mybatis插件-PageHelper 1. 导入Maven坐标 <dependency><groupI…

MyBatis Dynamic SQL基本使用

MyBatis Dynamic SQL基本使用 一、概念二、特性Hamcrest是什么 三、MyBatis Dynamic SQL 快速入门3.1 环境准备3.2 定义表和列3.3 创建 MyBatis3 映射器3.4 使用 MyBatis3 执行 SQL 四、数据库对象表示4.1 表或视图表示4.2 表别名4.3 列表示 五、Where 子句支持5.1 简单的 wher…

RIP最短路实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;它根据跳数来度量路由开销并进行路由选择。RIP是最典型的距离矢量路由协议&#xff0c;常…

多高的学历才能轻松找到工作?这个热点有点扯吧~

先来唠唠 昨天刷脉脉的时候&#xff0c;热榜第一的内容吸引了我&#xff1a;多高的学历才能轻松找到工作&#xff1f; 现在这行情&#xff0c;不管多高得学历都很难说能轻松找到工作吧~ 评论区也有不少小伙伴发表自己的见解&#xff0c;比如&#xff1a; 学历固然是非常重要…

【QT学习】8.qt事件处理机制

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

2024妈妈杯数学建模思路A题思路汇总分析 MathorCup建模思路分享

C题&#xff1a;移动通信网络中PCI规划问题 &#xff08;完整版内容放在文末了&#xff09; 2024MathorCup A题完整思路完整数据可执行代码后续高质量成品论文 l 难度评分: 3.5/5 l 开放度评分: 3/5 l 适合专业: 通信工程、计算机科学、电子工程 l 主要算法: 图论算法、…

route路由命令、ip route命令、default默认路由(0.0.0.0 )

文章目录 概述3. route语法3.1 查看路由表3.1 参数解释 3.2 添加路由记录3.2.1 添加到达单个目标主机的路由3.2.2 添加到达目标网络的路由3.2.3 添加默认路由 3.3 删除路由记录 4. ip route4.1 查看路由4.1.1 不带条件4.1.2 带条件4.1.3 字段解释4.1.3 字段解释 4.2 添加路由4.…

sublime text的json快捷键

系统 macos 配置 sublime Text->Settings->Key Bindings 效果 可以看到&#xff0c;按&#xff1a;shiftcommandp&#xff0c;会出现快捷键窗口&#xff0c;打pretty&#xff0c;会出现Format JSON&#xff0c;最右侧显示⌘J&#xff0c;说明只需要macos的⌘和J同时按…

Midjourney指南 - 生成高分辨率图片(内容已更新至V5)

Midjourney 首先为每个作业生成一个低分辨率图片网格(2x2)。你可以在选择其中任一图片&#xff0c;使用 Midjourney upscaler 来增加尺寸并添加更多细节。有多种可用于放大图像的放大模型。 每个图像网格下方的按钮用于放大所选图像。U1 U2 U3 U4 注&#xff1a;upscaler 以下…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz-10KHz转0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

ts封装axios遇到的问题

在使用ts封装axios时&#xff0c;这里总是有一个报错&#xff0c;经过一顿搜索&#xff0c;发现错误原因&#xff1a;在TypeScript中&#xff0c;函数的参数类型和返回类型是不等价的&#xff0c;因此导致类型不匹配。 解决方法&#xff1a;将 AxiosRequestConfig 改成 Interna…

物理机安装centos7并配置基本环境,网络配置,docker配置

1.首先下载镜像Download 2.下载UltraISO 安装docker 第1步&#xff1a;卸载当前版本docker yum erase docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \do…

前端和设计师 结果 差异化的原因

记得很久之前与我同住的室友经常加班到半夜三更才回家&#xff0c;我很是不解。后来闲聊才得知她们公司的设计师待前端开发完毕之后需要一点点的对稿走查&#xff0c;非常浪费时间。而且设计这边不但需要标注好给开发&#xff0c;然而开发照着做完依然存在诸多问题。 我也曾对接…

关于赚钱上面的金句启发,一共12项100多条,值得收藏!

注意一&#xff1a;个人成长与自我实现 币圈有个词叫不要"mid curve"&#xff0c;意思是在最傻和最聪明的人都能赚到钱&#xff0c;不要做中间那部分人。为什么会经常出现不配赚这么多的钱的感觉&#xff0c;主要还是见识少&#xff0c;当你亲眼见过一年赚上千万一个…

基于数据库现有表导出为设计文档

1.查询 SELECTCOLUMN_NAME 字段名,COLUMN_COMMENT 字段描述,COLUMN_TYPE 字段类型,false as 是否为主键 FROMINFORMATION_SCHEMA.COLUMNS wheretable_NAME region -- 表名2.查询结果 3.导出为excel

测绘管理与法律法规 | 测绘资质分类分级标准 | 学习笔记

目录 1. 申请条件 2.审批程序 3.专业技术人员的特殊规定 1. 申请条件 法人资格&#xff1a;申请单位必须具有法人资格。 专业技术人员&#xff1a;需拥有与测绘活动相适应的测绘专业技术人员和相关专业技术人员。 技术装备&#xff1a;具备与测绘活动相适应的技术装备和设…

数仓建模—数据架构

数仓—数据架构 为了在企业决策中使用数据,数据必须经过整个数据平台的各个阶段。整个过程是什么样子的,从开始到结束?原始形式的数据是如何转化为可导致商业决策的见解的?这些问题可以通过数据架构来回答。 数据架构是指记录组织所有数据资产的模型、规则和标准。它映射…