原作者:王勇昱
- 适用范围
- 问题概述
- 问题原因
- 解决方案
- 参考文档
适用范围
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




