天天看點

[原創]RMAN備用資料庫(邏輯dataguard)

RMAN備用資料庫

1、介紹幾個新RMAN指令

INCLUDE CURRENT CONTROLFILE FOR STANDBY:在備份指令中包含一個備用控制檔案,RMAN為了建立備用資料庫必須在其備份中有一個備用控制檔案。

DUPLICATE TARGET DATABASE FOR STANDBY:建立一個副本資料庫作為目标的備用資料庫。

DORECOVER:從目标資料庫用歸檔日志備份恢複備用資料庫。一旦備用資料庫的建立完成,RMAN将對備用資料庫應用主資料庫中的所有歸檔日志,一直到RMAN中注冊的最新的歸檔日志。

2、在RMAN為備用操作複制資料庫期間,RMAN将自動執行任務的所有要求。當連接配接到目标輔助和可選的目錄資料庫時,RMAN将進行以下任務:

 1)決定需要還原哪個基本備份。

 2)根據輔助資料庫參數或者RMAN設定指令和選項,确定将資料檔案放置在輔助執行個體的什麼位置。

 3)為輔助資料庫還原備用控制檔案。

 4)加載備用資料庫控制檔案。

 5)從第1)步決定的備份片或者映像拷貝來還原資料檔案。

 6)如果指定了DORECOVER選項,将根據恢複停止點對還原的資料檔案應用

所有的增量備份

  7)如果指定了DORECOVER選項,将根據恢複點停止點從磁盤或備份對還原的資料檔案應用所有歸檔日志檔案。

3、當RMAN建立備用資料庫時,就注意以下事項:

 1)如果在備用資料庫還原期間不希望使用目錄,則應在RMAN指令行中指定NOCATALOG.

 2)在備份備用控制檔案時的重做日志必須被歸檔。

 3)必須有包含備用控制檔案的備份,否則,當試圖建立備用資料庫時會得到一個“RMAN-06024:no backup or copy of the controlfile found to restore”錯誤。

 4)不能在備用建立期間執行完全恢複。如果目前的聯機重做日志對資料庫不可用,則常常會發生這種情況。應用DORECOVER選項後,RMAN将應用已知的歸檔日志檔案。

 5)如果備用資料庫駐留在其它的伺服器上并擁有與主伺服器相同的目錄結構,則在備用建立期間不必重命名任何一個檔案。預設情況下,DUPLICATE指令将不能繼續執行,而RMAN将會通知還原的輔助檔案的位置與被備份的目标資料庫檔案的原始位置是一緻的。這樣做可以防止DBA偶然覆寫已存在的資料檔案。NOFILENAMECHECK選項将會忽略這個檢查。

 6)備用資料庫的資料庫名稱必須和主資料庫的名稱相同。如果主資料庫和備用資料庫在同一機器上,則對備用資料庫使用LOCK_NAME_SPACE初始化參數。這将允許兩個具有相同名稱的資料庫駐留在同一機器上,而不互相幹擾。

 7)RMAN将隻建立備用資料庫并在建立點上初步恢複該資料庫。不能進行備用資料庫的後續的維護和恢複(傳送、應用歸檔重做日志檔案)

4、建立步驟:

           1)目錄:建立所有的管理目錄($ORACLE_BASE/admin/STBY)和資料目錄(/oradata/STBY)。

           2)參數檔案:拷貝目标資料庫的參數檔案并命名為initSTBY.ora,這樣就建立了一個參數檔案。将所有目标資料庫名(MYDB)修改為”STBY”,除了資料庫名(DB_NAME)必須保留,使備用資料庫與原始資料庫的名稱相同,為了在備用資料庫建立期間轉換檔案名,增加兩個轉換參數。同時,增加LOCK_NAME_SPACE參數以便可以在同一台機器上同時打開兩個同名的資料庫:

DB_FILE_NAME_CONVERT = (“MYDB”,”STBY”)

LOG_FILE_NAME_CONVERT = (“MYDB”,”STBY”)

LOCK_NAME_SPACE = “STBY”

