oracle 基於數據挖掘的不徹底恢復

    因爲某種誤操做須要恢復數據庫。固然咱們都知道,假如本身以前有備份數據庫能夠用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) 把備庫中部徹底恢復成功的數據拷貝到主庫

這樣既能夠不用關閉數據庫,也解決了不徹底恢復有可能形成的部分數據丟失。具體操做演示這裏就不說了。

相關文章
相關標籤/搜索