RMAN 複製目標資料庫的理論知識

murkey發表於2013-12-18

一. RMAN 複製的基礎

1.1 使用RMAN 複製的原因

RMAN 複製是必須的。 我們可以只將控制檔案複製到新位置,然後再執行還原與恢復操作。 但是在使用了恢復目錄的情況下,如果不使用RMAN複製來複制資料庫,就存在許多問題。 由於RMAN 基於資料庫的DBID 在恢復目錄中註冊資料庫,因此即使存在同名的資料庫(inint.ora 中的DB_NAME引數),資料庫ID也能唯一地標識資料庫。如果不使用duplicate命令,就會存在具有相同的DBID的兩個資料庫。此時,嘗試在相同的目錄中註冊複製的資料庫,就會報錯:

Rman-20002: target database already registered in recovery catalog;

如果忽略,並繼續執行資料庫的備份操作,會收到另一個錯誤:

Rman-20011: target database incarnation is not current in recovery catalog

產生這種錯誤訊息的原因是RMAN 認為使用者複製的只是產品系統的還原版本,所以該複製當作產品伺服器的當前對應物,這樣RMAN就完全不知道真正的產品伺服器是什麼。 雖然我們可以將對應物重置回與產品伺服器匹配的一個對應物,但是實際上已經破壞了恢復目錄,所以應當取消資料庫的註冊,然後在恢復目錄中重新註冊這個資料庫。

如果沒有使用恢復目錄,非完全複製的複製也會造成嚴重的損害。 例如,在與主資料庫相同的系統中複製資料庫,然後在磁帶上備份這兩個資料庫,由於沒有使用恢復目錄,所以會開啟這兩個例項的控制檔案自動備份。 某天,突然丟失了一個磁碟陣列資訊,整個系統出現故障,同時還丟失了所有資料庫和控制檔案。 此時,會認為由於自動備份了控制檔案,所以只需要使用其中一個備份就能夠恢復系統。

但實際情況並非如此,restore controlfile from autobackup 命令使用DBID 跟蹤控制檔案的自動備份,由於兩個資料庫都備份在同一個磁帶上,所以該命令可能從錯誤的資料庫備份中還原控制檔案,使用者得到的就是含有錯誤資訊的錯誤檔案。

1.2 複製的體系結構

這小節介紹複製的工作原理。 使用時,RMAN 連線到目標資料庫和恢復目錄(如果有),使用者透過這個連線才能夠訪問目標資料庫控制檔案中的備份位置的詳細資訊。 連線目標資料庫後,還必須連線輔助例項。 輔助例項駐留複製的資料庫。 啟動複製操作前,必須為輔助例項構建一個init.ora檔案,同時以nomount模式啟動輔助例項,這樣就可以初始化記憶體段,並且RMAN 可以生成到這個輔助例項的sysdba連線。由於輔助例項仍然不包含控制檔案(複製操作會負責建立),因此我們不能載入這個輔助例項。

生成連線後,就可以使用duplicate 命令,複製例項:

Duplicate target database to SID;

複製程式分為一下這些不同的階段:

(1)RMAN 確定備份的狀態和位置

(2)RMAN 在輔助例項上分配輔助通道

(3)RMAN 在輔助例項中還原資料檔案

(4)RMAN 構建新的輔助控制檔案

(5)如果有必要,RMAN 從備份中還原歸檔日誌,同時執行任何必要的恢復操作。

(6)RMAN 重置輔助例項的DBID,並且使用OPEN RESETLOGS 命令開啟輔助資料庫。

首先,RMAN 設定執行時(runtime)引數,如duplicate命令中的until time 子句。 接著RMAN 基於這些引數檢查目標資料庫的控制檔案和恢復目錄,確定適當的備份。 隨後,RMAN建立訪問備份的遠端過程呼叫,但是不會在目標資料庫上執行程式碼,RMAN 會在輔助例項上建立一個稱為輔助通道(auxiliary channel)的通道程式。 RMAN 向這個通道傳遞對DBMS_BACKUP_RESTORE資料包的呼叫。緊接著,輔助例項訪問備份和還原所有必須的資料檔案。