STANDBY_ARCHIVE_DEST = /oradata/stby/arvhice

           3)密碼檔案:為備用資料庫建立一個密碼檔案,以便RMAN可以用SYSDBA身分連接配接到SYSDBA。

           4)Windows服務:在windows環境中,使用oradim工具為STBY資料庫建立一個新的名為OracleServiceSTBY的資料庫服務。

           5)配置Net8

           6)備份目标資料庫(MYDB):建立備用資料庫需要一個備用控制檔案的備份。備用控制檔案備份以後還需要一個日志切換,在指令行中增加一個日志檔案參數,以便該腳本輸出可以輸入到一個檔案中:

LINUX>rman trace = b_standby.log

RMAN> connect target sys/oracle

已聯機到目标資料庫: MYDB (DBID=2567199153)

RMAN> connect catalog rman/rman@standby

已聯機至複原目錄資料庫

RMAN>@b_standby.rcv

b_standby.rcv内容如下:

run{

 ALLOCATE channel d1 TYPE DISK;

 BACKUP incremental LEVEL 0 DATABASE

    format 'd:\oraclebak\db%d_%s_%p_%t'

    tag = 'stby_inc0'

    include CURRENT CONTROLFILE FOR STANDBY;

 SQL 'alter system archive log current ';

 BACKUP ARCHIVELOG FROM TIME 'sysdate - 1/24'

    format 'd:\oraclebak\arc%d_%s_%p_%t';}

腳本說明:

 Control file for standby:當備份整個資料庫時,控制檔案将自動包含在系統表空間中。為了備用資料庫的生成必須建立一個特殊的控制檔案。RMAN可以在一個資料檔案備份片中存儲這個特殊檔案。如果需要,這個備份檔案也可以用于還原目标資料庫的控制檔案。

 Archive log current:當備用資料控制檔案建立時,備用資料庫的恢複從這個目前日志開始。

螢幕輸出如下:

RMAN> run{

2>   ALLOCATE channel d1 TYPE DISK;

3>   BACKUP incremental LEVEL 0 DATABASE

4>     format 'd:\oraclebak\db%d_%s_%p_%t'

5>     tag = 'stby_inc0'

6>     include CURRENT CONTROLFILE FOR STANDBY;

7>   SQL 'alter system archive log current ';

8>   BACKUP ARCHIVELOG FROM TIME 'sysdate - 1/24'

9>     format 'd:\oraclebak\arc%d_%s_%p_%t';}

已配置信道: d1

通道d1: sid=16 devtype=DISK

開始backup, 于2008/05/07 22:49:02

通道d1: 正在啟動incremental level 0 資料檔案備份集

通道d1: 正在設定備份集中的資料檔案

在備份集中包括目前的SPFILE

在備份集中包括待命控制檔

輸入資料檔案fno=00001 name=C:\ORACLE\ORADATA\MYDB\SYSTEM01.DBF

輸入資料檔案fno=00002 name=C:\ORACLE\ORADATA\MYDB\UNDOTBS01.DBF

輸入資料檔案fno=00005 name=C:\ORACLE\ORADATA\MYDB\EXAMPLE01.DBF

輸入資料檔案fno=00010 name=C:\ORACLE\ORADATA\MYDB\XDB01.DBF

輸入資料檔案fno=00006 name=C:\ORACLE\ORADATA\MYDB\INDX1.DBF

輸入資料檔案fno=00009 name=C:\ORACLE\ORADATA\MYDB\USERS01.DBF

輸入資料檔案fno=00003 name=C:\ORACLE\ORADATA\MYDB\CWMLITE01.DBF

輸入資料檔案fno=00004 name=C:\ORACLE\ORADATA\MYDB\DRSYS01.DBF

輸入資料檔案fno=00007 name=C:\ORACLE\ORADATA\MYDB\ODM01.DBF

輸入資料檔案fno=00011 name=C:\ORACLE\ORADATA\MYDB\MYTS01.DBF

輸入資料檔案fno=00008 name=C:\ORACLE\ORADATA\MYDB\TOOLS01.DBF

通道d1: 啟動部份1, 在2008/05/07 22:49:09

通道d1: 已完成部份1, 在2008/05/07 22:59:39

