searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

利用pg_dirtyread实现闪回查询功能

2023-10-26 02:01:39
101
0

背景介绍

  • 闪回查询(Flashback Query)是一种在数据库中执行时间点查询的技术。它允许查询数据库中过去某个时间点的数据状态,并返回相应的查询结果。通常闪回查询分为表级以及行级的闪回查询。PostgreSQL数据库由于MVCC的机制,对于DML的操作,更改或者删除的元祖暂时标记为死元祖并未真正的在物理上清理,直到vacuum运行时才清理这些死元祖,这为行级的闪回查询提供了可能。
  • pg_dirtyread是PostgreSQL数据库的一个扩展插件。当在PG执行了误操作SQL(如UPDATE或DELETE) 后,它可以从表中读取未被vacuum的死元祖,可用于查看意外删除或更改的受损数据,达到类似“闪回查询”的功能。pg_dirtyread基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据,实现行级的数据还原。

功能介绍

一、闪回查询被更新/删除的历史行数据

二、支持查询系统列(tableoid、ctid、xmin, xmax, cmin, cmax)

pg_dirtyread支持查询(死)元祖的系统列。这对于我们追踪历史数据信息至关重要。并且可以依靠事务信息,完成基于时间点的闪回查询。

三、基于时间点的闪回查询

pg_xact_commit_timestamp函数:查询事务提交时间

如果只想恢复到其中的某一个时间点的数据,首先需要通过系统函数 pg_xact_commit_timestamp,得到每个元祖写入事务的提交时间(xmin)以及删除/更新事务提交时间(xmax)。加以处理后,进而实现基于时间点的闪回查询。

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

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

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

1、$ts表示要查询某个表在ts这个时间点上的数据,ts指一个具体的历史时间。
2、A is distinct from B:表示排除A表达式与B表达式相匹配的行。

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

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

使用限制

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

利用pg_dirtyread实现闪回查询功能

2023-10-26 02:01:39
101
0

背景介绍

  • 闪回查询(Flashback Query)是一种在数据库中执行时间点查询的技术。它允许查询数据库中过去某个时间点的数据状态,并返回相应的查询结果。通常闪回查询分为表级以及行级的闪回查询。PostgreSQL数据库由于MVCC的机制,对于DML的操作,更改或者删除的元祖暂时标记为死元祖并未真正的在物理上清理,直到vacuum运行时才清理这些死元祖,这为行级的闪回查询提供了可能。
  • pg_dirtyread是PostgreSQL数据库的一个扩展插件。当在PG执行了误操作SQL(如UPDATE或DELETE) 后,它可以从表中读取未被vacuum的死元祖,可用于查看意外删除或更改的受损数据,达到类似“闪回查询”的功能。pg_dirtyread基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据,实现行级的数据还原。

功能介绍

一、闪回查询被更新/删除的历史行数据

二、支持查询系统列(tableoid、ctid、xmin, xmax, cmin, cmax)

pg_dirtyread支持查询(死)元祖的系统列。这对于我们追踪历史数据信息至关重要。并且可以依靠事务信息,完成基于时间点的闪回查询。

三、基于时间点的闪回查询

pg_xact_commit_timestamp函数:查询事务提交时间

如果只想恢复到其中的某一个时间点的数据,首先需要通过系统函数 pg_xact_commit_timestamp,得到每个元祖写入事务的提交时间(xmin)以及删除/更新事务提交时间(xmax)。加以处理后,进而实现基于时间点的闪回查询。

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

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

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

1、$ts表示要查询某个表在ts这个时间点上的数据,ts指一个具体的历史时间。
2、A is distinct from B:表示排除A表达式与B表达式相匹配的行。

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

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

使用限制

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