1.2.1 輔助通道配置

為了執行復制操作,RMAN 必須在輔助例項上分配一個或多個通道程式。 從Oracle 9i開始,由於使用目標例項控制檔案中儲存的永久配置引數可以自動建立輔助通道,所以不必在複製時手工地分配輔助通道。輔助通道的構成主要來自於為目標通道建立的引數,其預設裝置型別和並行化幾倍都使用與目標通道設定相同的永久引數。 因此,如果使用磁碟上的備份執行復制操作,就不需要在配置輔助通道。 不過,如果利用磁帶上的備份執行復制操作,就必須配置輔助通道,以包含目標通道具有的全部介質管理器環境引數。 如下面例項中,將預設裝置型別設定為磁帶,預設的並行話級別設定為2:

Configure default device type to sbt;

Configure device type sbt parallelism 2;

Configure auxiliary channel 1 device type sbt parms="env=(nb_ora_serv=mgtserv,nb_ora_class=oracle)";

Configure auxiliary channel 2 device type sbt parms="env=(nb_ora_serv=mgtserv,nb_ora_class=oracle)";

1.2.2 將資料檔案還原到不同的檔案位置

載入新的控制檔案後,RMAN就可以開始還原資料檔案。如果在駐留目標資料庫的相同伺服器上覆制資料庫,就必須修改資料檔案還原的位置。

即使將資料檔案還原到不同的伺服器上,載入點和目錄結構中的差異也要求使用新的檔案位置。 我們可以使用三種方法來修改複製程式的資料還原步驟以指向新的檔案位置。

(1) 使用configure 命令,為需要配置新位置的所有資料檔案配置auxname,這個配置儲存在目標資料庫的控制檔案中。

Configure auxname for datafile 1 to '/u01/oradata/sidname/system01.dbf'

Configure auxname for datafile 2 to '/u01/oradata/sidname/undo01.dbf';

......

(2) 在run程式碼塊中指定新的資料檔名:

Run{

Allocate channel c1 type 'sbt_tape';

Set newname for datafile 1 to '/u01/oradata/sidname/system01.dbf';

Set newname for datafile 2 to '/u01/oradata/sidname/undo01.dbf';

Duplicate target database to auxsidname;

}

(3) 在輔助例項的init.ora 檔案中新增DB_FILE_NAME_CONVERT引數。該引數有2個字串,第一個為資料檔案在目標資料庫上的原始位置,第二個是資料檔案在輔助例項中的新位置。如:

Db_file_name_convert(

'/u01/oradata/prod/system01.dbf','/u01/oradata/dave/system01.dbf',

'/u01/oradata/prod/undo01.dbf','/u01/oradata/dave/undo01.dbf')

但是當資料檔案比較多的時候,這種方法就有點麻煩,我們可以寫到資料檔案例項名這一層即可,其他的會自動完成,如:

