RMAN 複製目標數據庫的理論知識

一. 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 修改數據庫IDDBID

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

修改DBID的進程非常簡單,RMAN 有一個稱爲dbms_backup_restore.zerodbid()的過程。 在數據庫處於加載但未打開的狀態時,這個過程會查看文件頭並將每個文件頭中的DBID清零。 隨後,RMAN關閉這個數據庫並再次重新創建輔助控制文件。 重新構建控制文件時,Oracle會檢查文件頭中的DBID,如果沒有發現任何DBIDOracle 就會生成一個新的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>, 其中SID 爲實例名。口令文件存放在$ORACLE_HOME/dbs目錄下。

Windows平臺上,口令文件名格式必須爲pwd<SID>.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章