oracle的数据恢复方式有很多,但是都比较麻烦,幸好有老熊的ODU的工具,目前这个工具已经不在提供免费的版本,而且听说授权还比较贵,对好的东西的市场化我本人是支持的,但是希望有其他途径可以继续帮助那些像我一样的贫穷的人,毕竟说服老板话费几万银子去买个只能给你用的软件,是很难成功的。幸好还有很多无私的人提供其他的版本,目前可以找到的最新的无限制的版本就是windows下的odu_309,现在网上还有很多下载,itpub上就有,如果大家找不到在联系我。
下面是以一个真实的例子来演示从环境--删除--恢复的全过程,也许很多老手都已经熟悉了,这里只是给自己和新人一个了解的机会,了解我们中国人自己的牛人编写的软件有多牛叉。
一、测试环境搭建
1.建立测试表空间MYTBS
create tablespace MYTBS datafile '/opt/oracle/oradata/orcl/mytbs01.dbf' size 10M;
2.建立测试用户:
create user james identified james_12345 default tablespace MYTBS;
3.建立测试表:
conn james/james_12345
create table temp(id int,name varchar2(10));
commit;
4.建立测试数据:
begin
for i in 1..10000
loop
insert into temp values(i,'testvalue');
end loop;
commit;
end;
二、模拟truncate 操作:
1.truncate table temp;
commit;
2.触发checkpoint让数据写入数据文件
alter system checkpoint;
三、准备工作
1.脱机表空间,防止数据库块被复用
alter tablespace MYTBS offline;
2.安装odu,目前只有windows版本没有限制,许可很贵,建议把数据文件拉到 windows下处理
3. 这一步很重要,需要把删除表所在的表空间MYTBS和 system表空间文件用ssh下载到本地处理
四、恢复操作
1.修改ODU的control文件
打开control.txt修改表头为#ts #fno #rfno filename只需要这四列就可以
2.从oracle获取控制信息
sql>select ts#,file#,rfile#,name from v$datafile;
这里只需要MYTBS和SYStem表空间信息即可,如。
0 1 1 /opt/oracle/oradata/orcl/system01.dbf
6 5 5 /opt/oracle/oradata/orcl/mytbs01.dbf
3.运行odu.exe
只要不报错就ok。
4.unload数据字典
odu>unload dict
5.获取temp表逻辑结构,注意大写
odu>desc james.TEMP
可以看到类似如下的信息
Storage(OBj#42252 DataObj#=42255 TS#=6 File#=20 Block#=11 Clister=0)
这里可以得到表空间号为6
6.扫描表空间的extend
ODU>scan extent tablespace 6
7.恢复数据
ODU>unload table james.TEMP object auto
至此就可以在data文件夹下看到3个文件,一个是txt数据文件,里面存储的temp表的数据。另外两个是sql*loader使用的文件
,一个是控制文件,一个是建表脚本文件,可以用sql*loader恢复数据导入。
8.设置表空间联机进行数据导入
sql>alter tablespace MYTBS online;
五、模拟恢复删除错误
1.模拟删除
insert into temp values(0,'testvalue');
insert into temp values(1,'testvalue');
insert into temp values(2,'testvalue');
insert into temp values(3,'testvalue');
insert into temp values(4,'testvalue');
delete from temp where id=4;
commit;
alter system checkpoint;
alter tablespace MYTBS offline;
2.同上的操作,把system和MYTBS表空间的数据文件下载下来
3.这一步很重要,修改ODU的config.txt增加
unload_deleted yes
如果不增加是无法恢复删除数据的。
4.ODU下操作:
unload dict
desc james.TEMP
scan extent tablespace 6
因为temp表还存在直接恢复表数据
unload table james.TEMP
这样就可以看到在data下恢复了5条数据。这里有个疑问,加入有个表100万数据,恢复就直接把数据全恢复回来?
不过好在数据全在,导入测试机器上把数据拿出来就好,毕竟数据在,工作在。