處理片=D:\ORACLEBAK\DBMYDB_12_1_654130144 批注=NONE

通道d1: 備份集完成, 經曆時間: 00:10:35

完成backup, 于2008/05/07 22:59:39

sql 叙述句: alter system archive log current

開始backup, 于2008/05/07 23:00:13

已存盤目前的日志

通道d1: 啟動存盤日志備份集

通道d1: 指定備份集中的存盤日志

輸入存盤日志系線=1 順序=4 recid=22 戳記=654130812

輸入存盤日志系線=1 順序=5 recid=23 戳記=654130813

通道d1: 啟動部份1, 在2008/05/07 23:00:15

通道d1: 已完成部份1, 在2008/05/07 23:00:54

處理片=D:\ORACLEBAK\ARCMYDB_13_1_654130814 批注=NONE

通道d1: 備份集完成, 經曆時間: 00:00:40

完成backup, 于2008/05/07 23:00:54

已釋放通道: d1

RMAN>

請記錄目标資料庫目前的日志序号,自動恢複将從這個日志序号開始:

SQL>SELECT SEQUENCE# FROM V$LOG WHERE STATUS = ‘CURRENT’;

如何知道一個備份集中是否包含一個備用控制檔案?可以在目錄中查詢名RC_BACKUP_CONTROLFILE的視圖中的該注冊資料庫,控制檔案類型“S”(Standby)。正常的控制檔案備份将是一個控制檔案類型“B”(Backup)

SQL> SELECT SET_COUNT,

       CHECKPOINT_CHANGE#,

       CHECKPOINT_TIME,

       STATUS,

       COMPLETION_TIME,

       CONTROLFILE_TYPE

 FROM RMAN.RC_BACKUP_CONTROLFILE

 WHERE DB_NAME = 'MYDB'

   AND CONTROLFILE_TYPE = 'S';

同時下面的查詢語句可以在備份集和備份片中查找包含的備用控制檔案。

SQL> SELECT BS.BS_KEY,

       BS.SET_COUNT,

       BS.BACKUP_TYPE,

       BS.INCREMENTAL_LEVEL,

       BS.COMPLETION_TIME,

       BS.ELAPSED_SECONDS,

       BP.HANDLE,

       BP.STATUS

 FROM RMAN.RC_BACKUP_SET BS, RMAN.RC_BACKUP_PIECE BP

 WHERE BS.CONTROLFILE_INCLUDED = 'STANDBY'

   AND BS.DB_ID = BP.DB_ID

   AND BS.BS_KEY = BP.BS_KEY

   AND BS.DB_ID IN (SELECT DBID FROM RMAN.RC_DATABASE WHERE NAME = 'MYDB');

 7)建立備用資料庫:簡單地啟動RMAN并連接配接到目标、目錄和輔助資料庫上。設定NLS語言環境變量,如果目标資料庫與預設的環境的語言屬性相同,則該變量沒有必要設定,如果NLS_LANG環境變量與目标資料庫的不同則有可能使備用資料庫建立失敗。

RMAN執行的備用資料庫建立工作隻需要幾個指令。用前述任務中建立的備份生成備用資料庫:

LINUX>rman trace=/opt/oracle/standby.log

RMAN>connect target sys/oracle@mydb

RMAN>connect catalog rman/rman@standby

RMAN>connect auxiliary sys/stby

 SET command ID TO 'Standby Creation';

 ALLOCATE auxiliary channel d1 TYPE DISK;

 duplicate target DATABASE FOR STANDBY dorecover;}

這向行指令用資料庫的備份建立了MYDB資料庫的副本,盡管這個腳本中的指令很少,但實際上RMAN完成了大量的工作:

Set command id :這個設定選項使RMAN填充了v$session視圖的client_inof列。是以,在STBY資料庫被建立時,可以将client_info的值設定為“Standby Creation”來查詢v$session表,并觀察會話的進行。

Duplicate target database for standby :這個指令建立備用資料庫需要完成大量的工作,首先,備用資料庫的控制檔案需要被複制到輔助資料庫init.ora檔案中的control_files參數值指定的位置,然後,目标資料庫備份中資料檔案将被還原到輔助資料庫的還原位置上。

