Oracle12c_DataGuard故障转移的测试


1、客户端负载平衡/Connect-time故障转移

对于如下的tns配置:

orarac =
  (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARAC)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARACDG)(PORT = 1521))
       (LOAD_BALANCE = YES)
     )
     (CONNECT_DATA =
       (SERVICE_NAME = ORARAC)
     )
  )
 
ADDRESS_LIST有2个地址条目,如果LOAD_BALANCE=YES,连接将随机选择地址,如果连接失败,Oracle Net将返回

ADDRESS_LIST并随机选择一个新地址。在连接尝试成功前,这种情况会一直持续下去。

如果LOAD_BALANCE=NO,或者不包含在Oracle Net别名中,连接将始终从ADDRESS_LIST中选取第一个地址。

如果与初始地址的连接失败,Oracle Net将返回ADDRESS_LIST并选择下一个地址。客户端负载平衡关闭后,将

按顺序尝试每个地址。

对于如下的tns配置:

orarac =
  (DESCRIPTION =
     (ADDRESS_LIST =
       (LOAD_BALANCE = YES
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARAC)(PORT = 1521)))
     (ADDRESS_LIST =
       (LOAD_BALANCE = YES
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARACDG)(PORT = 1521)))
     (CONNECT_DATA =
       (SERVICE_NAME = ORARAC)
     )
  )
 
在这个配置中,尝试一个连接时,从第一个ADDRESS_LIST中获得随机地址,用于此次连接尝试。

如果连接尝试失败,从顶端ADDRESS_LIST中随机选择另一个地址。如果第一个ADDRESS_LIST中

的所有地址在连接时都失败了,就移到第二个ADDRESS_LIST并从列表中随机获取地址。

可以设置sqlnet.ora中设置下面的参数来定义连接超时:

SQLNET.OUTBOUND_CONNECT_TIMEOUT = 3

该参数设置为连接尝试中Oracle Net等待一个主机相应的秒数。


2、透明应用程序故障转移TAF

透明应用程序故障转移(TAF)用来处理已经连接到数据库的会话。

配置TAF,需要指定一下特性:

TYPE 故障转移的类型,可能值如下:

    SESSION 指定发生故障转移时,TAF应创建会话,不执行其他任何操作。
    SELECT  指定执行故障转移时,除了创建会话,TAF也应该重新启动故障转移期间运行的任何select语句
            当select语句执行时,Oracle Net将返回故障转移前没有返回给用户的行。
    NONE    不执行TAF故障转移。
    
METHOD 确定何时创建会话,可能的值如下:

    BASIC       在故障转移期间创建会话。
    PRECONNECT  与数据库的初始连接建立后,采用由BACKUP特性指定的Oracle Net别名创建故障转移会话。
    
RETRIES 指定Oracle Net返回ADDRESS_LIST并尝试连接到幸存实例的次数。

DELAY   指定每次重试之间等待的秒数。

一个TAF设置可能如下:

orarac =
  (DESCRIPTION =
     (ADDRESS_LIST =
       (LOAD_BALANCE = YES
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARAC)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = ORARACDG)(PORT = 1521)))
     (CONNECT_DATA =
       (SERVICE_NAME = ORARAC)
       (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=20)(DELAY=15)
     )
  )
 
该配置指示TAF在故障转移期间创建会话,并重新执行在故障转移期间运行的任何select语句。此外,

如果第一次尝试创建会话失败,TAF应在总共20次尝试中,在再次尝试前等待15秒。


3、服务器端TAF

参考另一篇文章:

http://blog.csdn.net/wang_san_shi/article/details/41748395

查询故障转移相关信息:

SQL> SELECT SERVICE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER FROM V$SESSION;


4、DataGuard环境中TAF的测试

主库为RAC+ASM,备库为单实例+文件系统

主库所有2个节点关机,模拟主库故障,然后手动切换备库到主库,并验证客户端TAF。

另外,故障转移到物理备库的过程如下:

一个到物理备用数据库的故障转移,仅在目标备用数据库上执行,使用的命令与用于切换的命令相同。

与切换一样,除了RAC备用中正在运行MRP的实例外,必须关闭其他所有实例。这种情况下,SHUTDOWN IMMEDIATE或者ABORT的重要性较低,

因为备用数据库没有生成重做数据,因此无需采取真正的崩溃恢复。

第一步:

在备用数据库上停用MRP:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

第二步:

应用所有的可用的重做数据并结束:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

第三步:

角色切换备用数据库到主数据库:

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
SQL> ALTER DATABASE OPEN;

测试开始:

首先,配置客户端TAF:

主库service_name为orarac
备库service_name为oraracdg

首先在主库上创建service,名称和备库一样为oraracdg

[oracle@rac1 ~]$ srvctl add service -d orarac -s oraracdg -r orarac1

[oracle@rac1 ~]$ srvctl start service -d orarac -s oraracdg

[oracle@rac1 ~]$ srvctl status service -d orarac -s oraracdg
Service oraracdg is running on instance(s) orarac1

然后在客户端配置tnsnames:

ORARACTAF =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.26.181.10)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.26.181.101)(PORT = 1521))
    (LOAD_BALANCE = YES)
  (CONNECT_DATA =
    (SERVICE_NAME = ORARACDG)
    (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=20)(DELAY=15))
  )
  )

这里连接将随机连到在主库(SCAN:10)和备库(101)。

创建一个到主库的连接:

C:\Users\Administrator>SQLPLUS SYSTEM/oracle@ORARACTAF

SQL*Plus: Release 11.2.0.1.0 Production on Tue Mar 31 14:23:44 2015

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management,
OLAP,Advanced Analytics and Real Application Testing options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orarac1

此时连接到RAC主库的1号节点。

关闭主库2个节点的实例:

[oracle@rac1 ~]$srvctl stop instance -d orarac -i orarac1,orarac2

[oracle@rac1 ~]$ srvctl status instance -d orarac -i orarac1,orarac2
Instance orarac1 is not running on node rac1
Instance orarac2 is not running on node rac2

然后再次查看我们客户端连接到的实例:

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orarac

此时已经连接到备用数据库了(备用数据库实例名为orarac)。

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ ONLY WITH APPLY

但是此时备库为physical standby,为只读数据库,我们需要手工角色切换:

SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database recover managed standby database finish;

Database altered.

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

Database altered.

SQL> alter database open;

Database altered.

切换完毕,由于备库关闭了一次,此时客户端需要重新连接:

客户端再次连接并查询open_mode:

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE

OK,备库已经取代主库发挥作用了。

到此故障转移测试完毕,由于角色切换时,备库由mount打开过一次,因此客户端会话需要重新连接,但是如果客户端运行只读查询,则不需要重建会话。


5、将原主库恢复(ORARAC1实例)

将主库启动到mount状态

SQL> startup mount
ORACLE instance started.

Total System Global Area 1.0055E+10 bytes
Fixed Size                  2691952 bytes
Variable Size            1845496976 bytes
Database Buffers         8187281408 bytes
Redo Buffers               19312640 bytes
Database mounted.

SQL> alter database convert to physical standby;

Database altered.

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.

Total System Global Area 1.0055E+10 bytes
Fixed Size                  2691952 bytes
Variable Size            1845496976 bytes
Database Buffers         8187281408 bytes
Redo Buffers               19312640 bytes
Database mounted.

SQL> alter database recover managed standby database using current logfile disconnect;

Database altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-10456: cannot open standby database; media recovery session may be in
progress


SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database open;

Database altered.

此时,虽然备库已经打开,但是发现主库的变更不会应用到备库,查看备库:

SQL>  select process,client_process,thread#,sequence#,status from v$managed_standby;

PROCESS   CLIENT_P    THREAD#  SEQUENCE# STATUS
--------- -------- ---------- ---------- ------------
ARCH      ARCH              0          0 CONNECTED
ARCH      ARCH              0          0 CONNECTED
ARCH      ARCH              1          4 CLOSING
ARCH      ARCH              0          0 CONNECTED
RFS       LGWR              1          5 IDLE
RFS       UNKNOWN           0          0 IDLE
RFS       UNKNOWN           0          0 IDLE
RFS       ARCH              0          0 IDLE
MRP0      N/A               1        160 WAIT_FOR_LOG

9 rows selected.

MRP0还在等待160#日志。

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED

备库此时还需要恢复。

这是因为原主库启动时,没有闪回到切换时刻SCN,因此产生了gap导致。

备库scn:

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    5267423
    
主库scn:

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    5274230

主库连接rman执行增量备份:


剩下的就需要rman恢复备库了:

可参考文章:http://www.xifenfei.com/1176.html

有些时候可能需要使用全备主数据库来恢复备用数据库。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值