db_file_name_convert = (''/u01/oradata/prod','/u01/oradata/dave')

1.2.3 建立新的控制檔案

還原完所有的檔案後,複製操作會為輔助例項建立新的控制檔案。透過使用duplicate命令中概述的各種引數,RMAN在輔助例項上執行create controlfile命令。建立完控制檔案後,可以載入這個輔助資料庫。 此時,RMAN執行切換操作切換到新的檔案,這個切換操作可以使用RMAN修改輔助站點上的新控制檔案以指向資料檔案位置。

1.2.4 恢復歸檔日誌

還原和切換完檔案後,就能夠對資料庫執行恢復操作。 此時即可以將資料庫恢復到當前時間點,可以將資料庫恢復到until time子句指定的時間點。要執行恢復操作,RMAN需要訪問歸檔日誌。 如果RMAN 備份了歸檔日誌,RMAN就能夠將這些歸檔日誌從備份位置還原到輔助資料庫init.ora 檔案中指定的Log_archive_dest位置。我們也可以手工地將歸檔日誌移動到新例項要求的位置,這樣RMAN 就能夠不需要還原歸檔日誌而在磁碟上查詢到這些檔案。 如果在目標資料庫當前駐留的相同伺服器上執行復制操作,RMAN就能夠在目標資料庫的LOG_archive_dest 位置中查詢到歸檔日誌。

還原完歸檔日誌後,RMAN會執行一些必需的恢復操作。 如果沒有指定結束恢復操作的時間點,RMAN 會還原到最後一個可用的歸檔日誌,然後結束恢復操作。 在複製操作期間,RMAN不能進一步檢查聯機重做日誌檔案的恢復資訊。到達歸檔日誌的結束點後,RMAN 停止恢復操作。如果RMAN從備份中還原了歸檔日誌,這些歸檔日誌就會在恢復操作完成後被刪除。

1.2.5 修改資料庫ID(DBID)

介質恢復完成後,資料庫將處於一致的狀態中,此時RMAN將修改新複製的DBID。由於在這個時間點之前的所有操作都要求複製資料庫與目標資料庫具有相同的DBID,所以RMAN必須等待複製資料庫中的其他動作全部完成。如果控制檔案具有不同的DBID,複製在介質恢復期間就不能應用歸檔日誌。

修改DBID的程式非常簡單,RMAN 有一個稱為dbms_backup_restore.zerodbid()的過程。 在資料庫處於載入但未開啟的狀態時,這個過程會檢視檔案頭並將每個檔案頭中的DBID清零。 隨後,RMAN關閉這個資料庫並再次重新建立輔助控制檔案。 重新構建控制檔案時,Oracle會檢查檔案頭中的DBID,如果沒有發現任何DBID,Oracle 就會生成一個新的DBID並且將其加入到每個檔案頭中。

如果手工的使用zerodbid()過程要非常謹慎。 此外Oracle 在9i後提供了一個dbnewid的使用程式,這個程式能安全地為資料庫生成新的ID.

1.2.6 在輔助站點上建立日誌檔案

在完成複製程式並執行最有一條open resetlogs命令時,RMAN 必須為輔助資料庫構建全新的日誌檔案。 這種情況下在執行open resetlogs命令時通常會發生,不過在使用duplicate命令時需要確定新日誌檔案的定義。如果在目標資料庫所在的系統上執行復制操作,至少需要重命令日誌檔案。

如果要修改新資料庫使用的日誌檔案的大小,數目和位置,可以在執行duplicate命令時指定新日誌檔案的定義:

Duplicate target database to auxname

Pfile=/u01/oracle/admin/auxname/init.ora

Logfile=

'/u01/oracle/oradate/auxname/redo01.log' size 100m,

'/u01/oracle/oradate/auxname/redo02.log' size 100m,

'/u01/oracle/oradate/auxname/redo03.log' size 100m;

此外,還可以使用目標資料庫中已有的日誌檔案定義,並且可以使用init.ora 檔案的LOG_FILE_NAME_CONVERT引數簡單的將該定義轉移到新的位置中。如:

log_file_name_convert = ('/u01/app/oracle/oradata/test01','/u01/oradata/dvdsame');

二. 複製的位置

2.1 複製到相同的伺服器

2.1.1 記憶體問題

Oracle 基於init.ora 檔案中的DB_NAME引數值引用伺服器上的記憶體段,因此,Oracle 不允許在同一個系統中執行具有相同DB_NAME引數值的兩個例項。如果嘗試載入具有相同名稱的另一個例項,就會得到下面的錯誤:

ORA-01102: cannot mount database in EXCLUSIVE mode.

因此,在同一個系統中執行復制操作時,必須將輔助例項init.ora 檔案中的DB_NAME引數修改成與目標例項不同的資料庫名,如:

Db_name='orcl'

Instance_name='orcl'

2.1.2 檔案位置問題

在1.2.2小節中我們討論了三種方法來處理檔案位置的問題,最簡單的就是使用db_file_name_convert引數。

除了資料檔案外,重做日誌位置也是需要關注的。我們可以在duplicate命令中使用logfile關鍵字來構建完全不同的重做檔案,構建這些重做檔案具有不同的大小,組數和成員數,這個選項實際上重寫了create controlfile命令的logfile引數。也可以在init.ora檔案中新增log_file_name_convert引數來修改重做日誌的位置。

2.2 複製到相同伺服器的不同ORACLE_HOME目錄

當輔助例項具有不同的ORACLE_HOME目錄時,所遵守的規則會稍微有所不同,除了輔助到相同伺服器要遵守的規則外,還需要考慮備份片的位置。如果複製磁碟備份,只需要提前確認具有相應的OS許可權。然後,如果複製磁帶備份,就必須確認MML檔案以相同的方式連線目標例項的ORACLE_HOME和輔助例項的ORACLE_HOME,否則輔助例項就不能訪問磁帶備份,並且由於介質管理器不可訪問,複製操作將會失敗。

2.3 複製到遠端伺服器

2.3.1 記憶體問題

與複製到相同伺服器的情況不同,我們不必考慮init.ora 檔案中的DB_NAME引數,因為在不同的伺服器上,Oracle 不會限制記憶體所使用的資料庫名。

2.3.2 檔案位置問題

由於在一個新的伺服器上,所以也不必立即為輔助例項修改檔案位置資訊。在新的伺服器上不會執行具有相同檔案的另一個資料庫,因此可以保留和目標例項相同的所有檔案規範,這樣能夠避免在配置中出錯。同樣的,在位於不同的系統中,我們可以簡化許多程式。

如果沒有修改檔案的位置,就必須在duplicate命令中指定nofilenamecheck引數,該引數通知複製操作不必在執行還原操作前確認檔名是不同的。如果沒有指定nofilenamecheck引數,rman會給出一條錯誤訊息。

對於這種簡單的設定來說,需要注意的一個問題是有可能輔助主機不具有與目標主機相同的檔案結構和載入點設定。如果載入點或驅動器配置不同,我們仍然需要為輔助例項修改檔案規範,這樣RMAN才能在實際存在的位置執行還原操作。

2.3.3 備份位置為磁碟

在不同的伺服器上執行還原操作的複雜性在於提供訪問的不同伺服器上備份的輔助通道程式功能。對於磁碟備份和磁帶備份來說,我們都必須考慮這個問題。

如果要複製磁碟備份,我們的選擇會受到限制。RMAN將對dbms_backup_restore資料包的呼叫傳遞給輔助例項上的通道程式,但是該操作沒有考慮檔案系統的差異。RMAN必須在目標資料庫控制檔案中記錄實際位置和格式中查詢備份片。如使用下面的命令在目標系統上執行完全備份操作:

Backup database format='/u01/backup/prod/%U';

執行這條命令會在/u01/backup/prod目錄中建立一個備份片,並且在目標資料庫控制檔案中記錄這個備份。在隨後的複製操作期間,RMAN 會向輔助例項傳遞file restore命令,並且通知輔助例項從/u01/backup/prod中還原檔案。 這就以為著在輔助例項上必須存在一個名為/u01的載入點和backup/prod目錄,並且該目錄下有目標資料庫的備份片。如果不存在這些元素,複製操作就會失敗。

有三種方法來複制磁碟備份:

第一種:將備份檔案從目標主機複製到輔助主機的相同位置,該方法非常直觀。但是這種方法要透過網路大量地傳輸檔案。

第二種方法是從輔助主機中NFS載入(NFS-mount)目標主機上的備份位置。只有當載入目標的位置與RMAN將使用的載入點名稱相同的情況下,才能執行復制操作。

如: mount cervantes:/u04/backup/prod /u04/backup/prod

如果是windows平臺,我們載入的就是網路驅動器,而不是NFS,此時應用的規則是相同的:輔助主機與目標主機上的驅動器規範必須相同。因此,如果備份被寫入F:/backup,就必須能夠將F:用作網路驅動器,否則複製操作將會失敗。此外,必須設定輔助服務(oracleserverSID)和監聽程式服務(orcleOraHometnslistener), 並且具有讀寫許可權的域管理員身份登陸輔助主機和目標主機。

第三中方法,修改備份位置。 Oracle 10g提供了2個命令:backup backupset命令和catalog backupset命令。使用backup backupset 命令可以備份磁碟上的前一個備份集,並且將其移動到不同的磁碟位置。 這就提供了很大的靈活性。我們可以將備份片從/u01/backup/prod移動到/u02/backup/prod,然後從輔助系統中NFS載入/u02/backup/prod. 還可以從目標主機NFS載入輔助主機上的一個驅動器,然後使用backup backupset命令將備份移動到輔助主機上。

Catalog backupset命令提供了重新定位新伺服器上備份集的另一種簡單方法。 為了使RMAN瞭解備份集所在的位置,只需要告訴RMAN對指定的檔案或目錄編寫目錄,它就會在該位置查詢任何有效的備份並且為其生成後設資料。

2.3.4 備份位置為磁帶

將磁碟備份複製到遠端伺服器比將磁碟備份複製到遠端伺服器容易很多。因為磁帶備份本身只有檔案控制程式碼而不具有檔案位置。RMAN 只關心磁帶備份的檔案控制程式碼,而介質管理器完全控制檔案控制程式碼與具體磁帶位置的聯絡。因此複製磁帶備份時採用的所有配置都來自於介質管理器的配置。

首先,必須在輔助站點上配置MML檔案,這個配置與目標站點上的配置相同。由於輔助通道執行還原操作,它必須能夠執行還原操作。

其次,必須確認正確地配置了介質管理伺服器,也就是說必須在目標節點鎖註冊的同一個介質管理伺服器中將輔助站點註冊為一個客戶端,並且輔助站點必須具有為了還原而能夠訪問磁帶的必要許可權。 最重要的是,必須支援輔助站點還原不同服務上生成的備份。由於能夠安全地將一個客戶端上的檔案還原到另一個客戶端是一個安全漏洞,大多數介質管理軟體預設禁用這個功能。

最後一個配置步驟是設定輔助通道。RMAN在輔助例項上分配一個或多個通道來執行復制操作中的還原與恢復步驟。從RMAN連線到目標資料庫時,可以使用configure命令配置這個通道。用於輔助通道的環境變數parms必須包含通常的MML環境控制變數,尤其需要指定生成備份的客戶端。

2.4 複製和網路

在這裡我們要解決2個問題,一個是口令檔案,另一個就是監聽程式。

如果使用遠端連線,就必須為目標節點配置口令檔案。還需要配置監聽,監聽使用專用的伺服器程式,而不是共享的伺服器程式。

在Oracle 10g中,如果只連線開啟的資料庫,就不需要listener.ora檔案,這是因為資料庫的PMON程式使用系統上執行的監聽程式自動註冊資料庫。因此,即使在Oracle 10g的預設安裝後沒有任何配置操作,也能看見一個正在執行的,監聽資料庫的監聽程式。

關於口令檔案的一些說明:

在UNIX平臺上,口令檔名必須為orapw, 其中SID 為例項名。口令檔案存放在$ORACLE_HOME/dbs目錄下。

在Windows平臺上,口令檔名格式必須為pwd.ora。口令檔案存在$ORACLE_HOME/database目錄下。

我們在建立口令檔案的時候,只要把檔案建立到指定位置,oracle 就能自己識別。如:

UNIX: orapwd file=/u01/database/db_1/dbs/orapwORCL password=admin

WINDOWS: orapwd file=d:/database/db_1/database/pwdORCL.ora password=admin.

注意:1. 口令檔案中的例項名區分大小寫。

2. Init.ora中的 Remote_login_passwordfile 引數要設為excusive。

相關知識可以參考我的Blog:

Oracle 資料庫監聽配置

http://blog.csdn.net/tianlesoftware/archive/2009/11/25/4861572.aspx

Oracle OS認證 口令檔案 密碼丟失處理

http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx

Oracle Listener 動態註冊 與 靜態註冊

http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx

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

相關文章