• oracle rac +standby


    Oracle dataguard

    1           Dataguard架构

    Dataguard架构按照功能分为3部分:

    日志发送

    日志接收

    日志应用

    1.1      日志发送

    日志发送由primary database的LGWR和ARCH进程完成,两者对数据保护能力和系统可用性有很大的区别

    1.1.1  使用ARCH进程

    (1)       primary database不断产生redo log,这些日志被LGWR进程写到联机日志;

    (2)       当一组联机日志写满时,就会发生日志切换,并触发本地归档;

    (3)       完成本地归档之后,联机日志就可以被覆盖复用

    (4)       归档日志发送到standby,在standby上应用

    ARCH进程最大的问题就是:primary database只有在发生归档时才会发送日志到standby database,如果primary database发送宕机,联机日志中的redo内容就会丢失,因此,ARCH进程无法避免数据丢失的问题。

             缺省情况下,primary用的就是ARCH进程。

    1.1.2  使用LGWR进程的SYNC方式

    Primary database产生的redo日志要同时写到日志文件和网络,必须都成功,primary database上的事务才能提交

             使用LGWR进程必须明确指定,例如:

             LOG_ARCHIVE_DEST_2=’SERVICE=STANDBY LGWR SYNC NET_TIMEOUT=30’

    NET_TIMEOUT代表多次时间网络发送没有响应,LGWR进程会抛出错误。

    1.1.3  使用LGWR进程的ASYNC方式

    Primary database产生redo日志后,LGWR把日志同时提交给日志文件和本地LNS进程,但是LGWR进程只需成功写入日志文件就可以,不必等待LNSn进程的网络进程传送成功

    例如:

             LOG_ARCHIVE_DEST_2=’SERVICE=STANDBY LGWR ASYNC’

    1.2      日志接受

    Standby的归档日志目录:

    归档日志目录优先使用参数:STANDBY_ARCHIVE_DEST

    如果某个LOG_ARCHIVE_DEST_N参数明确定义了VALID_FOR=(standby_logfile,*)选项,则使用这个参数指定的目录。

    如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_N都没有配置,则使用STANDBY_ARCHIVE_DEST的默认值:$ORACLE_HOME/dbs/arch

    1.3      日志应用

    根据redo apply发生的时间又可以分成两种,一种是实时应用,这种方式必须使用standby redo log。另一种是归档时应用。

    (1)如果是physical standby,可以使用下面的命令启用real-time

             Alter database recover managed standby database using current logfile;

    (2)如果是logic standby 可以使用下面命令启用real-time

    Alter database start logical standby apply immediate

    (3)查看是否使用real-time apply

    Select recovery_mode from v$archive_dest_status;

    1.4      数据保护模式

    (1)最大可用

    (2)最大保护

    (3)最大性能

    (4)查看保护模式

    SQL> select protection_mode,protection_level from v$database;

    PROTECTION_MODE      PROTECTION_LEVEL

    -------------------- --------------------

    MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

    1.5      自动裂隙检测和解决

    当primary database的某些日志没有成功发到standby database,这就发生了归档裂隙,缺失的这些日志就是裂隙。Dataguard能够自动检测解决,不需要dba的介入,这就需要配置两个参数:FAL_CLIENT、FAL_SERVER(FAL是fetch archive log的缩写)

    除了自动日志缺失解决,也可以dba手工解决:

    拷贝缺失的归档日志,进行注册:

    alter database register logfile ‘logfilename’;

    2           rac和standby配置实例

    2.1      rac primary和single standby

    2.1.1  实施环境:

    主库:oracle 10g rac+asm

    备库:oracle 10g单实例+asm

                                                  

    主库节点1

    主库节点2

    备库

    主机名

    rac1

    主机名

    rac2

    主机名

    std

    Ip

    192.168.204.8

    Ip

    192.168.204.9

    Ip

    192.168.204.20

    数据库名

    rac

    数据库名

    rac

    数据库名

    std

    数据库实例

    rac1

    数据库实例

    rac2

    数据库实例

    std

    该过程主要将修改主库和备库的初始化启动文件等配置信息,通过RMAN工具从主库备份数据库,再通过RMAN工具从备库恢复数据,最后等待归档日志的正常传输,实现数据库的同步。

    要点:

    如果Standby是rac,则接受日志和恢复日志可以不是一个实例,single instance 的日志只发送到rac的一个实例。

    2.1.2  修改主库,将主库改为归档模式及force logging状态

    1、  关闭所有节点的实例服务

    SQL> shutdown immediate

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    2.1.3  在其中一个节点

    SQL> sqlplus / as sysdba

    SQL> startup mount

    SQL> alter database archivelog;

    SQL> alter database open;

    SQL> select log_mode from v$database;

    LOG_MODE

    ------------

    ARCHIVELOG

    2.1.4  将rac数据库修改为force logging

    SQL> alter database force logging;

    Database altered.

    SQL> select inst_id,force_logging from gv$database;

       INST_ID FOR

    ---------- ---

             1 YES

             2 YES

                        

    2.1.5  配置文件及备份文件

    1、  在 RAC1 上创建备份目录/u01/oracle/rman_bak

    2、  在std上创建相同的备份目录,以便rman能够顺利恢复

    3、  下面通过 sqlplus 创建 pfile  initstandby.ora

    SQL> show parameter spfile

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    spfile                               string      +DATA/rac/spfilerac.ora

    两个节点用一个spfile

    SQL> show parameter db_unique_name

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    db_unique_name                       string      rac

    SQL> CREATE PFILE='/u01/oracle/rman_bak/initstandby.ora' FROM SPFILE;

    File created.

    2.1.6  在主库和备库上修改oracle网络服务

    1、修改RAC1和RAC2的oracle的tnsnames.ora

    [oracle@rac1 admin]$ vi /u01/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora

    增加:

    standby =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.20)(PORT = 3173))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = standby)

        )

      )

    2.1.7  修改Standby的tnsnames.ora和listner.ora配置

    从primary拷贝过来,增加:

    standby =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.20)(PORT = 3173))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = standby)

        )

      )

    4、  修改Standby的oracle的.bash_profile文件

    export ORACLE_SID=standby

    export ORACLE_BASE=/u01/oracle

    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1

    export LD_LIBRARY_PATH=$ORACLE_HOME/lib

    export PATH=$ORACLE_HOME/bin:$PATH

    umask 022

    2.1.8  新建恢复需要的目录

    mkdir -p /u01/oracle/admin/standby/adump

    mkdir -p /u01/oracle/admin/standby/bdump

    mkdir -p /u01/oracle/admin/standby/cdump

    mkdir -p /u01/oracle/admin/standby/dpdump

    mkdir -p /u01/oracle/admin/standby/hdump

    mkdir -p /u01/oracle/admin/standby/udump

    mkdir -p /u01/oracle/admin/standby/pfile

    2.1.9  创建监听

    tnsping

    2.1.10             配置参数文件和密码文件

    cd /u01/oracle/rman_bak/

    将standby上从RAC1上拷贝过来的文件initstandby.ora拷贝至$ORACLE_HOME/dbs下。

    通过指令创建orapwstandby.ora,该文件包含的是sys的用户密码,注意密码一定要保证与主库一致。

    [oracle@std rman_bak]$ cd /u01/oracle/product/10.2.0/db_1/dbs/

    [oracle@std dbs]$ orapwd file=orapwstandby password=sys

    主库:

    SQL> show parameter db_unique_name

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    db_unique_name                       string      rac

    SQL> select file_name from dba_data_files;

    FILE_NAME

    --------------------------------------------------------------------------------

    +DATA/rac/datafile/users.259.868180115

    +DATA/rac/datafile/sysaux.257.868180115

    +DATA/rac/datafile/undotbs1.258.868180115

    +DATA/rac/datafile/system.256.868180113

    +DATA/rac/datafile/undotbs2.264.868180247

    2.1.10.1      修改主库参数文件

    Rac原有参数不变,增加以下参数

    SQL> ALTER SYSTEM SET service_names=rac scope=both;

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=+RECV/rac/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=rac' scope=both;

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,standby)' scope=both; 

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='service=standby valid_for=(online_logfiles,primary_role) db_unique_name=standby' scope=both; 

    SQL> ALTER SYSTEM SET db_file_name_convert='+DATA/rac/datafile/','+DATA/standby/datafile/','+DATA/rac/tempfile/','+DATA/standby/tempfile/' scope=spfile; 

    SQL> ALTER SYSTEM SET log_file_name_convert='+RECV/rac/onlinelog','+RECV/standby/onlinelog' scope=both; 

    SQL> ALTER SYSTEM SET standby_file_management=auto scope=both; 

    SQL> ALTER SYSTEM SET fal_server='standby' scope=both;

    SQL> ALTER SYSTEM SET rac1.fal_client='rac1' scope=spfile scope=both;

    SQL> ALTER SYSTEM SET rac2.fal_client='rac2' scope=spfile scope=both;

    加上 scope=both立即生效。

    SQL> create spfile='+DATA/rac/spfilerac.ora' from pfile='/u01/oracle/rman_bak/initrac.ora';

    File created.

    2.1.10.2      修改备库参数文件:

    可以删除的参数:

    *.cluster_database_instances=2

    *.cluster_database=true

    *.db_create_file_dest='+DATA'

    rac2.instance_number=2

    rac1.instance_number=1

    *.remote_listener='LISTENERS_RAC'

    修改initstandby.ora文件

    修改新增参数:

    *.control_files='/u01/oracle/rman_bak/standby.ctl'

    *.db_unique_name='standby'

    *.log_archive_config='dg_config=(rac,standby)'

    *.db_file_name_convert='+DATA/rac/datafile','+DATA/standby/datafile','+DATA/rac/tempfile','+DATA/standby/tempfile'

    *.log_file_name_convert='+RECV/rac/onlinelog','+RECV/standby/onlinelog'

    *.log_archive_dest_1='LOCATION=+DATA/standby/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'

    *.LOG_ARCHIVE_DEST_2='SERVICE=rac1 LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=rac'

    *.LOG_ARCHIVE_DEST_STATE_1=ENABLE

    *.LOG_ARCHIVE_DEST_STATE_2=ENABLE

    *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

    *.FAL_SERVER='rac'

    *.FAL_CLIENT='standby'

    *.STANDBY_FILE_MANAGEMENT='AUTO'

    thread=1

    undo_tablespace='UNDOTBS1'

     

     

    *.user_dump_dest='/u01/oracle/admin/standby/udump'

    *.audit_file_dest='/u01/oracle/admin/standby/adump'

    *.background_dump_dest='/u01/oracle/admin/standby/bdump'

    *.core_dump_dest='/u01/oracle/admin/standby/cdump'

     

     

    *.db_unique_name='standby'

    *.service_names='standby'

    注:+DATA/standby/archivelog这个目录需要在备库手动创建,开始未创建,结果一直报错归档目录不合法。

    2.1.11             进行rman备份

    备份数据文件及控制文件

    RMAN>  backup FORMAT  '/u01/oracle/rman_bak/db_%U' database plus archivelog;

    -----------------delete all input;不要这个

    RMAN>  BACKUP FORMAT  '/u01/oracle/rman_bak/control_%U'  CURRENT CONTROLFILE FOR STANDBY;

    注:

    在controlfile中记录着每一个archivelog的相关信息,OS下把这些物理文件delete掉后,在controlfile中仍然记录着这些archivelog的信息,

    当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!

    RMAN> crosscheck archivelog all;

    RMAN> delete expired archivelog all;

    进行几次归档

    SQL>Alter system archive log current;

    主库创建备库的控制文件

    SQL> alter database create standby controlfile as '/u01/oracle/rman_bak/standby.ctl';

    Database altered.

    将RAC1上的/u01/oracle/rman_bak/下的所有文件,包含RMAN备份文件,tnsnames.ora, listener.ora和initstandby.ora拷贝至Standby的同样的目录上。

    [oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/* ./

    创建spfile

    [oracle@std dbs]$ export ORACLE_SID=standby

    [oracle@std dbs]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 17:30:51 2015

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    Connected to an idle instance.

    SQL> create spfile from pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora';

    File created.

    SQL> startup nomount

    2.1.12             利用rman创建standby数据库

    备库启动到nomount状态

    SQL> startup pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora' nomount;

    ORACLE instance started.

    Total System Global Area  285212672 bytes

    Fixed Size                  2083368 bytes

    Variable Size              88081880 bytes

    Database Buffers          188743680 bytes

    Redo Buffers                6303744 bytes

    SQL> create spfile from pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora';

    File created.

    主库恢复备库

    [oracle@rac1 ~]$ rman target / auxiliary sys/sys@standby

    Recovery Manager: Release 10.2.0.4.0 - Production on Wed Jan 7 10:52:22 2015

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    connected to target database: RAC (DBID=2456162188)

    connected to auxiliary database: RAC (not mounted)

    RMAN> duplicate target database for standby;

    Starting Duplicate Db at 07-JAN-15

    using target database control file instead of recovery catalog

    allocated channel: ORA_AUX_DISK_1

    channel ORA_AUX_DISK_1: sid=155 devtype=DISK

    contents of Memory Script:

    {

       restore clone standby controlfile;

       sql clone 'alter database mount standby database';

    }

    executing Memory Script

    Starting restore at 07-JAN-15

    using channel ORA_AUX_DISK_1

    channel ORA_AUX_DISK_1: restoring control file

    channel ORA_AUX_DISK_1: copied control file copy

    input filename=/u01/oracle/rman_bak/standby.ctl

    output filename=/u01/oracle/rman_bak/standby.ctl

    Finished restore at 07-JAN-15

    sql statement: alter database mount standby database

    released channel: ORA_AUX_DISK_1

    WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to diskgroup only.

    contents of Memory Script:

    {

       set newname for tempfile  1 to

     "+data";

       switch clone tempfile all;

       set newname for datafile  1 to

     "+data";

       set newname for datafile  2 to

     "+data";

       set newname for datafile  3 to

     "+data";

       set newname for datafile  4 to

     "+data";

       set newname for datafile  5 to

     "+data";

       restore

       check readonly

       clone database

       ;

    }

    executing Memory Script

    executing command: SET NEWNAME

    renamed temporary file 1 to +data in control file

    executing command: SET NEWNAME

    executing command: SET NEWNAME

    executing command: SET NEWNAME

    executing command: SET NEWNAME

    executing command: SET NEWNAME

    Starting restore at 07-JAN-15

    allocated channel: ORA_AUX_DISK_1

    channel ORA_AUX_DISK_1: sid=155 devtype=DISK

    channel ORA_AUX_DISK_1: starting datafile backupset restore

    channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set

    restoring datafile 00001 to +DATA

    restoring datafile 00002 to +DATA

    restoring datafile 00003 to +DATA

    restoring datafile 00004 to +DATA

    restoring datafile 00005 to +DATA

    channel ORA_AUX_DISK_1: reading from backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

    channel ORA_AUX_DISK_1: restored backup piece 1

    piece handle=/u01/oracle/rman_bak/db_0hps54f4_1_1 tag=TAG20150107T191548

    channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:45

    Finished restore at 07-JAN-15

    contents of Memory Script:

    {

       switch clone datafile all;

    }

    executing Memory Script

    datafile 1 switched to datafile copy

    input datafile copy recid=8 stamp=868395271 filename=+DATA/standby/datafile/system.260.868395229

    datafile 2 switched to datafile copy

    input datafile copy recid=9 stamp=868395275 filename=+DATA/standby/datafile/undotbs1.279.868395233

    datafile 3 switched to datafile copy

    input datafile copy recid=10 stamp=868395275 filename=+DATA/standby/datafile/sysaux.280.868395233

    datafile 4 switched to datafile copy

    input datafile copy recid=11 stamp=868395275 filename=+DATA/standby/datafile/users.277.868395235

    datafile 5 switched to datafile copy

    input datafile copy recid=12 stamp=868395275 filename=+DATA/standby/datafile/undotbs2.278.868395235

    Finished Duplicate Db at 07-JAN-15

    [oracle@std dbs]$ export ORACLE_SID=standby

    [oracle@std dbs]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:48:47 2015

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> select status from v$instance;

    STATUS

    ------------

    MOUNTED

    SQL> select member from v$logfile;

    MEMBER

    --------------------------------------------------------------------------------

    +DATA/rac/onlinelog/group_2.262.868180179

    +DATA/rac/onlinelog/group_1.261.868180177

    +DATA/rac/onlinelog/group_3.265.868180327

    +DATA/rac/onlinelog/group_4.266.868180329

    SQL> select name from v$datafile;

    NAME

    --------------------------------------------------------------------------------

    +DATA/standby/datafile/system.266.868308455

    +DATA/standby/datafile/undotbs1.268.868308459

    +DATA/standby/datafile/sysaux.267.868308459

    +DATA/standby/datafile/users.270.868308459

    +DATA/standby/datafile/undotbs2.269.868308459

    SQL> SELECT NAME FROM V$TEMPFILE;

    NAME

    --------------------------------------------------------------------------------

    +DATA

    2.1.13             创建standby redo log日志

    创建原则:日志文件大小相等、日志组数量要多1

    主库查询联机日志

    [oracle@rac1 admin]$ export ORACLE_SID=rac1

    [oracle@rac1 admin]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:54:05 2015

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

    With the Partitioning, Real Application Clusters, OLAP, Data Mining

    and Real Application Testing options

    SQL> SELECT THREAD#,GROUP#,BYTES/1024/1024 FROM V$LOG;

       THREAD#     GROUP# BYTES/1024/1024

    ---------- ---------- ---------------

             1          1              50

             1          2              50

             2          3              50

             2          4              50

    RAC有两个redo thread ,每个thread有两个日志组,每个日志文件大小50MB,所以要针对每个thread需要创建3组standby redo log,大小为50MB。

    Standby 库执行:

    alter database add standby logfile thread 1 group 5 ('+DATA/standby/onlinelog/st_redo_5.rdo') size 50m;

    alter database add standby logfile thread 1 group 6 ('+DATA/standby/onlinelog/st_redo_6.rdo') size 50m;

    alter database add standby logfile thread 1 group 7 ('+DATA/standby/onlinelog/st_redo_7.rdo') size 50m;

    alter database add standby logfile thread 2 group 8 ('+DATA/standby/onlinelog/st_redo_8.rdo') size 50m;

    alter database add standby logfile thread 2 group 9 ('+DATA/standby/onlinelog/st_redo_9.rdo') size 50m;

    alter database add standby logfile thread 2 group 10 ('+DATA/standby/onlinelog/st_redo_10.rdo') size 50m;

    SQL> select member from v$logfile;

    MEMBER

    --------------------------------------------------------------------------------

    +DATA/rac/onlinelog/group_2.262.868180179

    +DATA/rac/onlinelog/group_1.261.868180177

    +DATA/rac/onlinelog/group_3.265.868180327

    +DATA/rac/onlinelog/group_4.266.868180329

    +DATA/standby/onlinelog/st_redo_5.rdo

    +DATA/standby/onlinelog/st_redo_6.rdo

    +DATA/standby/onlinelog/st_redo_7.rdo

    +DATA/standby/onlinelog/st_redo_9.rdo

    +DATA/standby/onlinelog/st_redo_10.rdo

    +DATA/standby/onlinelog/st_redo_8.rdo

    10 rows selected.

    2.1.14             开始同步

    在备库上启动redo apply

    SQL> recover managed standby database disconnect from session;

    Media recovery complete.

    2.1.15             确认同步

    SQL> select status from v$instance;

    STATUS

    ------------

    MOUNTED

    SQL> select a.SWITCHOVER_STATUS from v$database a;

    SWITCHOVER_STATUS

    --------------------

    SESSIONS ACTIVE

    日志应用

    SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

    备库执行:

    select name from v$archived_log;

    主库查看:

    SQL> col dest_name format a20

    SQL> select dest_name,status,error from v$archive_dest;

    在rac某个实例上执行

    SQL> create tablespace zhaoja2 datafile size 10m;

    Tablespace created.

    Rac每个实例上执行

    SQL> alter system switch logfile;

    System altered.

    在standby上确认文件产生

    SQL> select name from v$datafile;

    2.1.16             Switchover

    RAC环境,切换时primary和standby都只能有一个instance活动,其他的instance都必须关闭

    (1)       在rac2上执行:

    SQL> shutdown immediate;

    (2)       在rac1上执行:

    SQL> alter database commit to switchover to physical standby with session shutdown;

    Database altered.

    SQL> shutdown immediate;

    ORA-01507: database not mounted

    ORACLE instance shut down.

    (3)       在standby上执行:

    SQL> alter database commit to switchover to primary with session shutdown;

    Database altered.

    SQL> shutdown immediate

    ORA-01109: database not open

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup

    (4)       在rac1上创建standby redolog file:

    SQL> startup mount;

    alter database add standby logfile thread 1 group 5 size 50m;

    alter database add standby logfile thread 1 group 6 size 50m;

    alter database add standby logfile thread 1 group 7 size 50m;

    alter database add standby logfile thread 2 group 8 size 50m;

    alter database add standby logfile thread 2 group 9 size 50m;

    alter database add standby logfile thread 2 group 10 size 50m;

    (5)       开始同步,在rac1执行

    SQL> recover managed standby database disconnect from session;

    Media recovery complete

    (6)       确认同步

    在standby上执行:

    SQL> create tablespace zhaoja4 datafile size 10m;

    create tablespace zhaoja3 datafile size 10m

                                       *

    ERROR at line 1:

    ORA-02236: invalid file name

    SQL> create tablespace zhaoja3 datafile '+DATA/standby/datafile/zhaoja3.dbf' size 10m;

    Tablespace created.

    SQL> alter system switch logfile;

    System altered.

    在rac1上查询:

    SQL> select name from v$datafile;

    NAME

    --------------------------------------------------------------------------------

    +DATA/rac/datafile/system.256.868180113

    +DATA/rac/datafile/undotbs1.258.868180115

    +DATA/rac/datafile/sysaux.257.868180115

    +DATA/rac/datafile/users.259.868180115

    +DATA/rac/datafile/undotbs2.264.868180247

    +DATA/rac/datafile/zhaoja.276.868545559

    +DATA/rac/datafile/zhaoja2.275.868614513

    7 rows selected.

    2.1.17             其他命令

    关闭同步

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

    切换日志

    SQL> alter system switch logfile;

    System altered.

    2.2      rac primary和rac standby

    最好关闭其中一个,在一个上面操作

    2.2.1  配置host

    2.2.1.1          Primary rac两个几点的hosts内容如下:

    127.0.0.1               localhost

    192.168.204.8          rac1

    192.168.204.3          rac1-vip

    10.10.0.2              rac1-priv

    192.168.204.9          rac2

    192.168.204.4          rac2-vip

    10.10.0.3              rac2-priv

    增加:

    192.168.204.101         std1

    192.168.204.102         std2

    192.168.204.103         std1-vip

    192.168.204.104         std2-vip

    2.2.1.2          Standby rac的两个几点如下:

    127.0.0.1               localhost

    192.168.204.101         std1

    192.168.204.103         std1-vip

    10.10.0.11              std1-priv

    192.168.204.102         std2

    192.168.204.104         std2-vip

    10.10.0.12              std2-priv

    增加:

    192.168.204.8          rac1

    192.168.204.9          rac2

    192.168.204.3          rac1-vip

    192.168.204.4          rac2-vip

    2.2.2  修改参数文件

    2.2.2.1          Primary参数文件

    SQL> show parameter db_unique_name

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    db_unique_name                       string      rac

    SQL> ALTER SYSTEM SET service_names=rac scope=both;

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,std)' scope=both;

    SQL> ALTER SYSTEM SET db_file_name_convert='+DATA/rac/datafile/','+DATA/std/datafile/','+DATA/rac/tempfile/','+DATA/std/tempfile/' scope=spfile; 

    SQL> ALTER SYSTEM SET log_file_name_convert='+RECV/rac/onlinelog','+RECV/std/onlinelog' scope=both;

    ERROR at line 1:

    ORA-02095: specified initialization parameter cannot be modified

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=+RECV/rac/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=rac' scope=both;

    SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=std' scope=both; 

    SQL> ALTER SYSTEM SET standby_file_management=auto scope=both;

    SQL> ALTER SYSTEM SET fal_client='rac' scope=both;

    SQL> ALTER SYSTEM SET fal_server='std' scope=both;

    2.2.2.2          创建目录

    mkdir -p /u01/oracle/admin/std/adump

    mkdir -p /u01/oracle/admin/std/bdump

    mkdir -p /u01/oracle/admin/std/cdump

    mkdir -p /u01/oracle/admin/std/dpdump

    mkdir -p /u01/oracle/admin/std/hdump

    mkdir -p /u01/oracle/admin/std/udump

    2.2.2.3          Standby参数文件

    2.2.2.4          Primary上创建参数文件,copy到备库

    SQL> CREATE PFILE='/u01/oracle/rman_bak/initstd.ora' FROM SPFILE;

    [oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/initstd.ora ./

    2.2.2.5          修改

    *.control_files='+data/std/controlfile/Current.260.868180173'

    *.log_archive_dest_1='LOCATION=+RECV/std/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'

    *.log_archive_dest_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=rac'

    *.db_name='rac'

    *.db_unique_name='std'

    *.service_names='std'

    std2.instance_number=2

    std1.instance_number=1

    *.audit_file_dest='/u01/oracle/admin/std/adump'

    *.background_dump_dest='/u01/oracle/admin/std/bdump'

    *.core_dump_dest='/u01/oracle/admin/std/cdump'

    *.user_dump_dest='/u01/oracle/admin/std/udump'

    去掉

    rac1.local_listener='LISTENER_RAC1'

    rac2.local_listener='LISTENER_RAC2'

    *.local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.8)(PORT = 3173))'

    Asm上没有的目录需要手工创建下。

    2.2.2.6          在ASM中创建standby的spfile

    [oracle@std1 soft]$ export ORACLE_SID=+ASM1

    SQL> alter diskgroup data add directory '+data/std';

    或者通过 asmcmd -p 进入目录后用mkdir创建

    [oracle@std1 soft]$ export ORACLE_SID=std1

    [oracle@std1 soft]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 14 17:52:14 2015

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    Connected to an idle instance.

    SQL> create spfile='+DATA/std/spfilestd.ora' from pfile='/u01/oracle/rman_bak/initstd.ora';

    2.2.2.7          为两个实例准备pfile

    [oracle@std2 ~]$ cd /u01/oracle/product/10.2.0/db_1/dbs

    [oracle@std1 dbs]$ echo "spfile='+DATA/std/spfilestd.ora'">initstd1.ora

    [oracle@std2 dbs]$ echo "spfile='+DATA/std/spfilestd.ora'">initstd2.ora

    2.2.3  为两个实例准备密码文件

    [oracle@std1 dbs]$ orapwd file=orapwstd1 password=sys entries=5

    [oracle@std2 dbs]$ orapwd file=orapwstd2 password=sys entries=5

    2.2.4  备份主库

    RMAN>  backup FORMAT  '/u01/oracle/rman_bak/db_%U' database;

    RMAN>  backup FORMAT  '/u01/oracle/rman_bak/con_%U' current controlfile for standby;

    [oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/* ./

    2.2.5  创建standby

    在PRIMARY的RAC1节点

    [oracle@rac1 admin]$ rman target / auxiliary sys/sys@std

    RMAN> duplicate target database for standby;

    此时备库状态:

    节点std1

    SQL> select status from v$instance;

    STATUS

    ------------

    MOUNTED

    注:Standby一个节点为nomount状态,这里我只启动了一个,等恢复完之后,再启动另外一个为mount状态。

    2.2.6  创建standby redo log日志

    创建原则:日志文件大小相等、日志组数量要多1

    主库查询联机日志

    [oracle@rac1 admin]$ export ORACLE_SID=rac1

    [oracle@rac1 admin]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:54:05 2015

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

    With the Partitioning, Real Application Clusters, OLAP, Data Mining

    and Real Application Testing options

    SQL> SELECT THREAD#,GROUP#,BYTES/1024/1024 FROM V$LOG;

       THREAD#     GROUP# BYTES/1024/1024

    ---------- ---------- ---------------

             1          1              50

             1          2              50

             2          3              50

             2          4              50

    RAC有两个redo thread ,每个thread有两个日志组,每个日志文件大小50MB,所以要针对每个thread需要创建3组standby redo log,大小为50MB。

    Standby 库执行:

    alter database add standby logfile thread 1 group 5 ('+DATA/std/onlinelog/st_redo_5.rdo') size 50m;

    alter database add standby logfile thread 1 group 6 ('+DATA/std/onlinelog/st_redo_6.rdo') size 50m;

    alter database add standby logfile thread 1 group 7 ('+DATA/std/onlinelog/st_redo_7.rdo') size 50m;

    alter database add standby logfile thread 2 group 8 ('+DATA/std/onlinelog/st_redo_8.rdo') size 50m;

    alter database add standby logfile thread 2 group 9 ('+DATA/std/onlinelog/st_redo_9.rdo') size 50m;

    alter database add standby logfile thread 2 group 10 ('+DATA/std/onlinelog/st_redo_10.rdo') size 50m;

    SQL> select member from v$logfile;

    MEMBER

    --------------------------------------------------------------------------------

    +DATA/rac/onlinelog/group_2.262.868180179

    +DATA/rac/onlinelog/group_1.261.868180177

    +DATA/rac/onlinelog/group_3.265.868180327

    +DATA/rac/onlinelog/group_4.266.868180329

    +DATA/standby/onlinelog/st_redo_5.rdo

    +DATA/standby/onlinelog/st_redo_6.rdo

    +DATA/standby/onlinelog/st_redo_7.rdo

    +DATA/standby/onlinelog/st_redo_9.rdo

    +DATA/standby/onlinelog/st_redo_10.rdo

    +DATA/standby/onlinelog/st_redo_8.rdo

    10 rows selected.

    2.2.7  把standby rac注册到crs中

    因为standby rac不是通过dbca等工具创建,而是手工创建,所以不会自动注册到crs中,需要手工注册,下面操作可以在任何一个节点操作:

    2.2.7.1          添加数据库和实例

    [oracle@std1 rman_bak]$ srvctl add database -d std -o /u01/oracle/product/10.2.0/db_1/

    [oracle@std1 rman_bak]$ srvctl add instance -d std -i std1 -n std1

    [oracle@std1 rman_bak]$ srvctl add instance -d std -i std2 -n std2

    Usage: srvctl add instance -d <name> -i <inst_name> -n <node_name>

    2.2.7.2          指定数据库实例依赖ASM实例

    [oracle@std1 rman_bak]$ srvctl modify instance -d std -i std1 -s +ASM1

    [oracle@std1 rman_bak]$ srvctl modify instance -d std -i std2 -s +ASM2

    如果ASM也需要手工注册???????????????????

    [oracle@std1 rman_bak]$ srvctl add asm -n std1 -i +ASM1 -o /u01/oracle/product/10.2.0/db_1/ -p /u01/oracle/product/10.2.0/db_1/dbs/spfile+ASM1.ora

    PRKS-1000 : ASM instance "+ASM1" already exists on node "std1"

    系统启动时,自动启动ASM

    [oracle@std1 rman_bak]$ srvctl enable asm -n std1 -i +ASM1

    [oracle@std1 rman_bak]$ srvctl enable asm -n std2 -i +ASM2

    2.2.8  在任意一个节点开始恢复,节点状态为mount

    SQL> alter database recover managed standby database disconnect from session;

    Database altered.

    2.2.9  测试

    在primary创建一个表空间

    SQL> create tablespace zhaoja17 datafile size 10m;

    Tablespace created.

    SQL> select name from v$datafile;

    NAME

    --------------------------------------------------------------------------------

    +DATA/rac/datafile/system.256.868180113

    +DATA/rac/datafile/undotbs1.258.868180115

    +DATA/rac/datafile/sysaux.257.868180115

    +DATA/rac/datafile/users.259.868180115

    +DATA/rac/datafile/undotbs2.264.868180247

    +DATA/rac/datafile/zhaoja.276.868545559

    +DATA/rac/datafile/zhaoja2.275.868614513

    +DATA/rac/datafile/zhaoja3.273.868639251

    +DATA/rac/datafile/zhaoja4.277.868785219

    +DATA/rac/datafile/zhaoja15.278.869083171

    10 rows selected.

    执行日志切换

    SQL> alter system switch logfile;

    System altered.

    在standby rac上查看

    SQL> select name from v$datafile;

    SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

    日志应用

    SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

    2.2.10             Switchover

    3           问题:

    3.1      WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to diskgroup only.

    http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmtspit.htm#CIHHGCGF

    If the DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT parameters change a substring other than the disk group name, the conversion is ignored and the resulting disk group name is used, for example:

    DB_FILE_NAME_CONVERT='+DATAFILE/prod','+DATAFILE/tspitr'

    The preceding command results in an invalid ASM OMF file name and the change is ignored. Instead, the files are created in disk group name +DATAFILE and the following message is issued:

    WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to disk group only

    3.2      RMAN> duplicate target database for standby;

    报错:

    restoring datafile 00001 to +DATA

    restoring datafile 00002 to +DATA

    restoring datafile 00003 to +DATA

    restoring datafile 00004 to +DATA

    restoring datafile 00005 to +DATA

    channel ORA_AUX_DISK_1: reading from backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

    ORA-19870: error reading backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

    ORA-19504: failed to create file "+DATA"

    ORA-17502: ksfdcre:4 Failed to create file +DATA

    ORA-15001: diskgroup "DATA" does not exist or is not mounted

    ORA-15077: could not locate ASM instance serving a required diskgroup

    failover to previous backup

    错误原因:

    进入asm磁盘组,删除已有的文件

    [oracle@std dbs]$ export ORACLE_SID=+ASM

    [oracle@std dbs]$ asmcmd -p

    ASMCMD [+] > ls

    DATA/

    RECV/

    ASMCMD [+] > cd data

    ASMCMD [+data] > ls

    ASMCMD [+data/standby/datafile] > rm -rf *

    3.3      日志未传送

    (1)

    SQL> select dest_name,status,error from v$archive_dest;

    LOG_ARCHIVE_DEST_3   ERROR

    ORA-00254: error in archive control string ''

    查看错误日志

    [oracle@rac1 dbs]$ tail -20 /u01/oracle/admin/rac/bdump/alert_rac1.log

    Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

    ORA-00254: error in archive control string ''

    Thu Jan  8 09:05:01 2015

    FAL[server, ARC1]: FAL archive failed, see trace file.

    Thu Jan  8 09:05:01 2015

    Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

    ORA-16055: FAL request rejected

    ARCH: FAL archive failed. Archiver continuing

    Thu Jan  8 09:05:01 2015

    ORACLE Instance rac1 - Archival Error. Archiver continuing.

    Thu Jan  8 09:05:03 2015

    Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

    ORA-00254: error in archive control string ''

    FAL[server, ARC1]: FAL archive failed, see trace file.

    Thu Jan  8 09:05:03 2015

    Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

    ORA-16055: FAL request rejected

    ARCH: FAL archive failed. Archiver continuing

    Thu Jan  8 09:05:03 2015

    ORACLE Instance rac1 - Archival Error. Archiver continuing.

    查看trace文件

    [oracle@rac1 dbs]$ tail -20 /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc

    ORA-16055: FAL request rejected

    ARCH: Connecting to console port...

    ARCH: Connecting to console port...

    FAL[server]: Selected inactive destination; resetting temporarily

    Redo shipping client performing standby login

    *** 2015-01-08 09:05:03.142 66535 kcrr.c

    Logged on to standby successfully

    Client logon and security negotiation successful!

    Error 254 creating standby archive log file at host 'standby'

    *** 2015-01-08 09:05:03.172 62692 kcrr.c

    ARC1: Attempting destination LOG_ARCHIVE_DEST_3 network reconnect (254)

    *** 2015-01-08 09:05:03.172 62692 kcrr.c

    ARC1: Destination LOG_ARCHIVE_DEST_3 network reconnect abandoned

    ORA-00254: error in archive control string ''

    *** 2015-01-08 09:05:03.172 60970 kcrr.c

    kcrrfail: dest:3 err:254 force:0 blast:1

    kcrrwkx: unknown error:254

    ORA-16055: FAL request rejected

    ARCH: Connecting to console port...

    ARCH: Connecting to console port...

    查看错误代码

    [oracle@rac1 rman_bak]$ oerr ora 254

    00254, 00000, "error in archive control string '%s'"

    // *Cause: The specified archive log location is invalid in the archive

    //         command or the LOG_ARCHIVE_DEST initialization parameter.

    // *Action: Check the archive string used to make sure it refers to a valid

    //       online device.

    解决办法:

    LOG_ARCHIVE_DEST配置的不对,standby的参数文件:service_names未配置

    (2)

    PING[ARC0]: Heartbeat failed to connect to standby 'std'. Error is 16058

    [oracle@rac1 admin]$ oerr ora 16058

    16058, 00000, "standby database instance is not mounted"

    // *Cause:  The RFS process on the standby database received an internal error.

    // *Action: Check the standby alert log and RFS trace files for more

    //          information.

    查询备库alert日志,发现备库的归档日志目录由于未手工创建,报错,创建目录,正常。

    3.4   其他莫名其妙的错误:

    如果出现了莫名其妙的错误,绝大多数是某个参数配置错误(参数不合法),验证参数合法性即可。

    3.4      日志传送了,但是未应用

    SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

    PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS

    --------- ------------ ---------- ---------- ---------- ----------

    ARCH      CLOSING               1         42          1         51

    ARCH      CLOSING               2         36          1         24

    RFS       IDLE                  0          0          0          0

    RFS       IDLE                  0          0          0          0

    MRP0      WAIT_FOR_GAP          1         38          0          0

    这是在等38吗?查看主库38的归档已经被我删了,重新再恢复个standby试试,重新备份恢复standby正常。

    Dataguard模式

    SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

    DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL

    ---------------- -------------------- --------------------

    PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

    3.5      删除监听

    [oracle@std1 bin]$ ./crs_stop ora.std1.LISTENER_STD1.lsnr

    Attempting to stop `ora.std1.LISTENER_STD1.lsnr` on member `std1`

    Stop of `ora.std1.LISTENER_STD1.lsnr` on member `std1` succeeded.

    [oracle@std1 bin]$ ./crs_unregister ora.std1.LISTENER_STD1.lsnr

    [oracle@std1 bin]$ ./crs_unregister ora.std2.LISTENER_STD2.lsnr

    3.6      ERROR:ORA-12528: TNS:listener: all appropriate instances are blocking new connections

    总结ORA-12528问题是因为监听中的服务使用了动态服务,系统启动后,数据库没有正常的MOUNT,因此在动态模式下,就会出现这个问题,用静态的就不会有这个问题,因此上面的方法就是:

    把监听设置为静态

    在tnsnames.ora中追加(UR=A)

    从启动服务

    用静态注册的风险是,如果在instance运行中,lisener重新启动,就找不到instance了。换言之,静态注册需要先启动lisener,再启动instance。而且静态模式下,lisener status显示的是unknown
    而且,用动态的话,instance nomount状态下,一般是dba需要进行操作(比如恢复),这个时候一般直接登陆到host进行,不使用tns远程连接

    3.7      database name 'RAC' in control file is not

    db_name参数设置问题

  • 相关阅读:
    Java类变量和成员变量初始化过程
    Linux命令学习笔记
    gitlab本地部署方法(ubuntu16.04+gitlab9.5.5)
    Hanoi塔
    求递归算法时间复杂度:递归树
    最大堆/最小堆
    Matlab中plot基本用法
    这是一篇叼炸天的博客
    c++ static理解
    经典排序算法+文件操作~c语言实现
  • 原文地址:https://www.cnblogs.com/huanhuanang/p/4235245.html
Copyright © 2020-2023  润新知