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

GaussDB(DWS)delete误删数据后如何恢复?

GaussDB DWS 2021-01-08
3346

⬆️  点箭头指向的蓝色小字关注我


 摘 要

      本帖通过简单的例子介绍当前情况下如何恢复delete误删的数据,如需了解更多精彩内容,请点击文末阅读原文进入华为云GaussDB(DWS)开发者论坛学习探索。

背 景

      某局点ISV误执行delete from xxx where xxx语句删除了四十亿条有用数据,为保护客户信息,本帖通过简单的例子介绍当前情况下如何恢复误删的数据,数据、主机名等信息均为测试环境,非客户信息。
 前 提
      delete语句误删数据,之后立刻停止对该表的其他写操作,并且没有做过vacuum full。

 构 建 场 景

创建一张测试表,向该表插入1000条数据:
通过delete语句将a < 50的记录删除:

 恢 复 步 骤

1、连接任意一个dn(连接cn的话一次性查出来数据太多,数据量小时可以连cn起只读事务处理),执行:

set enable_show_any_tuples = on;

select xmin,xmax,* from test where a < 50 order by xmax::text desc;

说明:enable_show_any_tuples参数可以显示已经被delete但是还未vacuum回收的脏数据,此参数只在只读事务中生效,是session级的参数;

      在这里我们需要将脏数据按照xmax排序,取最大的xmax,这是为了保证我们只恢复此次delete删除的数据,不多恢复之前已经delete的数据;

      在这里不能使用建新表insert into的方式恢复,因为enable_show_any_tuples参数只在只读事务中生效,一旦在dn开启read write事务,此参数将失效,也就无法再看到delete的脏数据。

2、通过gsql的方式,将查询结果导出到文本,如果数据量较大,可以分批处理

gsql -d postgres -p 25330 -c "set enable_show_any_tuples = on; select * from test where a < 50 and xmax = '413471'" > result;

3、对文本进行处理,通过copy的方式重新导回到数据库内;

4、对每个dn都执行以上操作,即可恢复误删除的数据。

【推荐阅读】


华为云数仓GaussDB(DWS)

和您分享最新最全的PB级数仓黑科技

点左下角可“阅读原文”了解更多哦~

文章转载自GaussDB DWS,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论