首页 > 数据库 > Oracle > odu的drop恢复
找了一个win32的odu测试了一下drop的恢复,odu通过直接读取数据文件抽取数据,确实可以在非常时期解决问题,一则测试用例,大家参考下,详细的odu手册大家可以参考老熊的odu专栏。
SQL>
create table odu_xiaoyu01 as select * from dba_objects;
Table
created
SQL>
insert into odu_xiaoyu01 select * from odu_xiaoyu01;
71939
rows inserted
SQL>
insert into odu_xiaoyu01 select * from odu_xiaoyu01;
143878
rows inserted
SQL>
insert into odu_xiaoyu01 select * from odu_xiaoyu01;
287756
rows inserted
SQL>
commit;
Commit
complete
SQL>
select count(*) from odu_xiaoyu01;
COUNT(*)
----------
575512
SQL>
drop table odu_xiaoyu01 purge;
Table
dropped
SQL>
select member from v$logfile where group# in (select group# from v$log where
status='CURRENT');
MEMBER
--------------------------------------------------------------------------------
F:APPORADATAXIAOYUREDO03.LOG
SQL>
execute
sys.dbms_logmnr.add_logfile(logfilename=>'F:APPORADATAXIAOYUREDO03.LOG');
PL/SQL
procedure successfully completed
SQL>
execute sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure
successfully completed
SQL>
col timestamp for a50
SQL>
select scn,timestamp,sql_redo from v$logmnr_contents where operation='DDL' and
sql_redo like '%odu_xiaoyu01%';
SCN TIMESTAMP SQL_REDO
----------
--------------------------------------------------
--------------------------------------------------------------------------------
1459346 2012/8/2 20:48:36
create table
odu_xiaoyu01 as select * from dba_objects
;
1460755 2012/8/2 20:49:34
drop table odu_xiaoyu01
purge
;
SQL>
select sql_redo from v$logmnr_contents where timestamp=to_date('2012-08-02
20:49:34','yyyy-mm-dd hh24:mi:ss');
SQL_REDO
--------------------------------------------------------------------------------
;
…….
delete
from "SYS"."OBJ$" where "OBJ#" = '73544' and
"DATAOBJ#" = '73544' and "OW
略去了很多的信息,重要的是上面的这行的object_id。
SQL>
execute sys.dbms_logmnr.end_logmnr;
PL/SQL
procedure successfully completed
SQL>
select ts#,file#,rfile#,name from v$datafile where ts# in (select ts# from
v$tablespace where name='USERS');
TS#
FILE# RFILE# NAME
----------
---------- ----------
--------------------------------------------------------------------------------
4 4 4 F:APPORADATAXIAOYUUSER01.DBF
获取底层文件的信息。
开始用odu直接从数据文件抽取数据。
load control file
'config.txt' successful
loading default
control file ......
ts#
fn rfn bsize blocks bf offset filename
---- ---- ----
----- -------- -- ------ ----------------------------------------
----
4
4 4 8192
10400 N 0
F:APPORADATAXIAOYUUSER01.DBF
load control file
'control.txt' successful
loading dictionary
data......
ODU> scan extent
tablespace 4
scan extent start:
2012-08-02 21:14:10
scanning extent...
scanning extent
finished.
scan extent
completed: 2012-08-02 21:14:12
ODU> unload
object 73544 sample
Unloading
Object,object ID: 73544, Cluster: 0
output data is in
file : 'dataODU_0000073544.txt'
Sample result:
object id: 73544
tablespace no: 4
sampled 1064 rows
column count: 14
column
1 type: VARCHAR2
column
2 type: VARCHAR2
column
3 type: RAW
column
4 type: NUMBER
column
5 type: NUMBER
column
6 type: VARCHAR2
column
7 type: DATE
column
8 type: DATE
column
9 type: VARCHAR2
column
10 type: VARCHAR2
column
11 type: VARCHAR2
column
12 type: VARCHAR2
column
13 type: VARCHAR2
column
14 type: NUMBER
COMMAND:
unload object 73544
tablespace 4 column VARCHAR2 VARCHAR2 RAW NUMBER NUMBER VARC
HAR2 DATE DATE
VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 VARCHAR2 NUMBER
ODU> unload
object 73544 tablespace 4 column VARCHAR2 VARCHAR2 RAW NUMBER NUMBER
VARCHAR2 DATE DATE VARCHAR2 VARCHAR2 VARCHAR2
VARCHAR2 VARCHAR2 NUMBER
Unloading
Object,object ID: 73544, Cluster: 0
575512 rows
unloaded
数据已经全部通过odu从数据文件抽取出来。接下来通过data目录下的文件
然后将users表空间上线。
SQL>
alter tablespace users online;
Tablespace altered
通过odu的data目录下的文件来创建表的元数据,下面根据实际情况修改表的名称和列的名称。
SQL>
CREATE TABLE odu_xiaoyu01
2 (
3
"C0001" VARCHAR2(4000) ,
4
"C0002" VARCHAR2(4000) ,
5
"C0003" RAW(2000) ,
6
"C0004" NUMBER ,
7
"C0005" NUMBER ,
8
"C0006" VARCHAR2(4000) ,
9
"C0007" DATE ,
10
"C0008" DATE ,
11
"C0009" VARCHAR2(4000) ,
12
"C0010" VARCHAR2(4000) ,
13
"C0011" VARCHAR2(4000) ,
14
"C0012" VARCHAR2(4000) ,
15
"C0013" VARCHAR2(4000) ,
16
"C0014" NUMBER
17 );
根据实际情况修改sqlldr的控制文件,将infile和table name改成对应的路径位置和表明。
Sqlldr xiaoyu/xiaoyu control=E:toolodu_307odu_307_win32odudata
ODU_0000073544.ctl log=d:odu01.log
Sqlldr插入完毕后查看下数据,已经全部抽取完毕并加载到表中
SQL>
select count(*) from odu_xiaoyu01;
COUNT(*)
----------
575512
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1059069/ ,如需转载,请注明出处,否则将追究法律责任。