因爲某種誤操做須要恢復數據庫。固然咱們都知道,假如本身以前有備份數據庫能夠用rman進行恢復,可是這樣的狀況就會恢復倒備份的時刻狀態,而不是誤操做的時候的狀態,也能夠叫作形成恢復過分了。因而咱們能夠用不徹底恢復。數據庫
注意:不徹底恢復是須要關閉數據庫的,因此對於7*24的數據庫不適用,並且在誤操做以前是要有備份的。oracle
下面咱們來模擬數據誤操做之後的不徹底恢復。spa
1 備份數據庫rest
RMAN> backup database; Starting backup at 10-APR-17 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00001 name=/u01/oracle/oradata/orcl/system01.dbf input datafile file number=00002 name=/u01/oracle/oradata/orcl/sysaux01.dbf input datafile file number=00005 name=/u01/oracle/oradata/orcl/user02.dbf input datafile file number=00006 name=/u01/oracle/oradata/orcl/tmpspace0327 input datafile file number=00007 name=/u01/oracle/oradata/orcl/undotbs02.dbf input datafile file number=00008 name=/u01/oracle/oradata/orcl/example.dbf input datafile file number=00004 name=/u01/oracle/oradata/orcl/users01.dbf channel ORA_DISK_1: starting piece 1 at 10-APR-17 channel ORA_DISK_1: finished piece 1 at 10-APR-17 piece handle=/tmp/0us1cc3q_1_1 tag=TAG20170410T225138 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:01:25 channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set including current control file in backup set including current SPFILE in backup set channel ORA_DISK_1: starting piece 1 at 10-APR-17 channel ORA_DISK_1: finished piece 1 at 10-APR-17 piece handle=/tmp/0vs1cc6f_1_1 tag=TAG20170410T225138 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02 Finished backup at 10-APR-17
2 刪數據(徹底刪除)日誌
SQL> drop table emp purge; Table dropped.
3 數據挖掘code
數據不徹底恢復的時候咱們要知道scn或者時間點。須要從日誌挖掘中找。ci
SQL> desc dbms_logmnr; PROCEDURE ADD_LOGFILE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- LOGFILENAME VARCHAR2 IN OPTIONS BINARY_INTEGER IN DEFAULT # 在dbms_logmnr這個包中有一個過程ADD_LOGFILE ,這個就是須要把挖掘的日誌添加進去,再打開挖掘,能夠看到參數只須要用一個logfilename ,日誌文件名,因此咱們須要找到刪除數據的時候適用的日誌文件是哪一個 SQL> select group#,members,status from v$log; GROUP# MEMBERS STATUS ---------- ---------- ---------------- 1 1 CURRENT 2 1 INACTIVE 3 1 INACTIVE # 能夠看出當前適用的日誌文件是1 SQL> select group#,member,status from v$logfile; GROUP# ---------- MEMBER STATUS ---------------------------------------------------------------------- ------- 3 /u01/oracle/oradata/orcl/redo03.log 2 /u01/oracle/oradata/orcl/redo02.log 1 /u01/oracle/oradata/orcl/redo01.log # 看以看出日誌文件1 的名字是‘/u01/oracle/oradata/orcl/redo01.log’
把日誌文件添加進挖掘裏面get
SQL> exec dbms_logmnr.add_logfile('/u01/oracle/oradata/orcl/redo01.log'); PL/SQL procedure successfully completed.
啓動日誌挖掘input
SQL> desc dbms_logmnr; PROCEDURE START_LOGMNR Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- STARTSCN NUMBER IN DEFAULT ENDSCN NUMBER IN DEFAULT STARTTIME DATE IN DEFAULT ENDTIME DATE IN DEFAULT DICTFILENAME VARCHAR2 IN DEFAULT OPTIONS BINARY_INTEGER IN DEFAULT # 咱們能夠看到包dbms_logmnr裏面有一個start_logmnr 過程,用這個過程啓動挖掘 SQL> execute dbms_logmnr.START_LOGMNR(options=>dbms_logmnr.dict_from_online_catalog); PL/SQL procedure successfully completed. # 啓動挖掘成功
從挖掘中找到誤操做數據當時的scn和時間,在v$logmnr_contents;數據挖掘
SQL> select scn,to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss') TIMESTAMP,SQL_REDO,SQL_UNDO from v$logmnr_contents where table_name = 'EMP'; SCN TIMESTAMP SQL_REDO SQL_UNDO ---------- -------------------- -------------------- -------------------- 2507301 2017-04-10 22:54:49 drop table emp purge ;
到此爲止,咱們已經挖掘成功,找到scn和時間點
注意:若是用時間點恢復的時候要減1秒
最後關閉數據挖掘
SQL> exec dbms_logmnr.end_logmnr; PL/SQL procedure successfully completed.
4 不徹底恢復
RMAN> shutdown immediate; using target database control file instead of recovery catalog database closed database dismounted Oracle instance shut down #先關閉數據庫 RMAN> startup mount; connected to target database (not started) Oracle instance started database mounted Total System Global Area 584568832 bytes Fixed Size 2230552 bytes Variable Size 444597992 bytes Database Buffers 130023424 bytes Redo Buffers 7716864 bytes #啓動倒mount狀態下 RMAN> run{ 2> set until scn 2507301; 3> restore database; 4> recover database; 5> alter database open resetlogs; 6> } executing command: SET until clause Starting restore at 10-APR-17 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=137 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00001 to /u01/oracle/oradata/orcl/system01.dbf channel ORA_DISK_1: restoring datafile 00002 to /u01/oracle/oradata/orcl/sysaux01.dbf channel ORA_DISK_1: restoring datafile 00004 to /u01/oracle/oradata/orcl/users01.dbf channel ORA_DISK_1: restoring datafile 00005 to /u01/oracle/oradata/orcl/user02.dbf channel ORA_DISK_1: restoring datafile 00006 to /u01/oracle/oradata/orcl/tmpspace0327 channel ORA_DISK_1: restoring datafile 00007 to /u01/oracle/oradata/orcl/undotbs02.dbf channel ORA_DISK_1: restoring datafile 00008 to /u01/oracle/oradata/orcl/example.dbf channel ORA_DISK_1: reading from backup piece /tmp/0us1cc3q_1_1 channel ORA_DISK_1: piece handle=/tmp/0us1cc3q_1_1 tag=TAG20170410T225138 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:01:15 Finished restore at 10-APR-17 Starting recover at 10-APR-17 using channel ORA_DISK_1 starting media recovery media recovery complete, elapsed time: 00:00:01 Finished recover at 10-APR-17 database opened # 用上面run{}腳本進行恢復,restore,recover,open resetlogs; # 成功
5 驗證
SQL> desc emp; Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) SQL> select count(*) from emp; COUNT(*) ---------- # 被刪除的emp表恢復成功
6 從新備份數據庫
注意:恢復倒誤操做時刻成功了,可是誤操做以後作的事情就會丟失,因此要謹慎,並且須要關閉數據。
在oracle11g 中還能夠在線克隆的方式避免關閉數據庫:
方法大體步驟:
1) 在線克隆一個備庫
2)在備庫中進行不徹底恢復
3) 把備庫中部徹底恢復成功的數據拷貝到主庫
這樣既能夠不用關閉數據庫,也解決了不徹底恢復有可能形成的部分數據丟失。具體操做演示這裏就不說了。