oracle rac搭建單實例DG步驟(閱讀全篇后再做)


環境介紹

主庫:

主機名 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參數后,恢復過程沒有報錯,因此這兩個參數應該在恢復之前加上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM