Oracle介質恢復(三)

fengpinDBA發表於2013-12-09

5.資料庫完全恢復

如果損壞的塊是資料檔案開頭,這將導致資料庫無法正常啟動和關閉,並且使用RMAN BLOCKRECOVER也不能恢復。因此此時就要進行完全恢復或者嘗試使用BBED修改塊頭。

1)   模擬損壞資料檔案頭的塊

使用BBED方法將資料檔案6的第1個塊損壞,DBV的檢查結果如下:

$ dbv file=/test/test01.dbf

2)   嘗試使用RMAN BLOCKRECOVER進行恢復

執行以下命令使用RMANBLOCKRECOVER對資料檔案6的第1個塊進行恢復:

RMAN> blockrecover datafile 6 block 1;

Starting recover as 2013-12-07 16:24

Using channel ORA_DISK_1

 

Starting media recovery

Media recovery complete,elapsed time: 00:00:00

 

Finished recover at 2013-12-07 16:24

恢復顯示是完成的,也沒有報錯。但是執行DBV驗證命令發現標記的壞塊還是兩個,及沒有真正修復。說明使用RMAN BLOCKRECOVER對資料檔案頭的修復是沒有作用的。

嘗試正常關閉資料庫,由於資料庫無法完成檢查點工作,所以正常關閉操作失敗:

SQL> shutdown immediate

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/test/test01.dbf’

ORA-01210: data file header is media corrupt

強制關閉資料庫:

SQL> shutdown abort

重啟資料庫,發現資料庫無法開啟資料檔案:

SQL> startup

……

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/test/test01.dbf’

ORA-01210: data file header is media corrupt

3)   執行資料檔案的完全恢復

執行以下命令還原、恢復6號資料檔案:

RMAN> restore datafile 6;

RMAN> recover datafile 6;

嘗試開啟資料庫:

SQL> alter database open;

Database altered.

Oracle資料庫中有各種各樣的塊,如空塊、表頭塊、資料塊、索引塊、資料檔案頭塊、UNDO段塊等。如果損壞的是普通表的資料塊,那即不會影響啟動資料庫,也不會影響其他表的正常訪問,只是在訪問該表的時候會出現問題。如果損壞的是資料檔案的塊頭,那麼將導致資料庫無法正常啟動和停止,執行塊恢復不能修復這個問題,執行資料檔案的完全恢復才能恢復資料檔案塊頭的損壞或嘗試使用BBED修改資料檔案塊頭。

6.資料庫不完全恢復

不完全恢復又稱為資料庫基於時間點恢復,是將整個資料庫恢復到之前的某個時間點、日誌序列號或者SCN號。如下不完全恢復的選項:

不完全恢復的選項

不完全恢復方式

RMAN選項

使用者管理備份選項

恢復到某個時間點

until time

until time

恢復到某個日誌序列號

until suquence

until cancel

恢復到某個SCN

until SCN

until change

不完全恢復只能針對整個資料庫而言,並不能執行資料檔案和表空間的不完全恢復;另外,對於非歸檔模式的恢復來說,也不能執行不完全恢復。

1)   基於時間點的不完全恢復

RMAN> run {

shutdown immediate;

startup mount;

SQL “alter session set nls_date_format=’’YYYY-MM-DD HH24:MI:SS’’”;(兩個單引號之間沒有空格)

set until time ‘2013-12-07 17:24:00’;

restore database;

recover database;

alter database open resetlogs;}

SET UNTIL TIME時間可以使用多種表示方式,可以使用TO_DATE函式來表示時間,還可以使用SYSDATE-1方式來表示時間。

注意:不完全恢復是針對整個資料而言,如果在上面的指令碼中,還原和恢復的是某個資料檔案或表空間,那麼指令碼將忽略set until time設定,對資料檔案或表空間進行完全恢復。對RESTORE命令指定until time或者until scn的意義在於這樣可以自動選擇最近的RMAN備份來恢復資料,以上的批量命令相當於為RESTORERECOVER都指定了until time子句,這樣比單命令模式更加簡單和合理。基於時間點的恢復不能恢復到最終備份完成時間點以前的時段。

2)   基於序列號的不完全恢復

基於序列號的不完全恢復須指定某個Redo執行緒的序列號,那麼在這個序列號切換時間點之前的所有例項的歸檔日誌都需要的,每個節點的負載不同,其他例項的序列號可能比指定的Redo執行緒序列號要大。

以下是在RMAN中基於日誌序列號的不完全恢復的例子:

RMAN> run {

Shutdown immediate;

Startup mount;

Set until sequence 10350 thread 1;

Restore database;

Recover database;

Alter database open resetlogs;}

注意:指定執行緒序列號為10350,但是恢復是不包含該序列號的日誌的,也就是說恢復只會恢復到thread 1 sequence 10304的日誌,時間點和scn恢復同樣如此。

3)   基於SCN的不完全恢復

下面是在RMAN中基於SCN的不完全恢復的例子:

RMAN> run {

shutdown immediate;

startup mount;

set until scn 324394;

restore database;

recover database;

alter database open resetlogs;}