Dorecover :當目标資料庫複制之後,備份資料庫将用增量RMAN備份和歸檔重做日志恢複。一直恢複到停止點的位置。

C:>rman trace=c:\oracle\standby.log

Recovery Manager: 版本9.2.0.1.0 - Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

Windows 2000 Version 5.1 Service Pack 2, CPU type 586

Starting with debugging turned off

RMAN> connect target sys/oracle@mydb

RMAN> connect auxiliary sys/stby@stby

聯機至輔助資料庫: mydb (未挂載)

RMAN> 2> 3> 4>

執行指令: SET COMMAND ID

通道d1: sid=13 devtype=DISK

開始Duplicate Db, 于 08-5月-08

列印儲存的指令檔: Memory Script

{

   restore clone standby controlfile to clone_cf;

   replicate clone controlfile from clone_cf;

   sql clone 'alter database mount standby database';

}

執行指令檔: Memory Script

開始restore, 于 08-5月-08

通道d1: 啟動資料檔案備份集的回複

通道d1: 回複控制檔案

輸出檔案名稱=C:\ORACLE\ORADATA\STBY\CONTROL01.CTL

通道d1: 回複備份片1

處理片=D:\ORACLEBAK\DBMYDB_12_1_654130144 标志=STBY_INC0 參數=NULL

通道d1: 回複完成

完成restore, 于 08-5月-08

複制控制檔案

輸入檔案名稱=C:\ORACLE\ORADATA\STBY\CONTROL01.CTL

輸出檔案名稱=C:\ORACLE\ORADATA\STBY\CONTROL02.CTL

輸出檔案名稱=C:\ORACLE\ORADATA\STBY\CONTROL03.CTL

sql 叙述句: alter database mount standby database

   set until scn 1170983;

   set newname for datafile 1 to

 "C:\ORACLE\ORADATA\STBY\SYSTEM01.DBF";

   set newname for datafile 2 to

 "C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF";

   set newname for datafile 3 to

 "C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF";

   set newname for datafile 4 to

 "C:\ORACLE\ORADATA\STBY\DRSYS01.DBF";

   set newname for datafile 5 to

 "C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF";

   set newname for datafile 6 to

 "C:\ORACLE\ORADATA\STBY\INDX1.DBF";

   set newname for datafile 7 to

 "C:\ORACLE\ORADATA\STBY\ODM01.DBF";

   set newname for datafile 8 to

 "C:\ORACLE\ORADATA\STBY\TOOLS01.DBF";

   set newname for datafile 9 to

 "C:\ORACLE\ORADATA\STBY\USERS01.DBF";

   set newname for datafile 10 to

 "C:\ORACLE\ORADATA\STBY\XDB01.DBF";

   set newname for datafile 11 to

 "C:\ORACLE\ORADATA\STBY\MYTS01.DBF";

   restore

   check readonly

   clone database

   ;

執行指令: SET until clause

執行指令: SET NEWNAME

通道d1: 正在設定要從備份集回複的資料檔案

正在将資料檔案 00001 回複為C:\ORACLE\ORADATA\STBY\SYSTEM01.DBF

正在将資料檔案 00002 回複為C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF

正在将資料檔案 00003 回複為C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF

正在将資料檔案 00004 回複為C:\ORACLE\ORADATA\STBY\DRSYS01.DBF

正在将資料檔案 00005 回複為C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF

正在将資料檔案 00006 回複為C:\ORACLE\ORADATA\STBY\INDX1.DBF

正在将資料檔案 00007 回複為C:\ORACLE\ORADATA\STBY\ODM01.DBF

正在将資料檔案 00008 回複為C:\ORACLE\ORADATA\STBY\TOOLS01.DBF

正在将資料檔案 00009 回複為C:\ORACLE\ORADATA\STBY\USERS01.DBF

正在将資料檔案 00010 回複為C:\ORACLE\ORADATA\STBY\XDB01.DBF

正在将資料檔案 00011 回複為C:\ORACLE\ORADATA\STBY\MYTS01.DBF

   switch clone datafile all;

