💫《博主介紹》:?又是一天沒白過,我是奈斯,DBA一名?
💫《擅長領域》:??擅長Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式數據倉庫)、Linux,也在擴展大數據方向的知識面??
💖💖💖大佬們都喜歡靜靜的看文章,并且也會默默的點贊收藏加關注💖💖💖
? ? 在上一篇文章中,我們深入探討了RMAN備份策略的重要性及其制定方法,相信各位對如何構建一個穩健的備份體系已經有了清晰的認識。從這篇文章開始,我們將繼續這一話題,但方向將轉向RMAN的恢復流程,特別是如何從RAC(Real Application Clusters)環境的RMAN備份片中恢復數據到單機環境。
? ? 在企業的數據庫運維過程中,備份和恢復是密不可分的兩個環節。備份提供了數據安全的保障,而恢復則是確保在數據丟失或系統崩潰時能夠迅速恢復業務運行的關鍵。特別是在RAC環境到單機環境的遷移過程中,恢復流程的正確性和高效性更是至關重要。
? ? 本文將詳細介紹 如何使用RMAN從RAC環境的備份片中恢復數據到單機環境 。我們將從恢復前的準備工作講起,涵蓋恢復步驟的每一個環節,包括恢復控制文件、數據文件、參數文件、歸檔等關鍵組件。同時,我們還將討論在恢復過程中可能遇到的問題和解決方案,以確保整個恢復過程的順利進行。
? ? 然而,RMAN所涉及的內容之廣、之深,使得難以在單篇文章中全面涵蓋。所以我將理論、命令、備份策略、異機恢復、壞塊處理等分成八篇文章去講,即使分為八篇也有不少內容沒有涵蓋到,所以這八篇文章都是精華,看完這八篇就可以解決95%以上的RMAN相關工作內容了。八篇文章的內容分別如下:
- 第一篇:rman物理備份工具的基礎理論概述
- 第二篇:rman工具實用指南:常用命令詳解與實踐
- 第三篇:rman標準化全庫備份策略:完整備份or增量備份
- 第四篇:rman全庫異機恢復:從RAC環境到單機測試環境的轉移(當前篇)
- 第五篇:rman全庫異機恢復:從單機環境到RAC測試環境的轉移
- 第六篇:rman時間點異機恢復:從單機環境到單機測試環境的轉移
- 第七篇:Oracle數據庫物理壞塊處理:rman修復壞塊實踐與案例分析
- 第八篇:邏輯備份工具expdp(exp)/impdp(imp)和物理備份工具rman的區別和各自的使用場景總匯
? ? ? ? ? ? ? ? ? ?
恢復所使用的rman備份片:
在上篇文章中, 我們都知道了rman有完整備份or增量備份,所以通過那種備份都可以實現全庫的異機恢復 ,但是我的建議使用rman完整備份+歸檔備份即可?,而不建議使用rman基本增量備份+rman差異增量備份+歸檔備份(為什么使用完整備份可以參考上篇文章的原因哦,我有詳細介紹,直通車👉【Oracle篇】rman標準化全庫備份策略:完整備份or增量備份(第三篇,總共八篇)_rman 全量備份-CSDN博客👈),所以這篇文章所使用的rman備份片為rman完整備份+歸檔備份。
? ? ? ? ? ? ?
那么廢話不多說,開始今天的恢復內容!!!
? ? ? ? ? ? ??
RAC源機:
一、對在RAC上的實例進行全庫備份。包括數據文件、控制文件、參數文件、歸檔。備份策略參考👉【Oracle篇】rman標準化全庫備份策略:完整備份or增量備份(第三篇,總共八篇)_rman 全量備份-CSDN博客👈
二、通過nfs或者scp到目標FS數據庫。源庫和異機的備份片的路徑要一致,不然報找不到備份片。如果路徑不一致可以通過catalog將未識別的RMAN備份集注冊到控制文件:
scp拷貝到FS異機的/backup/full目錄下:
? ? ? ? ? ? ??
? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
FS異機:
一、FS已經安裝好了一套單機,與源庫實例名可以保持一致,也可以不一致。進行還原文件。
(1)定義一個空實例的SID名,啟動到nomount狀態
注意:db_unique_name、service_names、instance_name不會涉及在控制文件里,但db_name會涉及到控制文件和數據文件頭部中。所以db_name進行異機遷移,不管遷移到FS還是遷移到rac環境,db_name是不能變的。想要變動db_name就只能通過expdp這種邏輯遷移等。
[oracle@11g dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora *.db_name='orcl' *.instance_name='orcl'[oracle@11g ~]$ export ORACLE_SID=orcl SQL> startup nomount
? ? ? ? ??
(2)還原參數文件
[oracle@rac1 ~]$ rman target / run { ALLOCATE CHANNEL ch00 TYPE disk; restore spfile to '/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora' from '/backup/full/orcl_spfile_1684_1_20240123'; release channel ch00; }SQL> create pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora' from spfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora';[oracle@11g dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora *.audit_file_dest='/oracle/app/oracle/admin/orcl/adump' *.audit_trail='NONE' *.compatible='11.2.0.4.0' *.db_block_size=8192 *.db_domain='' *.db_files=8192 *.db_name='orcl' *.instance_name='orcl' *.diagnostic_dest='/oracle/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.log_archive_format='%t_%s_%r.arc' *.memory_target=2306867200 *.remote_login_passwordfile='exclusive' *.log_archive_dest_1='location=/oracle/app/oracle/product/11.2.0/db_1/dbs/arch'SQL> create spfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora' from pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora'; SQL> shutdown immediate SQL> startup nomount SQL> show parameter spfile
? ? ? ? ? ? ? ?
(3)還原控制文件
[oracle@lf ~]$ rman target / run { ALLOCATE CHANNEL ch00 TYPE disk; restore controlfile to '/oracle/app/oracle/oradata/orcl/control.ctl' from '/backup/full/orcl_ctl_1683_1_20240123'; release channel ch00; }修改控制文件的參數,啟動至mount狀態: SQL> show parameter control SQL> alter system set control_files='/oracle/app/oracle/oradata/orcl/control.ctl' scope=spfile; SQL> shutdown immediate SQL> startup mount SQL> show parameter control
? ? ? ? ? ?
(4)重命名redo日志組
注意:1)通過rman定義set newname for logfile設置路徑失敗,所以只能在sqlplus中重命名redo日志組。12c版本之后可能支持了在rman中定義set newname for logfile(待驗證)
? ? ? ? ? 2)只進行重命名redo日志組操作,先不進行刪除和重建redo日志組,如果同時進行重建redo日志組,就會導致在后續追歸檔日志階段不能應用歸檔日志(執行recover database using backup controlfile until cancel;命令,報錯ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORACLE)
? ? ? ? ? ?3)先還原數據文件,然后再重命名redo日志組,可能會導致v$logfile里面日志組的路徑全部直接成為了+ASM磁盤組沒有具體路徑的情況,比如:全部都成了+DATA這樣,這樣的話部分日志組因為當前在用刪除不了,并且重命名redo日志組是需要具體路徑的,但是都變成了+DATA就沒有辦法識別到是哪一個日志組。所以先進行redo日志組的重命名,然后再進行數據文件還原,就可以避免這個問題。
SQL> select * from v$logfile; ---重做日志組 SQL> select * from v$standby_log; ---鏡像日志組(dg)
SQL> alter database rename file '+DATA/orcl/onlinelog/group_1.266.1140875825' to '/oracle/app/oracle/oradata/orcl/redo1.log'; alter database rename file '+DATA/orcl/onlinelog/group_2.257.1140875825' to '/oracle/app/oracle/oradata/orcl/redo2.log'; alter database rename file '+DATA/orcl/onlinelog/group_3.275.1140875827' to '/oracle/app/oracle/oradata/orcl/redo3.log'; alter database rename file '+DATA/orcl/onlinelog/group_4.276.1140875827' to '/oracle/app/oracle/oradata/orcl/redo4.log'; alter database rename file '+DATA/orcl/onlinelog/group_5.281.1140882455' to '/oracle/app/oracle/oradata/orcl/redo5.log'; alter database rename file '+DATA/orcl/onlinelog/group_6.293.1140883981' to '/oracle/app/oracle/oradata/orcl/redo6.log'; alter database rename file '+DATA/orcl/onlinelog/group_7.294.1140883981' to '/oracle/app/oracle/oradata/orcl/redo7.log'; alter database rename file '+DATA/orcl/onlinelog/group_8.295.1140883981' to '/oracle/app/oracle/oradata/orcl/redo8.log';
? ? ? ? ? ??
(5)還原數據文件
注意:rman備份記錄在控制文件中,啟動到mount狀態時,就可以查到rman的備份信息。在恢復數據文件時,會自動找備份片的位置進行恢復,所以源庫和異機的備份片的路徑要一致,不然報找不到備份片。如果路徑不一致可以通過catalog將未識別的RMAN備份集注冊到控制文件。
RMAN> CATALOG START WITH '/backup/full'; ---注冊目錄(多用于批量注冊歸檔,也可以用于注冊備份片) RMAN> report schema; ---顯示實例的信息。根據數據文件和臨時文件ID恢復
RMAN> run { ALLOCATE CHANNEL ch00 TYPE disk; ALLOCATE CHANNEL ch01 TYPE disk; ###還原數據文件到新的路徑 set newname for datafile 1 to '/oracle/app/oracle/oradata/orcl/system.259.1140874089'; set newname for datafile 2 to '/oracle/app/oracle/oradata/orcl/sysaux.260.1140874091'; set newname for datafile 3 to '/oracle/app/oracle/oradata/orcl/undotbs1.261.1140874091'; set newname for datafile 4 to '/oracle/app/oracle/oradata/orcl/undotbs2.263.1140874093'; set newname for datafile 5 to '/oracle/app/oracle/oradata/orcl/users.264.1140874093'; set newname for datafile 6 to '/oracle/app/oracle/oradata/orcl/itpux.277.1140877153'; set newname for datafile 7 to '/oracle/app/oracle/oradata/orcl/liu.472.1158545801'; set newname for datafile 8 to '/oracle/app/oracle/oradata/orcl/liu.427.1153721763'; ###還原臨時文件到新的路徑 set newname for tempfile 1 to '/oracle/app/oracle/oradata/orcl/temp.262.1140874091'; ###自動全庫恢復。restore database會導致所有文件覆蓋還原所以謹慎,restore datafile是指定單個文件從rman中還原。 restore database; ###將已發出SET NEWNAME for DATAFILE命令的所有數據文件切換為其新名稱。如果是asm管理的文件可能在設置路徑時出現問題,導致控制文件的路徑和物理路徑不對應。所以建議源庫為asm轉文件系統時不設置這個參數,手動注冊和通知控制文件路徑catalog datafilecopy和switch datafile。 switch datafile all; release channel ch00; release channel ch01; }
? ? ? ? ? ? ? ? ?
(6)查看數據文件頭部和控制文件頭部還原的時間
SQL> select name from v$datafile;SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header; ---數據文件頭部SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE; ---控制文件頭部
? ? ? ? ?
二、恢復數據
(1)還原歸檔
注意:先執行一遍recover database using backup controlfile until cancel;和v$datafile_header、V$DATAFILE就會輸出當前恢復的SCN時間,然后根據時間再決定恢復幾天的歸檔,或者也會顯示從那個歸檔開始恢復,確定了開始恢復的歸檔號之后,就按照序列號恢復RESTORE ARCHIVELOG sequence,恢復到最新的序列號通過list backup查看最后一個備份的歸檔號。
RMAN> run{ ALLOCATE CHANNEL ch00 TYPE disk; set archivelog destination to '/backup/arch'; restore archivelog from time 'sysdate-10'; release channel ch00; } ---如果恢復報錯no backup of archived log,根據序列號恢復RESTORE ARCHIVELOG sequence BETWEEN 5877 AND 5971 thread 2;
? ? ? ? ? ? ?
(2)追歸檔日志(使用備份的控制文件恢復時,控制文件會根據歸檔追scn,同時數據文件的scn也會恢復的最新)? ?
SQL> set logsource /backup/arch; ---set logsource +路徑:設置的是數據庫讀取歸檔的路徑,默認的讀取的路徑是archive log list,如果通過rman恢復的是其他路徑,那么就需要重新設置一下讀取歸檔的路徑。SQL> recover database using backup controlfile until cancel; auto SQL> recover database using backup controlfile until cancel; CancelSQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header; ---數據文件頭部SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE; ---控制文件頭部
? ? ? ? ? ? ? ?
(3)刪除不必要的redo日志組
SQL> select * from v$logfile; ---重做日志組 SQL> select * from v$standby_log; ---鏡像日志組(dg)
SQL> alter database drop logfile group 5; alter database drop logfile group 6; alter database drop logfile group 7; alter database drop logfile group 8;
? ? ? ? ? ? ??
(4)重建臨時文件
SQL> shutdown immediate SQL> startup SQL> alter database open resetlogs; SQL> select * from v$tablespace; ---表空間中有temp表空間但是告警日志中顯示需要重建信息的temp數據文件
temp臨時文件的路徑還是+ASM磁盤組,所以新增一個臨時文件,然后刪除臨時文件為1的+ASM磁盤組的臨時文件: SQL> select * from v$tempfile;
SQL> alter tablespace temp add tempfile '/oracle/app/oracle/oradata/orcl/temp.dbf' size 31G autoextend off; SQL> alter tablespace temp drop tempfile 1; 注意:如果刪除臨時文件失敗,需要先刪除臨時表空間,然后重建。
? ? ? ? ?
(5)禁用重做日志線程2。因為原先是rac環境,所以每個實例都是獨立的redo線程,現在恢復到單機只需要1個redo線程,單機只會在線程1的日志組來回切換
SQL> select * from v$logfile; ---重做日志組 SQL> select * from v$standby_log; ---鏡像日志組(dg) SQL> select * from v$log; ---rac環境下有多個線程的重做日志組,所以在單機環境下重做日志只保留線程1
SQL> alter database disable thread 2; ---禁用重做日志線程2 SQL> alter database drop logfile group 3; alter database drop logfile group 4;
? ? ? ? ? ?
(6)刪除UNDOTBS2表空間(undo同redo一樣是分線程的)
SQL> drop tablespace UNDOTBS2 including contents and datafiles;
? ? ? ?
三、啟動單機數據庫
SQL> shutdown immediate
SQL> startup
? ? ? ? ??
四、物理遷移完成查看狀態
(1)通過rman恢復的實例是和生產環境一模一樣的,所以只需要做后續參數部分的優化
參數優化參考RAC環境的配置即可😄
? ??
(2)檢查實例情況
數據庫文件和undo: set linesize 500 set pagesize 99 col file_name for a70 col file_id for 9999999 col status for a10 col ts_name for a25 col cur_mb for 99999 col max_mb for 99999 select status, file_id, file_name, tablespace_name ts_name,blocks/128 tolal_mb, maxblocks/128 max_mb,AUTOEXTENSIBLE from dba_data_files order by file_name;temp臨時表空間: select username,temporary_tablespace from dba_users; set linesize 230 col file_name for a65 select FILE_ID,FILE_NAME,TABLESPACE_NAME,bytes/1024/1024 tolal_mb,status,AUTOEXTENSIBLE,MAXBYTES/1024/1024 max_mb from dba_temp_files;redo重做日志: set linesize 230 col member for a50 select * from v$logfile; select * from v$log;查看數據庫實例的狀態和模式: select instance_name , status from v$instance ; select name, open_mode from v$database ;
? ? 兄弟們關于《rman全庫異機恢復:從RAC環境到單機測試環境的轉移》這篇文章就到這里啦,我自己覺得這篇文章寫的非常詳細了,并且我自己也在多次恢復中驗證過,所以各位希望各位可以 收藏、點贊、加關注 ,既然講解了從生產RAC環境到單機測試恢復,那么就不得不提從生產單機環境到RAC測試恢復,那么下篇將帶來《rman全庫異機恢復:從單機環境到RAC測試環境的轉移》哦。