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
有些时候可能需要使用全备主数据库来恢复备用数据库。