注意:對開啟的資料庫執行的全庫備份或者0級備份,即使不完全恢復到執行全庫備份或者0級備份的備份時間點也可能需要部分Redo日誌,原因在於對開啟的資料庫執行RMAN備份是一個不一致的備份。

7.表空間時間點恢復

表空間時間點恢復(Tablespace Point-in-time RecoveryTSPITR)特性可以恢復一個或更多的表空間早於資料庫其他部分的某個時間點。表空間時間點恢復是表空間的不完全恢復,操作起來比較複雜。

表空間時間點恢復能在不影響資料庫其它表空間和物件的情況下,恢復一個或更多的使用者表空間到之前的某個時間點。表空間時間點恢復是對某個表空間執行基於某個時間點的恢復,是特殊的不完全恢復。RMAN TSPITR可以用於以下場景:

n   一個不正確的job或者DML語句破壞了資料庫其中一個表空間的資料,RMAN TSPITR可用於被破壞表空間的恢復。

n   DDL操作改變了表的結構之後,RMAN TSPITR可用於丟失資料的恢復。這種情況不能使用Flashback Table找回表之前的結構的資料,如表結構變化後的一個TRUNCATE表操作。

n   一個表被一個drop語句加了purge選項徹底dropRMAN TSPITR可用於這種情況的恢復。

n   恢復drop的表空間,當沒有使用恢復目錄,RMAN能對被drop的表空間執行TSPITR

n   從一個表的邏輯損壞中恢復。

表空間時間點恢復和Flashback有點類似,在沒有介質失敗的情況下,資料也可以使用Flashback Database找回,但是Flashback Database會導致整個資料庫被閃回到之前的某個時間點。與TSPITR不同的是,Flashback Database特性必須產生Flashback日誌,使用Flashback Database閃回資料庫比使用TSPITR有更多的限制,TSPITR可以擴充套件到能找回可用於恢復的更早備份資料。

1)   TSPITR的工作原理

TSPITR工作原理的5個步驟:

步驟1 在輔助例項上用目標資料庫的備份集還原資料檔案。

步驟2 在輔助例項上用目標資料庫的歸檔檔案恢復資料檔案。

步驟3 在輔助資料庫上匯出相關資料。

步驟4 修改主庫的控制檔案。

步驟5 將輔助資料上匯出的檔案匯入目標資料庫。

2)   RMAN TSPITR模式

表空間時間點恢復使用的是RMANRECOVER tablespace命令,執行RMAN TSPITR有幾個選項,不同的選項協調各種不同的操作模式之間對特定環境的自動化操作。

a.        全自動化(預設方式)

在這種模式下,RMAN管理整個TSPITR過程。制定表空間的恢復集、輔助目的地、目標時間和允許RMAN管理所有TSPITR的其它方面。

b.        自動化

可以覆蓋一些預設RMAN TSPITR設定,但仍然使用RMAN管理輔助例項和輔助目的地。這是預設方式的變種,RMAN TSPITR提供一些固定管理的同事允許手動指定一些引數,主要包含以下兩個引數:

n   輔助集或恢復集檔案的位置

n   初始化引數檔案

除了在TSPITR之後的恢復集檔案位置,在TSPITR期間的輔助集檔案、通道設定和引數或輔助例項的其它方面等更多控制都推薦使用預設方式。全自動和自動化都是使用RMAN自動管理輔助例項。

c.        非自動化

使用這種模式是手動建立和管理輔助例項的所有方面和一部分TSPITR過程。當必須分配不同的通道或者使用使用者管理輔助例項改變引數時,使用這種模式是合適的。

3)   執行全自動化的TSPITR

下面以預設的全自動化模式在目標資料庫伺服器建立輔助資料庫構建TSPITR,恢復在目標資料庫對錶的一個誤操作。目標資料庫與輔助資料庫都在一臺伺服器上,下表是兩個資料庫的例項名和資料庫名稱對照表:

資料庫型別

例項名稱

資料庫名稱

目標資料庫

test

test

輔助資料庫

test2

test

a.        建立模擬環境

步驟1 在目標資料建立測試表空間xy_tbs:

SQL> create tablespace xy_tbs datafile ‘/u01/app/oracle/test/xy_tbs01.dbf’ size 5M;

步驟2 確保目標資料庫處在歸檔模式,使用RMAN查詢出xy_tbs表空間的file_id,對它進行備份:

RMAN> report schema;

……

RMAN> backup datafile 5;

步驟3 建立測試使用者xiaoyang

SQL> create user xiaoyang identified by xiaoyang default tablespace xy_tbs tempory tablespace temp;

SQL> grant create session,create table,unlimited tablespace to xiaoyang;

SQL> connect xiaoyang/xiaoyang;

步驟4 建立兩個測試表:x1x2,每個表插入一條測試資料:

SQL> create table x1(D date);

SQL> create table x2(D2 date);

SQL> insert into x1 values(sysdate);

SQL> insert into x2 values(sysdate);

SQL> commit;

步驟5 檢視當前時間作為表空間的恢復時間點:

SQL> alter session set nls_date_format=’YYYY-MM-DD HH24:MI:SS’;

