暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在ASTORE下,短时间内找回误删或误修改的数据

由迪 2024-03-29
160

原作者:王勇昱

  • 适用范围
  • 问题概述
  • 问题原因
  • 解决方案
  • 参考文档

适用范围

MogDB 3.0或以上版本,修改数据后,数据记录的历史版本还未被vacuum时

问题概述

有时候在后台使用dml语句进行数据少量数据修改时,可能存在误修改的情况,期望能找回之前的记录,但无法使用闪回功能

问题原因

闪回功能只在ustore上能使用,astore环境无法使用闪回功能

解决方案

连接数据库后,设置参数

set enable_show_any_tuples to on;

然后开启一个只读事务

start transaction read only;

此时可以查询未被vacuum的所有历史记录。
以下为实际测试执行结果

解释MogDB=# create table test_oldtuple(id int,content text);
CREATE TABLE
MogDB=# insert into test_oldtuple values (1,'test');
INSERT 0 1
MogDB=# update test_oldtuple set content='abc';
UPDATE 1
MogDB=# select * from test_oldtuple;
 id | content
----+---------
  1 | abc
(1 row)

MogDB=# set enable_show_any_tuples to on;
SET
MogDB=# start transaction read only;
START TRANSACTION

MogDB=# select ctid,currtid(tableoid,ctid),* from test_oldtuple;
 ctid  | currtid | id | content
-------+---------+----+---------
 (0,1) | (0,2)   |  1 | test
 (0,2) | (0,2)   |  1 | abc
(2 rows)

MogDB=#

此处使用了currtid函数,currtid函数可以根据历史的ctid找到最新的ctid,适用于无主键表的历史版本对应关系确认。
观察数据可知,ctid为(0,2)的记录,存在一个历史版本ctid为(0,1),对应的content值为test,此时我们就找到了 当前 id=1,content=abc 的记录存在一个历史版本 id=1,content=test

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论