• 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参数后,恢复过程没有报错,因此这两个参数应该在恢复之前加上。

  • 相关阅读:
    Found class xxx.xxx.xxx, but interface was expected
    String的length()和getBytes().length
    springboot shutdown(停机)
    关于Java代码简化的小技巧
    数据库的简单查询
    数据库TSQL语句
    环境搭建及wamp空密码修改
    js windows对象
    JS函数的其他用法【备于取用】
    js递归
  • 原文地址:https://www.cnblogs.com/monkey6/p/12700349.html
Copyright © 2020-2023  润新知