如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
RMAN 备份和基于时间的不完全恢复
使用 until time 命令,以前的ingkuang已经得以解决,看下面的例子。
创建表,填充数据,如下:
SQL> create table tbl_indexes as select * from all_indexes; Table created. SQL> select count(1) from tbl_indexes; COUNT(1) ---------- 1675
表创建之后,取用RMAN 备份:
RMAN> backup database;
当用户发出 drop table命令时,他知道了大致时间,我们查询当前时间只是为了证实:
SQL> select to_char(sysdate,'dd/mm/yyyy hh24:mi:ss') ddate from v$database; DDATE ----------------- 26/10/2009 10:34:16
然后,删除表:
SQL> drop table tbl_indexes; Table dropped. SQL> select count(1) from tbl_indexes; select count(1) from tbl_indexes * ERROR at line 1: ORA-00942: table or view does not exist
现在,到了恢复表的时间。关闭数据库,在安装模式下打开,然后执行恢复,如下:
RMAN> shutdown immediate RMAN> startup mount RMAN> run 2> { 3> set until time="to_date('26102009 10:34:16','ddmmyyyy hh24:mi:ss')"; 4> restore database; 5> recover database; 6> } RMAN> alter database open resetlogs; database opened RMAN>
最后连接到 SQL*Plus ,查询删除的表:
SQL> select count(1) from tbl_indexes; COUNT(1) ---------- 1675 SQL>
这表示表成功恢复。
基于变化的不完全恢复
It is在日志序列号基础上恢复数据库是可能的,每次发生日志切换,Oracle 给重做日志文件制定一个新的日志序列号,如果数据库管理员直到包含损坏SQL命令的归档重做日志文件的确切的序列号,他们可以不执行SQL命令,不完全恢复到序列号,打开数据库, Bob 执行不完全恢复的情况,如下
基于下列all_tables视图,Bob创建了一个表:
SQL> create table test as select * from all_tables; Table created.
接着,由于一些数据库操作,数据库中存在两个日志切换,为人为控制这些日志切换,使用下列命令:
SQL> alter system switch logfile; System altered. SQL> alter system switch logfile; System altered. SQL> select sequence#, name from v$archived_log; SEQUENCE# NAME ---------- ---------- 2 C:\ORACLE\product\10.2.0\flash_recovery_area\ db1\archivelog\o1_mf_1_2_5gcdbfoz_.arc 3 C:\ORACLE\product\10.2.0\flash_recovery_area\ db1\archivelog\2009_10_26\o1_mf_1_3_5gcdcr1g_.arc SQL> select sequence#, status from v$log; SEQUENCE# STATUS ---------- ---------------- 2 ACTIVE 3 ACTIVE 4 CURRENT
正如你看到的,存在两个日志切换,生成了两个归档重做日志文件。
为了计算行的数量,用户运行下列查询:
SQL> select count(1) from test; COUNT(1) ---------- 1521
然后,它们不小心删除了表, 并进行会话:
SQL> delete from test; 1521 rows deleted. SQL> commit; Commit complete. SQL> select count(1) from test; COUNT(1) ---------- 0
接着,有一个日志切换:
SQL> alter system switch logfile; System altered.
用户很快联系了Bob,告诉他发生的事情,得知情况后,Bob决定恢复数据库到最后一个归档重做日志文件,他获得了归档重做日志文件的列表,有了下列的日志序列号:
SQL> select sequence#, name from v$archived_log;
SEQUENCE# NAME ---------- ---------- 2 C:\ORACLE\product\10.2.0\flash_recovery_area\ db1\archivelog\o1_mf_1_2_5gcdbfoz_.arc 3 C:\ORACLE\product\10.2.0\flash_recovery_area\ db1\archivelog\2009_10_26\o1_mf_1_3_5gcdcr1g_.arc 4 C:\ORACLE\product\10.2.0\flash_recovery_area\ db1\archivelog\2009_10_26\o1_mf_1_4_5gcdgqhn_.arc 通过获得此查询,Bob明白了删除语句在日志序列 #3后面执行,所以,应该恢复数据库到序列 #4,他关闭数据库,在安装模式下打开,执行回复,如下:
SQL> shutdown immediate SQL> startup mount RMAN> run 2> { 3> set until sequence 4; 4> restore database; 5> recover database; 6> } RMAN> alter database open resetlogs; database opened RMAN>
为检查表中数据,Bob 运行下列查询:
SQL> select count(1) from test; COUNT(1) ---------- 1521 SQL>
这表明通过使用基于变化的不完全恢复,Bob 能够恢复到具体的归档重做日志,重新获得数据。
不完全恢复的另一种类型是基于取消的不完全恢复,不由RMAN进行,在用户管理恢复过程中会用到,在第十二章会讲到。