環境介紹
主庫:
主機名 | rac01 | rac02 |
實體IP | 10.206.132.232 | 10.206.132.233 |
私有IP | 192.168.56.12 | 192.168.56.13 |
虛擬IP | 10.206.132.237 | 10.206.132.238 |
SCAN IP | 10.206.132.239 | |
實例名 | racdb1 | racdb2 |
數據庫名 | racdb | |
數據文件目錄 | DGDATA01,DGDATA02(ASM磁盤) |
備庫:
主機名 | dr-rac |
實體IP | 10.206.132.245 |
虛擬IP | 10.206.132.246 |
實例名 | racdb |
數據庫名 | racdb |
數據文件目錄 | /oradata01/racdb/,/oradata02/racdb |
數據文件目錄備庫和主庫的ASM目錄數量和大小要一致,后面會講原因
1.安裝oracle軟體(和rac數據庫的軟體版本一致,本實驗使用的是11GR2)
2.主庫開啟歸檔並打開force logging
打開force logging
SQL> alter database force logging; Database altered. SQL> select force_logging from v$database; FOR --- YES
打開歸檔
關閉數據庫(兩個節點執行)
$ sqlplus / as sysdba
SQL> shutdown immediate;
將數據庫打開至mount狀態(兩個節點執行)
SQL> startup mount;
修改數據庫的歸檔模式(任一節點即可)
SQL> alter database archivelog;
修改歸檔路徑(兩個節點執行)
SQL> alter system set log_archive_dest_1='location=/archlog/racdb';
打開數據庫(兩個節點)
SQL> alter database open;
3.主庫全備(任一節點執行)
$ rman target / run{ allocate channel c1 device type disk format '/oggdata/backup/full_%d_%T_%s_%p.bak'; allocate channel c2 device type disk format '/oggdata/backup/full_%d_%T_%s_%p.bak'; allocate channel c3 device type disk format '/oggdata/backup/full_%d_%T_%s_%p.bak'; sql 'alter system archive log current'; backup as compressed backupset database plus archivelog; backup current controlfile; backup spfile; }
4.將全備文件傳送至備庫
$ scp * 10.206.132.245:/data/backup
6.將主庫的參數文件傳送至備庫
SQL> create pfile='/tmp/initracdb.ora' from spfile; $ scp /tmp/initracdb.ora 10.206.132.245:/oracle/11204/dbs
根據實際的情況,RAC的參數文件和單實例的參數文件有一定的差別,所以我一般會從一個單實例數據庫創建一個pfile傳送過來並修改
7.修改參數文件並創建參數文件所需目錄
其中以雙下划線開頭的是oracle自動內存管理生成的,可以直接刪除,如
testdb.__db_cache_size=1862270976 testdb.__java_pool_size=16777216 testdb.__large_pool_size=33554432 testdb.__oracle_base='/oracle'#ORACLE_BASE set from environment testdb.__pga_aggregate_target=838860800 testdb.__sga_target=2483027968 testdb.__shared_io_pool_size=0 testdb.__shared_pool_size=503316480 testdb.__streams_pool_size=33554432
其中以單下划線開頭的是隱含參數,根據實際情況修改
修改SGA,PGA
修改控制文件位置
*.control_files='/oradata01/racdb/control01.ctl','/oradata01/racdb/control02.ctl'
創建目錄
*.audit_file_dest='/oracle/admin/racdb/adump'
*.db_recovery_file_dest='/oracle/fast_recovery_area'
其他參數根據實際情況修改,刪除或者添加
8.創建spfile並打開實例
SQL> create spfile from pfile; SQL> startup nomount;
9.還原standby controlfile
進入主庫查看controlfile的備份片
[oracle@rac01 ~]$ rman target / RMAN> list backup of controlfile; ------------------------------------------------------------------------------------ BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 26 Full 17.67M DISK 00:00:01 15-APR-20 BP Key: 26 Status: AVAILABLE Compressed: NO Tag: TAG20200415T150050 Piece Name: /oggdata/backup/full_RACDB_20200415_26_1.bak Control File Included: Ckp SCN: 558979 Ckp time: 15-APR-20 ------------------------------------------------------------------------------------
備庫進入rman進行還原
[oracle@dr-rac dbs]$ rman target / RMAN> restore standby controlfile from '/data/backup/full_RACDB_20200415_26_1.bak';
10.將數據庫啟動至mount狀態並進行數據庫還原(備庫)
mount數據庫
[oracle@dr-rac dbs]$ sqlplus / as sysdba SQL> alter database mount;
此時遇到了一個問題,在RAC數據庫中數據文件(包括臨時表空間,在線聯機日志)是在ASM磁盤內的,例如+DGDATA01等,在單實例上面是系統目錄,如何對應
查看當前數據文件的狀態
SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- +DGDATA01/racdb/datafile/system.260.1037709075 +DGDATA01/racdb/datafile/sysaux.261.1037709079 +DGDATA01/racdb/datafile/undotbs1.262.1037709081 +DGDATA01/racdb/datafile/undotbs2.264.1037709089 +DGDATA01/racdb/datafile/users.265.1037709091 +DGDATA02/racdb/datafile/mytbs01.dbf SQL> select name from v$tempfile; NAME -------------------------------------------------------------------------------- +DGDATA01/racdb/tempfile/temp.263.1037709085 SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- +DGDATA01/racdb/redo01.log +DGDATA01/racdb/redo02.log +DGDATA01/racdb/redo03.log +DGDATA01/racdb/redo04.log
因此我們需要在RMAN中將恢復的目錄對應起來(下面的腳本根據自己實際情況進行修改)
DECLARE dir VARCHAR2 (100); CURSOR dbfs IS SELECT FILE_NAME FROM DBA_DATA_FILES; BEGIN FOR dbf IN dbfs LOOP SELECT SUBSTR (dbf.FILE_NAME, 2, INSTR (dbf.FILE_NAME, '/', 1) - 2) INTO DIR FROM DUAL; IF (DIR = 'DGDATA01') THEN DBMS_OUTPUT.PUT_LINE('SET NEWNAME FOR DATAFILE '''||dbf.FILE_NAME||''' TO ''/oradata01'||substr(dbf.file_name,instr(dbf.file_name,'/',1),length(dbf.file_name))||''';'); ELSIF (DIR = 'DGDATA02') THEN DBMS_OUTPUT.PUT_LINE('SET NEWNAME FOR DATAFILE '''||dbf.FILE_NAME||''' TO ''/oradata02'||substr(dbf.file_name,instr(dbf.file_name,'/',1),length(dbf.file_name))||''';'); END IF; END LOOP; END; ---------------------------------------------------------------------------------------------------------------------- SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/system.260.1037709075' TO '/oradata01/racdb/datafile/system.260.1037709075'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/sysaux.261.1037709079' TO '/oradata01/racdb/datafile/sysaux.261.1037709079'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/undotbs1.262.1037709081' TO '/oradata01/racdb/datafile/undotbs1.262.1037709081'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/undotbs2.264.1037709089' TO '/oradata01/racdb/datafile/undotbs2.264.1037709089'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/users.265.1037709091' TO '/oradata01/racdb/datafile/users.265.1037709091'; SET NEWNAME FOR DATAFILE '+DGDATA02/racdb/datafile/mytbs01.dbf' TO '/oradata02/racdb/datafile/mytbs01.dbf'; ----------------------------------------------------------------------------------------------------------------------
使用RMAN進行數據庫的還原(備庫),恢復之前要在對應的目錄下建立子文件夾(如racdb/datafile)
[oracle@dr-rac dbs]$ rman target / RMAN> catalog start with '/data/backup'; run { SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/system.260.1037709075' TO '/oradata01/racdb/datafile/system.260.1037709075'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/sysaux.261.1037709079' TO '/oradata01/racdb/datafile/sysaux.261.1037709079'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/undotbs1.262.1037709081' TO '/oradata01/racdb/datafile/undotbs1.262.1037709081'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/undotbs2.264.1037709089' TO '/oradata01/racdb/datafile/undotbs2.264.1037709089'; SET NEWNAME FOR DATAFILE '+DGDATA01/racdb/datafile/users.265.1037709091' TO '/oradata01/racdb/datafile/users.265.1037709091'; SET NEWNAME FOR DATAFILE '+DGDATA02/racdb/datafile/mytbs01.dbf' TO '/oradata02/racdb/datafile/mytbs01.dbf'; allocate channel c1 device type disk; allocate channel c2 device type disk; allocate channel c3 device type disk; restore database; release channel c1; release channel c2; release channel c3; }
11.修改controlfile中redo和tempfile的位置,以便打開后自動創建(前提還是要創建好對應的目錄,否則一會兒數據庫打不開)
SQL> alter database rename file '+DGDATA01/racdb/tempfile/temp.263.1037709085' to '/oradata01/racdb/tempfile/temp.263.1037709085';
DECLARE dir VARCHAR2 (100); CURSOR LFS IS SELECT MEMBER FROM v$logfile; BEGIN FOR LF IN LFS LOOP SELECT SUBSTR (LF.MEMBER, 2, INSTR (LF.MEMBER, '/', 1) - 2) INTO DIR FROM DUAL; IF (DIR = 'DGDATA01') THEN DBMS_OUTPUT.PUT_LINE('ALTER DATABASE RENAME FILE '''||LF.MEMBER||''' TO ''/oradata01'||substr(LF.MEMBER,instr(LF.MEMBER,'/',1),length(LF.MEMBER))||''';'); ELSIF (DIR = 'DGDATA02') THEN DBMS_OUTPUT.PUT_LINE('ALTER DATABASE RENAME FILE '''||LF.MEMBER||''' TO ''/oradata02'||substr(LF.MEMBER,instr(LF.MEMBER,'/',1),length(LF.MEMBER))||''';'); END IF; END LOOP; END; ------------------------------------------------------------------------------- ALTER DATABASE RENAME FILE '+DGDATA01/racdb/redo01.log' TO '/oradata01/racdb/redo01.log'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/redo02.log' TO '/oradata01/racdb/redo02.log'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/redo03.log' TO '/oradata01/racdb/redo03.log'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/redo04.log' TO '/oradata01/racdb/redo04.log'; -------------------------------------------------------------------------------
12.打開數據庫
這時候報錯
SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01157: cannot identify/lock data file 1 - see DBWR trace file ORA-01110: data file 1: '+DGDATA01/racdb/datafile/system.260.1037709075'
這是因為控制文件中的datafile的路徑沒有改變,兩種辦法解決
第一種,修改控制文件中數據文件的路徑
DECLARE dir VARCHAR2 (100); CURSOR dbfs IS SELECT FILE_NAME FROM DBA_DATA_FILES; BEGIN FOR dbf IN dbfs LOOP SELECT SUBSTR (dbf.FILE_NAME, 2, INSTR (dbf.FILE_NAME, '/', 1) - 2) INTO DIR FROM DUAL; IF (DIR = 'DGDATA01') THEN DBMS_OUTPUT.PUT_LINE('ALTER DATABASE RENAME FILE '''||dbf.FILE_NAME||''' TO ''/oradata01'||substr(dbf.file_name,instr(dbf.file_name,'/',1),length(dbf.file_name))||''';'); ELSIF (DIR = 'DGDATA02') THEN DBMS_OUTPUT.PUT_LINE('ALTER DATABASE RENAME FILE '''||dbf.FILE_NAME||''' TO ''/oradata02'||substr(dbf.file_name,instr(dbf.file_name,'/',1),length(dbf.file_name))||''';'); END IF; END LOOP; END; ----------------------------------------------------------------------------- ALTER DATABASE RENAME FILE '+DGDATA01/racdb/datafile/system.260.1037709075' TO '/oradata01/racdb/datafile/system.260.1037709075'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/datafile/sysaux.261.1037709079' TO '/oradata01/racdb/datafile/sysaux.261.1037709079'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/datafile/undotbs1.262.1037709081' TO '/oradata01/racdb/datafile/undotbs1.262.1037709081'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/datafile/undotbs2.264.1037709089' TO '/oradata01/racdb/datafile/undotbs2.264.1037709089'; ALTER DATABASE RENAME FILE '+DGDATA01/racdb/datafile/users.265.1037709091' TO '/oradata01/racdb/datafile/users.265.1037709091'; ALTER DATABASE RENAME FILE '+DGDATA02/racdb/datafile/mytbs01.dbf' TO '/oradata02/racdb/datafile/mytbs01.dbf'; -----------------------------------------------------------------------------
第二種,在還原控制文件之前,我們在參數文件中加入如下兩個參數
alter system set log_file_name_convert='+DGDATA01/racdb/','/oradata01/racdb/','+DGDATA02/racdb/','/oradata02/racdb/' scope=spfile; alter system set db_file_name_convert='+DGDATA01/racdb/datafile/','/oradata01/racdb/datafile/','+DGDATA02/racdb/datafile/','/oradata02/racdb/datafile/' scope=spfile;
第二種還原的控制文件中datafile和logfile自動會定位到正確的目錄,同時在第十步中也不需要前面NET NEWNAME,直接還原即可,因此強烈建議這兩個參數在還原控制文件之前加入。
參數一定要注意,前面最后加/,后面也要加/,否則替換的時候會出錯,例如'+DGDATA01/racdb/','/oradata01/racdb',會把+DGDATA01/racdb/redo01.log對應成/oradata01/racdbredo01.log
再次打開數據時,又報錯了
SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01152: file 1 was not restored from a sufficiently old backup ORA-01110: data file 1: '/oradata01/racdb/datafile/system.260.1037709075'
這是因為我們沒有恢復數據庫,使用rman恢復數據庫,有兩種方法
第一種,恢復數據庫(這里面的SCN也可以從RMAN的list backup of archivelog all里面看到歸檔的最高SCN)
恢復之前要加上這兩個參數的原因可以看后面的試驗
SQL> alter system set db_file_name_convert='+DGDATA01/racdb/datafile','/oradata01/racdb/datafile','+DGDATA02/racdb/datafile','/oradata02/racdb/datafile' scope=spfile;
SQL> alter system set standby_file_management=auto;
查看主庫當前的SCN SQL> select current_scn from v$database; 主庫歸檔當前的REDO SQL> alter system archive log current; 將主庫的歸檔傳送至備庫 $ scp /archlog/readb/* 10.206.132.245:/oradata02/archlog 備庫恢復 RMAN> catalog start with '/oradata02/archlog'; RMAN> recover database until scn 565400; 打開數據庫 SQL> alter database open;
第二種,不用管,繼續配置DG庫,之后會自動將歸檔傳過來並應用
13.配置備庫的監聽
從其他庫copy過來一個修改即可
$ cd /oracle/11204/network/admin/ $ scp listener.ora 10.206.132.245:`pwd`
$ vi listener.ora
$ lsnrctl star
14.將主庫(任一節點)的口令文件傳過來
$ cd $ORACLE_HOME/dbs $ scp orapwracdb1 10.206.132.245:/oracle/11204/dbs/orapwracdb
15.修改主庫的TNS(加入自己和備庫的TNS)並傳送到另一個節點和備庫
$ vi tnsnames.ora ------------------------------------------------------------------------------- RACDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.206.132.239)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = racdb) ) ) STANDBY_RACDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.206.132.245)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = racdb) ) ) ------------------------------------------------------------------------------- $ scp tnsnames.ora 10.206.132.233:/oracle/home/network/admin/ $ scp tnsnames.ora 10.206.132.245:/oracle/11204/network/admin
16.修改備庫的參數
alter system set db_unique_name='standby_racdb' scope=spfile; alter system set db_file_name_convert='+DGDATA01/racdb/datafile','/oradata01/racdb/datafile','+DGDATA02/racdb/datafile','/oradata02/racdb/datafile' scope=spfile; alter system set log_file_name_convert='+DGDATA01/racdb/','/oradata01/racdb','+DGDATA02/racdb','/oradata02/racdb' scope=spfile; 重啟數據庫 alter system set log_archive_config='dg_config=(racdb,standby_racdb)'; alter system set log_archive_dest_1='LOCATION=/oradata02/archlog valid_for=(all_logfiles,all_roles) db_unique_name=standby_racdb'; alter system set log_archive_dest_2='service=racdb async valid_for=(online_logfiles, primary_role) db_unique_name=racdb'; alter system set log_archive_dest_state_1=enable; alter system set log_archive_dest_state_2=enable; alter system set fal_server=racdb; alter system set fal_client=standby_racdb; alter system set standby_file_management=auto; alter system set log_archive_max_processes=30;
18.修改主庫參數(我的參數文件時共享的,因此修改一個節點即可)
alter system set db_file_name_convert='/oradata01/racdb/datafile','+DGDATA01/racdb/datafile','/oradata02/racdb/datafile','+DGDATA02/racdb/datafile' scope=spfile; alter system set log_file_name_convert='/oradata01/racdb','+DGDATA01/racdb/','/oradata02/racdb','+DGDATA02/racdb' scope=spfile; 重啟數據庫(根據實際業務,可以先修改,等無業務期間重啟實例) alter system set log_archive_config='dg_config=(racdb,standby_racdb)'; alter system set log_archive_dest_1='LOCATION=/archlog/racdb valid_for=(all_logfiles,all_roles) db_unique_name=racdb'; alter system set log_archive_dest_2='service=standby_racdb async valid_for=(online_logfiles, primary_role) db_unique_name=standby_racdb'; alter system set log_archive_dest_state_1=enable; alter system set log_archive_dest_state_2=enable; alter system set fal_server=standby_racdb; alter system set fal_client=racdb; alter system set standby_file_management=auto; alter system set log_archive_max_processes=30;
19.打開備庫的日志應用
SQL> alter database recover managed standby database disconnect;
20.新建表並插入數據測試
create table testdg(id number); insert into testdg values (1); commit; #因為沒有添加standby_logfile因此無法實時應用,需要切換歸檔 alter system archive log current;
同時發現REDO產生了,應該是修改主庫參數文件后傳送過來或備庫應用日志的時候產生的。
tempfile是在備庫打開(open)的時候產生的。
實驗
主備目錄不相同的情況下,如果全備之后,增加了數據文件或者修改了數據文件的大小,在恢復備庫的時候,會發生什么
試驗一:主庫全備后,增加數據文件的大小
alter database datafile '+DGDATA02/racdb/datafile/mytbs01.dbf' resize 2g; alter system archive log current; select current_scn from v$database; 614673 alter system archive log current; $ scp 2_17_1037709071.dbf 2_18_1037709071.dbf 1_30_1037709071.dbf 1_31_1037709071.dbf 10.206.132.245:/oradata02/archlog RMAN> catalog start with '/oradata02/archlog'; SQL> shutdown immediate; SQL> startup mount; RMAN> recover database until scn 614673; # cd /oradata02/racdb/datafile # du -sh mytbs01.dbf ---------------------------------------- 2.1G mytbs01.dbf ----------------------------------------
通過上述實驗,發現只要數據文件已經被還原,那么增加數據文件的大小會自動應用到對應的目錄上面(感覺應該是根據的數據文件號)
實驗二:主庫全備后,增加數據文件
alter tablespace mytbs add datafile '+DGDATA02/racdb/datafile/mytbs02.dbf' size 1g; alter system archive log current; select current_scn from v$database; 615468 alter system archive log current; $ scp 2_19_1037709071.dbf 2_20_1037709071.dbf 1_32_1037709071.dbf 1_33_1037709071.dbf 10.206.132.245:/oradata02/archlog RMAN> catalog start with '/oradata02/archlog'; SQL> shutdown immediate; SQL> startup mount; RMAN> recover database until scn 615468; creating datafile file number=7 name=+DGDATA02/racdb/datafile/mytbs02.dbf RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 04/16/2020 08:24:27 RMAN-20505: create datafile during recovery ORA-01119: error in creating database file '+DGDATA02/racdb/datafile/mytbs02.dbf' ORA-17502: ksfdcre:3 Failed to create file +DGDATA02/racdb/datafile/mytbs02.dbf ORA-15001: diskgroup "DGDATA02" does not exist or is not mounted ORA-15077: could not locate ASM instance serving a required diskgroup ORA-29701: unable to connect to Cluster Synchronization Service RMAN-11003: failure during parse/execution of SQL statement: alter database recover logfile '/oradata02/archlog/2_19_1037709071.dbf' ORA-00283: recovery session canceled due to errors ORA-01274: cannot add datafile '+DGDATA02/racdb/datafile/mytbs02.dbf' - file could not be created 此時,我們加入參數 SQL> alter system set db_file_name_convert='+DGDATA01/racdb/datafile','/oradata01/racdb/datafile','+DGDATA02/racdb/datafile','/oradata02/racdb/datafile' scope=spfile; SQL> shutdown immediate; SQL> startup mount; RMAN> recover database until scn 615468; Starting recover at 16-APR-20 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=67 device type=DISK RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 04/16/2020 08:29:08 RMAN-06094: datafile 7 must be restored RMAN> restore datafile 7; Starting restore at 16-APR-20 using channel ORA_DISK_1 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at 04/16/2020 08:29:44 RMAN-06085: must use SET NEWNAME command to restore datafile /oracle/11204/dbs/UNNAMED00007 run{ SET NEWNAME FOR DATAFILE '/oracle/11204/dbs/UNNAMED00007' TO '/oradata02/racdb/datafile/mytbs02.dbf'; restore datafile 7; } datafile 7 is already restored to file /oradata02/racdb/datafile/mytbs02.dbf restore not done; all files read only, offline, or already restored Finished restore at 16-APR-20 進入系統,發現/oradata02/racdb/datafile/mytbs02.dbf已經存在,此時,我們只需要修改數據文件即可 SQL> alter database rename file '/oracle/11204/dbs/UNNAMED00007' to '/oradata02/racdb/datafile/mytbs02.dbf'; 此時再次測試 alter tablespace mytbs add datafile '+DGDATA02/racdb/datafile/mytbs03.dbf' size 1g; alter system archive log current; select current_scn from v$database; 616851 alter system archive log current; $ scp 2_21_1037709071.dbf 2_22_1037709071.dbf 1_34_1037709071.dbf 1_35_1037709071.dbf 10.206.132.245:/oradata02/archlog RMAN> catalog start with '/oradata02/archlog'; RMAN> recover database until scn 616851; RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 04/16/2020 08:55:11 RMAN-20505: create datafile during recovery ORA-01119: error in creating database file '+DGDATA02/racdb/datafile/mytbs03.dbf' ORA-17502: ksfdcre:3 Failed to create file +DGDATA02/racdb/datafile/mytbs03.dbf ORA-15001: diskgroup "DGDATA02" does not exist or is not mounted ORA-15077: could not locate ASM instance serving a required diskgroup ORA-29701: unable to connect to Cluster Synchronization Service RMAN-11003: failure during parse/execution of SQL statement: alter database recover logfile '/oradata02/archlog/1_34_1037709071.dbf' ORA-00283: recovery session canceled due to errors ORA-01274: cannot add datafile '+DGDATA02/racdb/datafile/mytbs03.dbf' - file could not be created run{ SET NEWNAME FOR DATAFILE '/oracle/11204/dbs/UNNAMED00008' TO '/oradata02/racdb/datafile/mytbs03.dbf'; restore datafile 8; } SQL> alter database rename file '/oracle/11204/dbs/UNNAMED00008' to '/oradata02/racdb/datafile/mytbs03.dbf'; RMAN> recover database until scn 616851;
通過實驗發現,在主庫全備后增加數據文件在恢復的時候由於目錄不對應,會報錯
此時決定加入另外一個參數alter system set standby_file_management=auto,看恢復的時候是否可以自動創建對應的文件
SQL> alter system set db_file_name_convert='+DGDATA01/racdb/datafile','/oradata01/racdb/datafile','+DGDATA02/racdb/datafile','/oradata02/racdb/datafile' scope=spfile; SQL> alter system set standby_file_management=auto; SQL> shutdown immediate; SQL> startup mount; RMAN> catalog start with '/oradata02/archlog'; RMAN> recover database until scn 616851;
全備是在經過試驗之前的,也就是沒有mytbs02.dbf,mytbs03.dbf,mytbs04.dbf,增加兩個db_file_name_convert,standby_file_management參數后,恢復過程沒有報錯,因此這兩個參數應該在恢復之前加上。