1.確認備份信息
確保生產庫備份(數據文件、控制文件、歸檔日志)已注冊到catalog目錄庫;確認恢復的數據文件號
rman target / catalog rasys/welcome1@ra

list backup of datafile 1,2,3,4,12;

2.測試庫軟件已安裝,數據庫已安裝;現在把數據庫關閉并刪除相關路徑
刪除審計(2個節點操作):rm -rf /u01/oracle/admin/dbm01/adump/*.aud
刪除asm下dbm01相關目錄:
cd +datac1/dbm01
rm -rf datafile
rm -rf onlinelog
rm -rf tempfile
rm -rf controlfile
rm -rf changetracking
rm -rf spfile/spfilehfkdb.ora
cd +recoc1/dbm01
rm -rf archivelog
rm -rf onlinelog

3.測試庫創建參數文件
vi /home/oracle/dbm01.ora
*.MEMORY_TARGET=10G
*._clusterwide_global_transactions=FALSE
*.audit_file_dest='/u01/oracle/admin/dbm01/adump'
*.audit_trail='db'
*.cluster_database=FALSE #創建庫這個要為false,否則會報錯
*.compatible='11.2.0.4.0'
*.control_files='+DATAC1','+DATAC1'
*.db_block_size=8192
*.db_create_file_dest='+DATAC1'
*.db_domain=''
*.db_name='dbm01'
*.db_recovery_file_dest='+DATAC1'
*.db_recovery_file_dest_size=21474836480
*.diagnostic_dest='/u01/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dbm01XDB)'
*.enable_goldengate_replication=TRUE
dbm012.instance_number=2
dbm011.instance_number=1
*.log_archive_dest_1='location=+RECOC1'
*.log_archive_format='arch_%t_%s_%r.log'
*.open_cursors=300
*.processes=2000
*.remote_listener='ceshidb-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=2205
dbm012.thread=2
dbm011.thread=1
dbm012.undo_tablespace='UNDOTBS2'
dbm011.undo_tablespace='UNDOTBS1'export ORACLE_SID=dbm012
sqlplus / as sysdba
create spfile='+DATAC1/dbm01/spfile/spfiledbm01.ora' from pfile='/home/oracle/dbm01.ora';
兩個節點創建pfile內容指向共享設備的spfile文件
[oracle@ceshidb01 dbs]$ cat initdbm011.ora
SPFILE='+datac1/dbm01/spfile/spfiledbm01.ora'
[oracle@ceshidb02 dbs]$ cat initdbm012.ora
SPFILE='+datac1/dbm01/spfile/spfiledbm01.ora'4.創建口令文件,兩個節點都操作
cd $ORACLE_HOME/dbs
orapwd file=orapwdbm011 password=oracle entries=10
orapwd file=orapwdbm012 password=oracle entries=105.恢復控制文件(在節點2上操作)
export ORACLE_SID=dbm012
startup nomount;
lsnrctl status #查看監聽,nomount下狀態為blocked

set dbid不會改變實際連接的數據庫實例,只是告訴rman知道后續操作應該關聯到哪個dbid的備份記錄。如果恢復目錄中有生產庫的控制文件備份,rman會根據當前設置的dbid(即生產庫的dbid)查找對應的控制文件備份,并將其恢復到目標數據庫(也就是當前通過target /連接的測試庫)。
所有操作都是在測試庫上進行,設置dbid只是讓rman從恢復目錄獲取對應生產庫的備份信息。
export ORACLE_SID=dbm012
rman target / catalog rasys/welcome1@ra
SET DBID=1123023669; #設置生產庫的dbid,讓rman識別catalog中的生產庫備份
--從catalog恢復生產庫的控制文件
run {
allocate channel c1 device type 'SBT_TAPE' parms "SBT_LIBRARY=/u01/oracle/product/11.2.0/dbhome_1/lib/libra.so, ENV=(RA_WALLET='location=file:/u01/oracle/product/11.2.0/dbhome_1/dbs/zdlra credential_alias=za01ingest-scan:1521/zdlra:dedicated',_RA_AUTH_SCHEME=BASIC)";
restore controlfile from 'DBM01_kr43d6ki_1_1';
release channel c1;
}
--掛載數據庫
RMAN> ALTER DATABASE MOUNT;
--檢查控制文件內容
report schema;
6.執行數據文件的還原和恢復(在節點2上操作)
注意點:
1)恢復時如果存在增量備份,rman會先應用增量備份,而不是僅僅使用歸檔日志,因為增量備份可能包含更少的數據塊變化,從而加快數據恢復過程。
2)restore 0級備份后,如果有可用的1級備份,先recover 1級備份,然后應用剩余的歸檔日志。
3)增量備份通過物理塊的直接覆蓋,跳過了大量日志解析,相比應用歸檔要快的多
4)恢復時主要依據數據文件頭的scn,當進行介質恢復時,rman會根據數據文件頭的scn來確定需要應用的日志起點,因為恢復的目的是將數據文件推進到某一致點。
5)如果控制文件scn高于數據文件頭scn,恢復時要將數據文件頭scn提升到控制文件記錄的scn,或者選擇中間的scn,以免數據不一致。
6)若控制文件和數據文件SCN不匹配,Oracle會自動調整恢復終點。
7)控制文件:scn來自備份時的控制文件快照,表示備份時刻的全局一致性點
8)數據文件頭:scn來自數據文件備份時的檢查點scn,表示該文件最后一次被正確寫入的時間點。此處控制文件比數據文件新,是因為后面備份的控制文件
9)recover后,不管是數據文件scn還是控制文件scn都會追加歸檔日志到until時刻對應的scn位置;所有數據文件頭和控制文件記錄的scn要完全一致(等于until時刻scn);
export ORACLE_SID=dbm012
rman target / catalog rasys/welcome1@ra
設置zdlra備份參數(也可在run塊里分配通道)
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS "SBT_LIBRARY=/u01/oracle/product/11.2.0/dbhome_1/lib/libra.so, ENV=(RA_WALLET='location=file:/u01/oracle/product/11.2.0/dbhome_1/dbs/zdlra credential_alias=za01ingest-scan:1521/zdlra:dedicated',_RA_AUTH_SCHEME=BASIC)";
--從catalog還原restore生產庫的指定數據文件
--還原前可以先查看相關數據文件有哪些日期的備份,
如果沒有連接catalog,查看相關數據文件是恢復的控制文件所在時間的文件!!
如果連接catalog,即使恢復的控制文件是舊的,查看里面相關數據文件備份依然是有最新的!!
如果想恢復舊的數據文件,需要指定時間如下
list backup of datafile 1;
RESTORE DATAFILE 1 until time "to_date('2025-04-04 00:00:00', 'YYYY-MM-DD HH24:MI:SS')";
默認情況下,restore會使用最新的備份,而recover會嘗試恢復到最新的時間點,可能導致數據不一致。
因此,在時間點恢復時,明確指定SET UNTIL TIME是必要的。
RUN {
SET UNTIL TIME "TO_DATE('2025-09-11 16:00:00', 'YYYY-MM-DD HH24:MI:SS')";
allocate channel c1 device type 'SBT_TAPE' parms "SBT_LIBRARY=/u01/oracle/product/11.2.0/dbhome_1/lib/libra.so, ENV=(RA_WALLET='location=file:/u01/oracle/product/11.2.0/dbhome_1/dbs/zdlra credential_alias=za01ingest-scan:1521/zdlra:dedicated',_RA_AUTH_SCHEME=BASIC)";
SET NEWNAME FOR DATAFILE 1 TO '+DATAC1/dbm01/datafile/system.259.954678405';
SET NEWNAME FOR DATAFILE 2 TO '+DATAC1/dbm01/datafile/sysaux.260.954678407';
SET NEWNAME FOR DATAFILE 3 TO '+DATAC1/dbm01/datafile/undotbs1.261.954678409';
SET NEWNAME FOR DATAFILE 4 TO '+DATAC1/dbm01/datafile/undotbs2.263.954678415';
SET NEWNAME FOR DATAFILE 12 TO '+DATAC1/dbm01/datafile/ybptfw_data.305.955381567';
RESTORE DATAFILE 1;
RESTORE DATAFILE 2;
RESTORE DATAFILE 3;
RESTORE DATAFILE 4;
RESTORE DATAFILE 12;
SWITCH DATAFILE all;
release channel c1;
}--從catalog恢復應用歸檔 跳過沒有還原的表空間
RUN {
allocate channel c1 device type 'SBT_TAPE' parms "SBT_LIBRARY=/u01/oracle/product/11.2.0/dbhome_1/lib/libra.so, ENV=(RA_WALLET='location=file:/u01/oracle/product/11.2.0/dbhome_1/dbs/zdlra credential_alias=za01ingest-scan:1521/zdlra:dedicated',_RA_AUTH_SCHEME=BASIC)";
recover database until time "to_date('2025-09-11 16:00:00', 'YYYY-MM-DD HH24:MI:SS')" skip tablespace USERS,USER_R ;
release channel c1;
}7.目錄庫查看restore備份集信息
select *
from RC_BACKUP_PIECE a
where a.handle in ('VB$_4102852858_38350372_1',
'VB$_4102852858_38350310_2',
'VB$_4102852858_38354973_3',
'VB$_4102852858_38351295_4',
'VB$_4102852858_38350514_12');

8.修改redo日志文件路徑(在節點2上操作)
可以直接從源庫查詢相關redo,并在恢復庫上進行alter。也可以直接在恢復庫上重建redo。
--源庫查詢并修改語句
select 'alter database rename file ''' || member ||'''' || ' to '''|| substr(member,0,instr(member,'/',-1) -1)|| '' || substr(member,instr(member,'/',-1)) ||''';'
from v$logfile;
--目標庫執行,如果兩邊路徑一致可不操作
alter database rename file '+DATAC1/dbm01/onlinelog/group_6.269.954678833' to '+DATAC1/dbm01/onlinelog/group_6.269.954678833'; 9.打開數據庫(在節點2上操作)
ALTER DATABASE OPEN RESETLOGS;
如果出現如下報錯:
ERROR at line 1:
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 4296015872 bytes disk space from 21474836480 limit解決方法:
alter system set db_recovery_file_dest_size=600G scope=both;
10.重建temp表空間(也可不操作,打開數據庫時會自動創建)(在節點2上操作)
select name from v$tempfile;
create temporary tablespace TEMP1; OMF管理
SQL> create temporary tablespace TEMP1 tempfile '+datac1/dbm01/tempfile/temp01.dbf' size 50M;
SQL> alter database default temporary tablespace TEMP1;
SQL> drop tablespace TEMP including contents and datafiles;11.檢查控制文件和數據文件頭記錄的scn是否一致(在節點2上操作)
set numw 15
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
12.驗證恢復結果,除了恢復的數據文件,別的都是offline
SELECT FILE#, NAME, STATUS FROM V$DATAFILE;

13.修改rac參數,并啟動節點1實例
--節點2
alter system set cluster_database=true scope=spfile;
alter system set cluster_database_instances=2 scope=spfile;
shutdown immediate;
startup
--節點1
export ORACLE_SID=dbm011
startup


14.注冊database、instance
由于rac是基于crs管理的,需要把database和instance注冊到crs里管理
--注冊數據庫
srvctl add database -d dbm01 -o $ORACLE_HOME
--注冊實例
srvctl add instance -d dbm01 -i dbm011 -n ceshidb01
srvctl add instance -d dbm01 -i dbm012 -n ceshidb02
crs_start -f ora.dbm01.db
--數據庫啟停
srvctl start database -d dbm01
srvctl stop database -d dbm0115.v$recovery_file_dest空間清理
數據庫打開的時候報錯空間不足,查詢v$recovery_file_dest視圖發現已經使用了500多G,這個視圖存放文件總數量、位置、磁盤限額、已用空間等;
通過查詢v$flash_recovery_area_usage;包括控制文件、在線重做日志、備份片、鏡像拷貝、閃回日志、外部歸檔文件,通過刪除廢棄或冗余的文件回收空間。


delete copy of datafile 4; #刪除鏡像拷貝

錯誤處理:
1)執行恢復報錯,庫鏈接失敗
RMAN-03009: failure of allocate command on c1 channel at 03/05/2025 15:24:06
ORA-19554: error allocating device, device type: SBT_TAPE, device name:
ORA-27211: Failed to load Media Management Library
Additional information: 3983
原因:目標庫的lib目錄沒有zdlra的庫文件
處理:檢查備份軟件是否運行正常;檢查備份目錄是否訪問正常;重新配置庫鏈接
解決:chown -R oracle:oinstall libra.so
chmod 745 libra.so

2)wallet認證失敗
RMAN-03009: failure of allocate command on c1 channel at 03/05/2025 15:49:40
ORA-19554: error allocating device, device type: SBT_TAPE, device name:
ORA-27023: skgfqsbi: media manager protocol error
ORA-19511: Error received from media manager layer, error text:
KBHS-01013: specified RA_WALLET alias ZDLRA2:1521/zdlra:dedicated not found in wallet
原因:這個連接字符串沒有在wallet中配置,檢查憑證
mkstore -wrl /u01/app/oracle/oracle/product/11.2.0/dbhome_1/dbs/zdlra -listCredential
1: zaingest-scan:1521/zdlra:dedicated ravpc
解決:添加此ip的連接字符串到wallet中。
3)catalog找不到目標庫信息
RMAN-06004: ORACLE error from recovery catalog database: RMAN-20001: target database not found in recovery catalog
原因:這時候連接的恢復庫還沒有在catalog注冊
解決:設置dbid=生產庫的dbid
SET DBID=1123023669;
4)打開數據庫報錯ora-00392
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00392: log 1 of thread 1 is being cleared, operation not allowed
ORA-00312: online log 1 thread 1:
'+DATAC1/dbm01/onlinelog/group_1.1697.1211904929'
ORA-00312: online log 1 thread 1: '+DATAC1'select group#,sequence#,bytes,members,status from v$log;

解決方法:ALTER DATABASE CLEAR LOGFILE GROUP 1;
5)清理日志組報錯
ALTER DATABASE CLEAR LOGFILE GROUP 1;
ORA-19804: cannot reclaim 4296015872 bytes disk space from 10737418240 limit
原因:閃回區小了,查詢發現已經使用了500G,之前修改的50、100g等都不行。
解決:修改閃回區大小
col SPACE_LIMIT form 99999999999999
col SPACE_USED form 99999999999999
select * from v$recovery_file_dest;
alter system set db_recovery_file_dest_size=600G scope=both;





