GaussDB(DWS)维护宝典:delete误删数据后如何恢复

举报
你是猴子请来的救兵吗 发表于 2024/03/27 21:35:08 2024/03/27
【摘要】 delete语句误删数据,之后立刻停止对该表的其他写操作,并且没有做过vacuum full。

背景

某局点ISV误执行delete from xxx where xxx语句删除了四十亿条有用数据,为保护客户信息,本帖通过简单的例子介绍当前情况下如何恢复误删的数据,数据、主机名等信息均为测试环境,非客户信息。

前提

delete语句误删数据,之后立刻停止对该表的其他写操作,并且没有做过vacuum full。

构造场景

1、创建一张测试表,向该表插入1000条数据:

create table test(a int, b int);
insert into test select generate_series(1,1000),1;

2、通过delete语句将a < 50的记录删除:

delete from test where a < 50;

image.png

恢复步骤

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

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

dn1数据
gsql -r -p28116 -r
image.png
dn2数据
gsql -r -p28121 -r
image.png

说明:enable_show_any_tuples参数可以显示已经被delete但是还未vacuum回收的脏数据,此参数只在只读事务中生效,是session级的参数;
在这里我们需要将脏数据按照xmax排序,取最大的xmax,这是为了保证我们只恢复此次delete删除的数据,不多恢复之前已经delete的数据;
在这里不能使用建新表insert into的方式恢复,因为enable_show_any_tuples参数只在只读事务中生效,一旦在dn开启read write事务,此参数将失效,也就无法再看到delete的脏数据。

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

# dn1
gsql -d postgres -p 28116 -c "set enable_show_any_tuples = on; select trim((a,b)::text,'()') from test where a < 50 and xmax = '413471'" > result1;
# dn2
gsql -d postgres -p 28121 -c "set enable_show_any_tuples = on; select trim((a,b)::text,'()') from test where a < 50 and xmax = '413471'" > result2;

image.png

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

# cn
gsql -d postgres -p 28111 -c "COPY test FROM '$path/result1' WITH (format 'csv');"
gsql -d postgres -p 28111 -c "COPY test FROM '$path/result2' WITH (format 'csv');"

image.png

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。