Truncate异常恢复一之Truncate前后对比
Truncate异常恢复二之DBMS恢复
Truncate异常恢复三之GDUL恢复
Truncate异常恢复四之BBED恢复
Truncate异常恢复四之BBED恢复
恢复思路
1.通过logmnr找到被truncate表上一次的data_object_id。
2.通过dba_free_space获取所有free block。
3.通过dbms_rowid.rowid_create来创建rowid。
4.利用rowid来抽取数据。
测试
构建测试表
SQL> create table test_trun as select * from dba_objects;
Table created.
查看表的基础信息
SQL> select count(*) from test_trun;
COUNT(*)
----------
72938
SQL> select object_id,data_object_id from dba_objects where object_name='TEST_TRUN';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
78931 78931
Truncate表并将表空间置于read only模式
SQL> TRUNCATE TABLE TEST_TRUN;
Table truncated.
SQL> ALTER TABLESPACE DEVIN READ ONLY;
Tablespace altered.
恢复data_object_id
logminer定位data_object_id,此处测试,忽略
SQL> select object_id,data_object_id from dba_objects where object_name='TEST_TRUN';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
78931 78941
SQL> update sys.obj$ set dataobj#=78931 where obj#=78931;
1 row updated.
SQL> commit;
Commit complete.
SQL> @flush
System altered.
System altered.
利用plsql来恢复数据
先创建一个与原表结构一样的空表,用来存储恢复出来的数据
SQL> CREATE TABLE TEST_TRUN_BAK AS SELECT * FROM DBA_OBJECTS WHERE 1=2;
Table created.
PLSQL恢复数据
declare
v_fno number;
v_s_bno number;
v_e_bno number;
v_rowid rowid;
nrows number;
begin
for i in
...
...
commit;
end loop;
end loop;
end;
/
PL/SQL procedure successfully completed.
## PLSQL脚本可以从翔宇老师那里获取
检查数据恢复情况
SQL> select count(*) from test_trun_bak;
COUNT(*)
----------
20651
SQL> /
COUNT(*)
----------
23928
SQL> /
COUNT(*)
----------
30028
SQL> /
COUNT(*)
----------
37995
SQL> /
COUNT(*)
----------
72938
数据恢复成功。
最后修改时间:2021-11-30 08:40:32
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




