zoukankan      html  css  js  c++  java
  • Oracle RAC + Data Guard 环境搭建 . 天高地厚

    Oracle 高可用性的三个主要体现是: RAC, Data Guard 和 Stream.  所以熟练掌握这些技术就是评价DBA的标准一个。 RAC + Data Guard 主要用在灾备或者报表服务器上。 比如用RAC+ 逻辑standby 做报表,从而减轻RAC 系统的压力。 

    关于Data Guard 的一些原理知识可以参考:

          Oracle Data Guard 理论知识

         http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx

    Oracle Data Gurad Physical Standby 相关说明

    http://blog.csdn.net/tianlesoftware/archive/2010/05/04/5557410.aspx

     

    RAC 的知识参考:

    RAC 的一些概念性和原理性的知识

    http://blog.csdn.net/tianlesoftware/archive/2010/02/27/5331067.aspx

    Redhat 5.4 + ASM + RAW+ Oracle 10g RAC 安装文档

    http://blog.csdn.net/tianlesoftware/archive/2010/09/09/5872593.aspx

    RAC 和 Data Guard 的组合有4种情况:

    组合

    Primary

     Standby

    1

    Single Instance

    Single Instance

    2

    Single Instance

    RAC

    3

    RAC

    Single Instance

    4

    RAC

    RAC

    在RAC + DG 平台下,重用的几个视图:

    (1)    v$archive_dest_status: 在Standby Database 上可以在这个视图中查看接收的日志编号,恢复的日志编号,从而可以了解Standby Database 和 Primary Database 日志的差别。 如果standby 比Primary 滞后太多,可以考虑增加恢复进程。 该视图中的recovery_mode 列也显示了是否使用了实时恢复(Real-Time Apply).

    (2)    v$archive_dest: 这个视图中的error 列可以用于辅助诊断。

    (3)    v$managed_standby:  这个视图可以确认standby RAC中,哪个实例是执行recover 的实例。

    下面实验是RAC + Single standby 的模式。

    一. 测试环境

    1.1  RAC Primary Database 环境

    RAC primary

    Rac1

    Rac2

    Public IP

    10.85.10.1

    10.85.10.2

    Private IP

    192.168.1.200

    192.168.1.201

    Virtual IP

    10.85.10.3

    10.85.10.4

    Instance

    Orcl1

    Orcl2

    DB_NAME

    Orcl

    Data,Control File, Redo File

    ASM

    1.2  Standby Database 环境

    Single Instance Standby

     说明

    IP

    10.85.10.5

    Oracle

    非RAC 版本

    Instance

    Orcl

    Data,Control File,Redo File

    /u01

    二.配置说明

    1.3  switchover 之前,这时RAC是Primary Database

    (1)    RAC的每个实例都要配置日志发送,目的地指向Standby。

    (2)    确认日志发送的方法。如:LGWR

    (3)    Standby 配置日志接收方法,如:standby redo log。

    (4)    启动MRP

    1.4  switchover 之后,此时,rac 是standby database

    如果Standby 是RAC,则日志接收和日志恢复可以是不同的Instance。 因此Oracle 在术语上把这两种实例分别叫作Receive Instance 和 Recover Instance。 在这个实验中,放在一个实例上进行。

    (1)    Single Instance 的日志只发送到RAC的一个实例。

    (2)    确认RAC 的日志接收方法,如: Standby Redo Log。

    (3)    在RAC的一个实例上启动MRP.

    三. 开始搭建

    3.1 主库归档模式设置

           Data Guard 用的归档日志来完成同步, 所以在实验之前, 主库必须是归档模式。 这里就RAC 的归档。 关于RAC的归档参考Blog RAC 之 RMAN 备份中的1.2 节。 设置归档就那么几步, 设置好归档目录,然后关闭所以节点,最后在一个节点上将模式设置为归档就ok了。

    RAC 之 RMAN 备份

    http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx

    3.2 准备备库环境

    安装Oracle软件,并建立实例的相关目录。Linux 平台上Oracle 的安装参考blog:

                  linux平台下oracle数据库安装

                  http://blog.csdn.net/tianlesoftware/archive/2009/10/24/4718218.aspx

    在备库创建相关目录

    mkdir -p  $ORACLE_BASE/oradata/orcl/datafile

    mkdir -p  $ORACLE_BASE/oradata/orcl/tempfile

    mkdir -p  $ORACLE_BASE/admin/orcl/adump

    mkdir -p  $ORACLE_BASE/admin/orcl/bdump

    mkdir -p  $ORACLE_BASE/admin/orcl/cdump

    mkdir -p  $ORACLE_BASE/admin/orcl/dpdump

    mkdir -p  $ORACLE_BASE/admin/orcl/hdump

    mkdir -p  $ORACLE_BASE/admin/orcl/pfile

    mkdir -p  $ORACLE_BASE/admin/orcl/udump

    这里要注意的地方:

           因为RAC 主库是用ASM 来存放的,所以这里设置的目录,与ASM 目录是不一致的, 这种情况下,我们就需要在参数文件里用db_file_name_convert和 log_file_name_convert 参数来进行转换。

    3.3        配置主备库的监听,修改tnsnames.ora 和 listener.ora  文件

    主备库的tnsnames.ora 文件是一致的。 修改成如下:

    ORCL2 =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = orcl)

          (INSTANCE_NAME = orcl2)

        )

      )

    ORCL1 =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = orcl)

          (INSTANCE_NAME = orcl1)

        )

      )

    ORCL_ST =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST =10.85.10.5 )(PORT = 1521))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SID = orcl)

        )

      )

    这里要注意RAC 实例和单实例配置上的区别。 上面以用红色标出。

    用net manager 工具,在备库创建一个监听。 也可以手动的在listener.ora 文件里添加如下内容:

          

    SID_LIST_LISTENER_RAC2 =

      (SID_LIST =

        (SID_DESC =

          (SID_NAME = PLSExtProc)

          (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

          (PROGRAM = extproc)

        )

       (SID_DESC =

          (SID_NAME = orcl)

          (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

        )

      )

    LISTENER =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.5)(PORT = 1521))

      )

    注意:SID_LIST_LISTENER 配置的是静态注册,如果没有该参数,而且Data Guard 启动顺序又不正确,那么在主库可能会报 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 错误,导致归档无法完成。

    Oracle Listener 动态注册 与 静态注册

    http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx

    3.4        在主库上创建备库的密码文件和控制文件,并将文件传到备库的相关位置

    3.4.1 密码文件:

    [oracle@rac2 dbs]$ pwd

    /u01/app/oracle/product/10.2.0/db_1/dbs

    [oracle@rac2 bin]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle

    [oracle@rac2 bin]$ cd $ORACLE_HOME/dbs/

    [oracle@rac2 dbs]$ ls

    ab_+ASM2.dat  init+ASM2.ora  initorcl2.ora  orapworcl1

    hc_+ASM2.dat  initdw.ora     orapw+ASM2     orapworcl2

    hc_orcl2.dat  init.ora       orapworcl      snapcf_orcl2.f

    缺省情况下,win下口令文件的格式是pwdsid.oraunix下的格式是orapwSID(大小写敏感)

     

    参考:

    Oracle OS认证 口令文件 密码丢失处理

    http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx

    传送文件:

    [oracle@rac2 dbs]$ scp orapworcl 10.85.10.5://u01/app/oracle/product/10.2.0/db_1/dbs

    orapworcl                                     100% 1536     1.5KB/s   00:00

    [oracle@rac2 dbs]$

    3.4.2 控制文件

    [oracle@rac1 admin]$ export ORACLE_SID=orcl1

    [oracle@rac1 admin]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 03:39:00 2010

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

    SQL> conn system/oracle;

    Connected.

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

    Database altered.

    SQL>

    --判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。

    传送文件:

    [oracle@rac1 u01]$ scp control01.ctl 10.85.10.5://u01/app/oracle/oradata/orcl/datafile

    control01.ctl                                 100%   15MB   1.4MB/s   00:11

    在备库上将控制文件复制2份,并命名为control02.ctl, control03.ctl

    [oracle@rac3 orcl]$ cp control01.ctl control02.ctl

    [oracle@rac3 orcl]$ cp control01.ctl control03.ctl

    [oracle@rac3 orcl]$ ls

    control01.ctl  control02.ctl  control03.ctl

    3.5 参数文件

    3.5.1 主库的参数文件

    先用spfile 来创建pfile 文件。 这里要注意的,不要直接用create pfile from spfile来创建。 至于为什么参考Blog:

           RAC 修改 spfile 参数

    http://blog.csdn.net/tianlesoftware/archive/2010/09/24/5902591.aspx

    [oracle@rac1 u01]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 04:33:51 2010

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

    SQL> conn / as sysdba

    Connected.

    SQL> create pfile='/u01/tmp.ora' from spfile;

    File created.

    SQL> !

    [oracle@rac1 u01]$ cd /u01

    [oracle@rac1 u01]$ ls

    app               dave.log                    RAC_hot_database_backup.sh.out

    backup            dave.ora                    tianlesoftware.dmp

    control01.ctl     impdp.log                   tmp.ora

    dave_2010929.dmp  RAC_hot_database_backup.sh

    [oracle@rac1 u01]$ more tmp.ora

    通过more 命令,我们就可以看到rac pfile 参数的内容,对于RAC 主库,我们不需要做什么修改,只需要添加如下内容:

    *.log_archive_config='dg_config=(orcl,orcl_st)'

    *.log_archive_dest_3='service=orcl_st VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl_st'

    *.db_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/datafile',

    ' /u01/app/oracle/oradata/orcl/tempfile','+DATA/orcl/tempfile'

    *.log_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile', '+DATA/orcl/datafile'

    *.standby_file_management=auto

    *.fal_server='orcl_st'

    orcl1.fal_client='orcl1'

    orcl2.fal_client='orcl2'

    这里要注意的地方:如果之前配置了实例之间归档文件的互相传送,那么这里需要加上db_unique_name 参数:

    orcl2.log_archive_dest_2='service=orcl1 db_unique_name=orcl'

    orcl1.log_archive_dest_2='service=orcl2 db_unique_name=orcl'

    不然在启动时会报如下错误:

    BAD PARAM ORA-16052: DB_UNIQUE_NAME attribute is required

    查询Data Guard 的db_unique_name 可以通过v$dagatuard_config视图:

    SQL> select * from v$dataguard_config;

    DB_UNIQUE_NAME

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

    orcl

    orcl_st

    如果之前没有添加,可以通过修改pfile,在用pfile 创建spfile,或者用SQL, 如:

    SQL> alter system set log_archive_dest_2='service=orcl1 db_unique_name=orcl' sid='orcl2';

    关于这些参数的意义,可以参考:

    Oracle Data Guard 理论知识

    http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx

    一些说明:

    (1)    使用ASM 作存储时,datafile 和tempfile 是分别放在两个目录下的,所以在standby 上也单独创建一个tempdata 目录,并在db_file_convert 中作相应的设置。

    (2)    在使用ASM的RAC中,注意不要修改db_unique_name 的参数值,因为ASM 存放文件的规则,是按照+diskgroup_name/database_unique_name/file_type/tag_name.file_number.incarnation 这样一个规则存放的,但是第二项database_unique_name 并不是db_name; 如果改变了db_unique_name,则之后创建的数据文件会放到新的目录下,会导致db_file_convert的失败,这一点需要特别注意。

    (3)    如果RAC中使用db_create_online_dest_n 系列的参数,要相应调整standby 上的log_file_name_convert 参数。

    第一点里提到ASM 分开存放文件,我们可以用asmcmd 命令连上ASM 验证一下:

    [oracle@rac2 +ASM]$ export ORACLE_SID=+ASM2

    [oracle@rac2 +ASM]$ asmcmd

    ASMCMD> ls

    DATA/

    FLASH_RECOVERY_AREA/

    ASMCMD> cd DATA

    ASMCMD> ls

    ORCL/

    ASMCMD> cd ORCL/

    ASMCMD> ls

    CONTROLFILE/

    DATAFILE/

    ONLINELOG/

    PARAMETERFILE/

    TEMPFILE/

    spfileorcl.ora

    ASMCMD> cd TEMPFILE

    ASMCMD> ls

    TEMP.283.730181265

    3.5.2 备库的参数文件

           备库的初始化文件,在主库的基础上修改一下,把不用的删除掉就可以了。 对于设计到Data Guard的参数,修改一下参数的值就可以了。 最终备库的参数如下:

    [oracle@rac3 dbs]$ more initorcl.ora

    *.audit_file_dest='/u01/app/oracle/admin/orcl/adump'

    *.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'

    *.compatible='10.2.0.1.0'

    *.control_files='/u01/app/oracle/oradata/orcl/datafile/control01.ctl','/u01/app/oracle/oradata/orcl/

    datafile/control02.ctl','/u01/app/oracle/oradata/orcl/datafile/control03.ctl'

    *.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'

    *.db_block_size=8192

    *.db_domain=''

    *.db_file_multiblock_read_count=16

    *.db_name='orcl'

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

    *.job_queue_processes=10

    *.log_archive_dest_1='LOCATION=/u01/arch'

    *.log_archive_dest_state_2='ENABLE'

    *.open_cursors=300

    *.pga_aggregate_target=59768832

    *.processes=150

    *.remote_login_passwordfile='exclusive'

    *.sga_target=179306496

    *.undo_management='AUTO'

    *.undo_tablespace='UNDOTBS1'

    *.user_dump_dest='/u01/app/oracle/admin/orcl/udump'

    *.db_unique_name=orcl_st  -- 注意,这个值要和主库参log_archive_dest_n里设置的一致,不然会报错误:ORA-16047: DGID mismatch between destination

    *.log_archive_config='dg_config=(orcl,orcl_st)'

    *.log_archive_dest_2='service=orcl1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl1'

    *.db_file_name_convert='+DATA/orcl/datafile','/u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/tem

    pfile','/u01/app/oracle/oradata/orcl/tempfile'

    *.log_file_name_convert='+DATA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile',

    '+FLASH_RECOVERY_AREA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile'

    *.standby_file_management=auto

    *.standby_archive_dest='/u01/arch'

    *.fal_server='orcl1','orcl2'

    *.fal_client='orcl2'

    这里面关于log_file_name_conver 参数:

    先从主库查看v$logfile:

    SQL>Select * from v$logfile;

       GROUP# STATUS  TYPE    MEMBER

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

             2         ONLINE  +DATA/orcl/onlinelog/group_2.282.730181191

             2         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018

             1         ONLINE  +DATA/orcl/onlinelog/group_1.281.730181173

             1         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018

             3         ONLINE  +DATA/orcl/onlinelog/group_3.285.730181443

             3         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018

             4         ONLINE  +DATA/orcl/onlinelog/group_4.286.730181451

             4         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018

    如果这里除了+DATA,还有+FLASH_RECOVERY_AREA, 那么这些redo 都需要在参数里指定进行转换。 不然通过rman ,这些路径也会被复制过去,但是standby上是无法访问这些路径的,所以在做switchover 切换的时候,就会报错。 这点是要注意的地方。

    3.6  RMAN 备份主库并将备份文件传到standby上

          

    这里用的是RMAN 复制的方法来搭建standby 环境。 可以参考我的Blog:

           用RMAN复制 搭建 物理 Data Gurad 环境

          http://blog.csdn.net/tianlesoftware/archive/2010/07/23/5756750.aspx

     

    备份文件,放在/u01/rmanback 目录下,我们在rac1节点进行备份。 在standby 节点也需要建同样的目录,还需要把备份文件copy到这个目录下。

    [oracle@rac1 bin]$ rman target /

    Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 12:13:07 2010

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

    connected to target database: ORCL (DBID=1257961898)

    RMAN> RUN {

    allocate channel c1 type disk;

    allocate channel c2 type disk;

    sql 'alter system archive log current';

    backup current controlfile for standby format='/u01/rmanbackup/control_%U';

    BACKUP FORMAT '/u01/rmanbackup/orcl_%U_%T' skip inaccessible filesperset 5 DATABASE ;

    sql 'alter system archive log current';

    BACKUP FORMAT '/u01/rmanbackup/arch_%U_%T' skip inaccessible filesperset 5 ARCHIVELOG ALL DELETE INPUT;

    release channel c2;

    release channel c1;

    }

    SCP 拷贝到 standby 上:

    [oracle@rac1 rmanbackup]$ scp * 10.85.10.5://u01/rmanbackup/

    RMAN备份有一些注意事项,具体参考我的blog:

           RAC 之 RMAN 备份

    http://blog.csdn.net/tianlesoftware/archive/2010/09/22/5901053.aspx

     

    3.7用之前创建的初始化参数文件将备库启动到nomount 状态:

    启动监听:

    [oracle@rac3 admin]$ lsnrctl start

    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 08-OCT-2010 12:41:43

    Copyright (c) 1991, 2005, Oracle.  All rights reserved.

    Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 10.2.0.1.0 - Production

    System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora

    Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log

    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.5)(PORT=1521)))

    STATUS of the LISTENER

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

    Alias                     LISTENER

    Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

    Start Date                08-OCT-2010 12:41:43

    Uptime                    0 days 0 hr. 0 min. 0 sec

    Trace Level               off

    Security                  ON: Local OS Authentication

    SNMP                      OFF

    Listener Parameter File   /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora

    Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log

    Listening Endpoints Summary...

      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))

    The listener supports no services

    The command completed successfully

    启动数据库:

    [oracle@rac3 u01]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 12:37:08 2010

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

    SQL> conn / as sysdba

    Connected to an idle instance.

    SQL> startup nomount pfile=?/dbs/initorcl.ora

    ORACLE instance started.

    Total System Global Area  180355072 bytes

    Fixed Size                  1218388 bytes

    Variable Size              62916780 bytes

    Database Buffers          113246208 bytes

    Redo Buffers                2973696 bytes

    SQL>

    3.8 rman还原数据库:

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

    Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 13:25:31 2010

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

    connected to target database: ORCL (DBID=1257961898)

    connected to auxiliary database: ORCL (not mounted)

    RMAN> duplicate target database for standby;

    Finished Duplicate Db at 09-OCT-10

    3.9 检查standby 数据库

    SQL> select status from v$instance;

    STATUS

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

    MOUNTED

    SQL> select name from v$datafile;

    NAME

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

    /u01/app/oracle/oradata/orcl/datafile/system.276.730181051

    /u01/app/oracle/oradata/orcl/datafile/undotbs1.278.730181053

    /u01/app/oracle/oradata/orcl/datafile/sysaux.277.730181053

    /u01/app/oracle/oradata/orcl/datafile/users.279.730181053

    /u01/app/oracle/oradata/orcl/datafile/undotbs2.284.730181347

    /u01/app/oracle/oradata/orcl/datafile/tianlesoftware.dbf

    /u01/app/oracle/oradata/orcl/datafile/anhuianqing.dbf

    7 rows selected.

    SQL> select name from v$tempfile;

    NAME

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

    /u01/app/oracle/oradata/orcl/tempfile/temp.283.730181265

    将备库启动到mount standby 状态,并启动MRP 进程:

    SQL> startup nomount;

    ORACLE instance started.

    Total System Global Area  180355072 bytes

    Fixed Size                  1218388 bytes

    Variable Size              62916780 bytes

    Database Buffers          113246208 bytes

    Redo Buffers                2973696 bytes

    SQL> alter database mount standby database;

    Database altered.

    SQL> recover managed standby database disconnect from session;

    Media recovery complete.

    SQL>

    3.10 添加standby redo log 日志

           RAC 每个Redo Thread 都需要创建对应的Standby Redo Log。 创建原则和单实例一样,包括日志文件大小相等,日志组数量要多1组。

    在RAC里查看联机日志:

    [oracle@rac2 rmanbackup]$ export ORACLE_SID=orcl2

    [oracle@rac2 rmanbackup]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 03:49:49 2010

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

    SQL> conn  / as sysdba;

    Connected.

    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。

    Alter database add standby logfile thread 1 group 5 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_05.log') size 50m;

    Alter database add standby logfile thread 1 group 6 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_06.log') size 50m;

    Alter database add standby logfile thread 1 group 7 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_07.log') size 50m;

    Alter database add standby logfile thread 2 group 8 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_08.log') size 50m;

    Alter database add standby logfile thread 2 group 9 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_09.log') size 50m;

    Alter database add standby logfile thread 2 group 10 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_10.log') size 50m;

    添加完可以用: select * from v$logfile 查看日志情况。

    3.11 先停止RAC 实例,然后用之前创建的pfile 启动rac 实例。

    [oracle@rac1 u01]$ cd /u01/app/oracle/product/crs/bin/

    [oracle@rac1 bin]$ srvctl stop database -d orcl

    [oracle@rac1 bin]$ crs_stat -t

    Name           Type           Target    State     Host

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

    ora.orcl.db    application    OFFLINE   OFFLINE

    ora....oltp.cs application    OFFLINE   OFFLINE

    ora....cl1.srv application    OFFLINE   OFFLINE

    ora....cl2.srv application    OFFLINE   OFFLINE

    ora....l1.inst application    OFFLINE   OFFLINE

    ora....l2.inst application    OFFLINE   OFFLINE

    ora....SM1.asm application    ONLINE    ONLINE    rac1

    ora....C1.lsnr application    ONLINE    ONLINE    rac1

    ora.rac1.gsd   application    ONLINE    ONLINE    rac1

    ora.rac1.ons   application    ONLINE    ONLINE    rac1

    ora.rac1.vip   application    ONLINE    ONLINE    rac1

    ora....SM2.asm application    ONLINE    ONLINE    rac2

    ora....C2.lsnr application    ONLINE    ONLINE    rac2

    ora.rac2.gsd   application    ONLINE    ONLINE    rac2

    ora.rac2.ons   application    ONLINE    ONLINE    rac2

    ora.rac2.vip   application    ONLINE    ONLINE    rac2

    [oracle@rac1 bin]$ export ORACLE_SID=orcl1

    [oracle@rac1 bin]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 05:27:55 2010

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

    SQL> conn / as sysdba;

    Connected to an idle instance.

    SQL> create spfile from pfile='/u01/tmp.ora';

    File created.

    启动所有节点:

    SQL> startup

    ORACLE instance started.

    Total System Global Area  180355072 bytes

    Fixed Size                  1218388 bytes

    Variable Size             109054124 bytes

    Database Buffers           67108864 bytes

    Redo Buffers                2973696 bytes

    Database mounted.

    Database opened.

    这里有遇到了点麻烦,参考:

    ORA-01677 standby file name convert parameters differ from other instance 错误

    http://blog.csdn.net/tianlesoftware/archive/2010/10/09/5930227.aspx

    3.12 在主库查看日志传送情况

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

    DEST_NAME            STATUS    ERROR

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

    LOG_ARCHIVE_DEST_1   VALID

    LOG_ARCHIVE_DEST_2   VALID

    LOG_ARCHIVE_DEST_3   VALID

    LOG_ARCHIVE_DEST_4   INACTIVE

    LOG_ARCHIVE_DEST_5   INACTIVE

    LOG_ARCHIVE_DEST_6   INACTIVE

    LOG_ARCHIVE_DEST_7   INACTIVE

    LOG_ARCHIVE_DEST_8   INACTIVE

    LOG_ARCHIVE_DEST_9   INACTIVE

    LOG_ARCHIVE_DEST_10  INACTIVE

    10 rows selected.

    两个节点都正常。

    3.13 验证同步情况

    在主备库分别切换日志:

    SQL> alter system switch logfile;

    System altered.

    SQL> select sequence# from v$archived_log;

    SEQUENCE#

    ----------

            15

            16

    SQL> alter system switch logfile;

    System altered.

    SQL> select sequence# from v$archived_log;

    SEQUENCE#

    ----------

            17

            18

    在备库进行验证:

    SQL> select sequence#,applied from v$archived_log;

     SEQUENCE# APP

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

            13 YES

             4 NO

            14 YES

            15 YES

            16 YES

            18 NO

            16 YES

            17 YES

            18 YES

            19 YES

    同步成功。 至此RAC 为主库的,备库为单实例的 Oracle 的Data Guard 环境已经搭建完成。

    四. Switchover 切换

    之前blog上的一篇单实例间切换的例子:

    Oracle Data Guard Switchover 切换

    http://blog.csdn.net/tianlesoftware/archive/2010/07/27/5768602.aspx

    RAC 环境下,切换Primary 和 Standby 时,只能有一个实例是活动的, 其他实例必须关闭。

    这里我们关闭rac2节点。

    SQL> select instance_name from v$instance;

    INSTANCE_NAME

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

    orcl2

    SQL> shutdown immediate

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL>

    在RAC1 节点将主库切换到备库:

    SQL> select instance_name from v$instance;

    INSTANCE_NAME

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

    orcl1

    SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

    SWITCHOVER_STATUS

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

    SESSIONS ACTIVE

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

    Database altered.

    SQL> shutdown immediate;

    将备库切换成主库:

    SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

    SWITCHOVER_STATUS

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

    TO PRIMARY

    SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown;

    SQL> shutdown immediate;

    在rac1(原来的主库)节点上创建standby redo log file:

    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

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

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

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

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

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

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

    添加之后可以通过v$logfile 视图查看:

    SQL> select * from v$logfile;

    rows will be truncated

        GROUP# STATUS  TYPE    MEMBER

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

             2         ONLINE  +DATA/orcl/onlinelog/group_2.282.730181191

             2         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018

             1         ONLINE  +DATA/orcl/onlinelog/group_1.281.730181173

             1         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018

             3         ONLINE  +DATA/orcl/onlinelog/group_3.285.730181443

             3         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018

             4         ONLINE  +DATA/orcl/onlinelog/group_4.286.730181451

             4         ONLINE  +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018

             5         STANDBY +DATA/orcl/onlinelog/group_5.292.731930683

             5         STANDBY +FLASH_RECOVERY_AREA/orcl/onlinelog/group_5.268.73193

    Standby 日志添加完之后,就可以启动实例了。 同样要注意的是, 如果standby 是RAC 环境, MRP 只能在一个实例上执行,这和RAC的恢复操作一样,而其他实例只能运行RFS。

    这种切换的意义并不大,RAC 本身就是一个高可用性的系统,它有多个节点可以规避宕机的风险。 RAC + 逻辑standby 这种用法还是比较常见。 我们公司目前也是用这种搭配方法,逻辑standby 用来做报表数据库。

  • 相关阅读:
    PTA L2-026 小字辈 (25分)
    Python自学-day36(前端框架--VUE)
    WebGoat教程学习(七)--XPATH 注入(XPATH-Injection)
    WebGoat教程学习(六)--日志欺骗(Log Spoofing)
    WebGoat教程学习(五)--并发(Concurrency)
    WebGoat教程学习(四)--代码质量
    WebGoat教程学习(三)--Ajax安全
    WebGoat教程学习(二)--文件权限控制
    WebGoat教程学习(一)--环境配置
    Java排错随笔
  • 原文地址:https://www.cnblogs.com/net2012/p/2891378.html
Copyright © 2011-2022 走看看