資料檔案2 已切換至資料檔案複制本

輸入資料檔案複本recid=158 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF

資料檔案3 已切換至資料檔案複制本

輸入資料檔案複本recid=159 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF

資料檔案4 已切換至資料檔案複制本

輸入資料檔案複本recid=160 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\DRSYS01.DBF

資料檔案5 已切換至資料檔案複制本

輸入資料檔案複本recid=161 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF

資料檔案6 已切換至資料檔案複制本

輸入資料檔案複本recid=162 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\INDX1.DBF

資料檔案7 已切換至資料檔案複制本

輸入資料檔案複本recid=163 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\ODM01.DBF

資料檔案 8 已切換至資料檔案複制本

輸入資料檔案複本recid=164 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\TOOLS01.DBF

資料檔案9 已切換至資料檔案複制本

輸入資料檔案複本recid=165 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\USERS01.DBF

資料檔案10 已切換至資料檔案複制本

輸入資料檔案複本recid=166 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\XDB01.DBF

資料檔案11 已切換至資料檔案複制本

輸入資料檔案複本recid=167 戳記=654135499 檔案名稱=C:\ORACLE\ORADATA\STBY\MYTS01.DBF

   recover

   standby

    delete archivelog

開始recover, 于 08-5月-08

啟動媒體恢複

通道d1: 啟動存盤日志回複到預設目的

通道d1: 回複存盤日志

存盤日志系線=1 順序=4

存盤日志系線=1 順序=5

處理片=D:\ORACLEBAK\ARCMYDB_13_1_654130814 标志=TAG20080507T230014 參數=NULL

存盤日志檔案名稱=C:\ORACLE\ORADATA\STBY\ARCHIVE1_4.DBF 系線=1 順序=4

通道clone_default: 删除存盤日志

存盤日志檔案名稱=C:\ORACLE\ORADATA\STBY\ARCHIVE1_4.DBF recid=2 戳記=654135509

存盤日志檔案名稱=C:\ORACLE\ORADATA\STBY\ARCHIVE1_5.DBF 系線=1 順序=5

存盤日志檔案名稱=C:\ORACLE\ORADATA\STBY\ARCHIVE1_5.DBF recid=1 戳記=654135507

媒體恢複完成

完成recover, 于 08-5月-08

完成Duplicate Db, 于 08-5月-08

8)啟動管理恢複

修改目标資料庫的參數檔案,然後重新開機執行個體,如下:

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = "MANDATORY SERVICE=STBY REOPEN=30";

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE2 = ENABLE;

指令備用資料庫開始管理恢複:

SQL>RECOVER MANAGED STANDBY DATABASE;

當送出這個指令之後,可能會認為這個指令的執行被堵塞了,得不到任何回報資訊,SQL提示符也不出現,這是正常的。此時STBY資料庫已經啟動了RFS背景程序接收任何從MYDB資料庫傳送來的歸檔日志,存放在由standby_archive_dest參數指定的位置上,生成歸檔日志并應用它們的工作持續進行,直到管理恢複被取消。

SQL>RECOVER MANAGED STANDBY DATABASE CANCEL;

上面這個取消指令必須在STBY資料庫上的另一個SQL*PLUS會話中送出。

 9)以隻讀方式打開備用資料庫

取消STBY資料庫上的恢複,打開STBY資料庫查驗資料變化情況:

SQL>ALTER DATABASE OPEN READ ONLY;

 10)将備用資料庫傳回到恢複模式

為了使STBY資料庫從隻讀打開模式傳回到恢複模式,首先必須關閉資料庫:

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP NOMOUNT;

SQL>ALTER DATABASE MOUNT STANDBY DATABASE;

 11)激活備用資料庫

SQL>ALTER DATABASE ACTIVATE STANDBY DATABASE;

SQL>STARTUP;

一旦建立了備用資料庫,就可以用RMAN來備份這個備用資料庫了,備份備用資料庫實際上就是對目标資料庫的備份。這樣就減少了主伺服器的資源開銷。不能用RMAN對備用控制檔案進行備份,必須從目标資料庫進行控制檔案的備份。