SQL> select sysdate from dual;

步驟6 在恢復時間點之後向x2表中插入一條資料和建立一個新表x3,向x3插入一條測試資料:

SQL> insert into x2 values(sysdate);

SQL> create table x3(D3 date);

SQL> insert into x3 values(sysdate);

SQL> commit;

步驟7 手動drop掉表x1

SQL> drop table x1 purge;

假設drop x1表是一個誤操作,現在要通過TSPITR恢復技術恢復該表。

b.        檢查表空間是否自關聯

執行以下SQL語句檢查表空間自關聯情況:

SQL> execute dbms_tts.transport_set_check(‘xy_tbs’,true,true);

SQL> select * from transport_set_violations;

如果查詢transport_set_violations檢視有值返回,說明表空間有自關聯,需要手動處理提示的問題。

c.        標識TSPITR之後將會丟失的物件

步驟1 通過時間標識TSPITR之後將會丟失的物件:

SQL> select owner,name,tablespace_name,to_char(creation_time,’YYYY-MM-DD HH24:MI:SS’) from ts_pitr_objects_to_be_dropped where tablespace_name in(‘xy_tbs’) and creation_time > to_date(‘2013-12-08 09:43:00’,’YYYY-MM-DD HH24:MI:SS’) order by tablespace_name,creation_time;

步驟2 通過SCN標識TSPITR之後將會丟失的物件:

SQL> select owner,names,tablespace_name,to_char(creation_time,’YYYY-MM-DD HH24:MI:SS’) from ts_pitr_objects_to_be_dropped where tablespace_name in(‘xy_tbs’) and creation_time > to_date(to_char(scn_to_timestamp(1638492),’YYYY-MM-DD HH24:MI:SS’),’YYYY-MM-DD HH24:MI:SS’) order by tablespace_name,creation_time;

如果以上兩個查詢有結果返回,那麼在執行TSPITR之前應該先將這些物件進行邏輯備份,TSPITR完成之後,再將這些物件以替換的方式匯入,以恢復產生資料丟失的物件。

d.        建立輔助資料庫引數檔案

轉儲目標資料庫引數檔案,將該引數檔案拷貝到$ORACLE_HOME目錄,重新命名為inittest2.ora,參考如下引數檔案內容調整inittest2.ora例項的初始化引數檔案:

*.audit_file_dest=’/u01/app/oracle/admin/test2/adump’

*.control_files=’/u01/app/oracle/oradata/test2/control01.ctl’

……

db_file_name_convert=(“/u01/app/oracle/oradata/test”,”/u01/app/oracle/oradata/test2”)

log_file_name_convert=(“/u01/app/oracle/oradata/test”,”/u01/app/oracle/oradata/test2”)

log_archive_start=false

lock_name_space=test2

修改test2例項初始化引數檔案中的audit_file_destcontrol_file引數,確保與原有資料庫的儲存位置不同。新增db_file_name_convertlog_file_name_convertlog_archive_startlock_name_space引數設定。

e.        建立目錄結構

根據例項test2引數的設定建立相應的目錄結構:

$ mkdir –p /u01/app/oracle/admin/test2/adump

$ mkdir –p /u01/app/oracle/oradata/test2

f.         建立test2例項密碼檔案

$ cd $ORACLE_HOME/dbs/

$ orapwd file=orapwtest2 password=oracle entries=5

g.        建立輔助資料庫例項的靜態註冊

grid使用者下的$GRID_HOME/network/admin/listener.ora檔案中修改如下配置:

$ cat listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = test2)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = test2)

   )

)

h.        新增Oracle Net本地服務名

Oracle使用者下的$ORACLE_HOME/network/admin/tnsnames.ora檔案中新增如下配置:

TEST2 =

  (DESCRIPTION =

(ADDRESS_LIST =

  (ADDRESS = (PROTOCOL = TCP)(HOST = rhel2)(PORT = 1521))

)

(CONNECT_DATA =

  (SERVICE_NAME = test2)

)

                       )

i.         啟動輔助資料庫到NOMOUNT狀態

$ export ORACLE_SID=test2

$ sqlplus / as sysdba

SQL> create spfile from pfile;

SQL> startup nomount

j.         執行TSPITR恢復

使用RMAN同時連線到目標資料庫和輔助資料庫,使用RECOVER TABLESPACE命令執行TSPITR操作:

$ rman target /

RMAN> connect auxiliary sys/oracle@test2

RMAN> run {

allocate auxiliary channel a1 type disk;

allocate channel c1 type disk;

recover tablespace xy_tbs until time “to_date(‘2013-12-08 09:30:00’,’YYYY-MM-DD HH24:MI:SS’)”;

release channel c1;

}

執行TSPITR需要手動分配auxiliary通道

使目標資料中xy_tbs表空間ONLINE

SQL> alter tablespace xy_tbs online;

k.        驗證恢復結果

SQL> select * from xiaoyang.x1;

SQL> select * from xiaoyang.x2;

SQL> select * from xiaoyang.x3;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29339097/viewspace-1062730/,如需轉載,請註明出處,否則將追究法律責任。

相關文章