Fast-StartFailover工作过程及实例
在启用了fast-start failover和observer之后,broker会来监控primary和standby数据库的状态,一旦primary数据库出现故障,observer会根据一定的程序来执行自动的failover操作。
1.当发生下列情形是observer会尝试启动failover操作
Ø observer和primary数据库之间连接出现故障时
Ø 当primary数据库故障或者是RAC环境中所有instance都故障时
Ø 执行SHUTDOWN ABORT之后,特别注意正常的SHUTDOWN操作(NORMAL,IMMEDIATE,TRANSACTIONAL)不会引发 failover操作
Ø 数据库文件OFFLINE
除了最后一个数据库文件OFFLINE的情形,其他的情况下observer都会尝试在FastStartFailoverThreshold制定的时间之内重新连接数据库,如果还是无法连接之后才会执行自动failover操作。
2.在FastStartFailoverThreshold指定的时间内重新连接数据库,在RAC环境中会尝试连接其他的instance。
3.尝试时间结束后,observer将确定目标standby可用。下面的这些情形会导致failover失败
Ø fast-start failover没有启用
Ø observer无法连接到standby数据库
Ø standby与observer中记录的状态不一致
Ø observer在primary fail的时候正好没有运行,再次启动之后只能找到一个standby
Ø 目标standby没有和primary完成同步
Ø 目标standby是逻辑standby时,在V$DATABASE中显示LOADING DICTIONARY时
Ø 目标standby还能和primary正常通讯时
Ø 在V$DATABASE的列FS_FAILOVER_STATUS中显示了其他无法进行failover操作时
Ø 有手工failover正在进行时
4.执行failover操作,使目标standby变成新的primary。
5.reinstate之前失败的primary
FSFO实例:
--查看当前状态
DGMGRL> show configuration
配置 - htdb1
保护模式: MaxAvailability
数据库:
htdb1 - 主数据库
htdb2 - (*) 物理备用数据库
htdb3 - 物理备用数据库
快速启动故障转移: ENABLED
配置状态:
SUCCESS
--然后登录到主库htdb1上,执行一个SHUTDOWN ABORT命令
SQL> shutdown abort
ORACLE 例程已经关闭。
--然后在前面htdb2启动observer的会话里面我们可以看到自动failover信息了
DGMGRL> start observer
观察程序已启动 --在前面开启的会话里会一直停在这里
……
15:39:40.14 2011年9月30日 星期五
正在为数据库 "htdb2" 启动快速启动故障转移...
立即执行故障转移, 请稍候...
故障转移成功, 新的主数据库为 "htdb2"
15:40:18.15 2011年9月30日 星期五
……
--再看下状态,主库变成了htdb2,htdb1是禁用状态
DGMGRL> show configuration verbose
配置 - htdb1
保护模式: MaxAvailability
数据库:
htdb2 - 主数据库
警告: ORA-16817:快速启动故障转移配置不同步
htdb1 - (*) 物理备用数据库 (禁用)
ORA-16661: 需要恢复备用数据库
htdb3 - 物理备用数据库
(*) 快速启动故障转移目标
属性:
FastStartFailoverThreshold = '30'
OperationTimeout = '30'
FastStartFailoverLagLimit = '30'
CommunicationTimeout = '180'
FastStartFailoverAutoReinstate = 'TRUE'
FastStartFailoverPmyShutdown = 'TRUE'
BystandersFollowRoleChange = 'ALL'
快速启动故障转移: ENABLED
阈值: 30 秒
目标: htdb1
观察程序: hotel02
滞后限制: 30 秒 (未使用)
关闭主数据库: TRUE
自动恢复: TRUE
配置状态:
WARNING
--启动htdb1到mount状态,
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 2438529024 bytes
FixedSize 2228920 bytes
VariableSize 1828719944 bytes
DatabaseBuffers 587202560 bytes
RedoBuffers 20377600 bytes
数据库装载完毕。
--此时再观察前面htdb2启动observer的会话的信息
DGMGRL> start observer
观察程序已启动
15:39:40.14 2011年9月30日 星期五
正在为数据库 "htdb2" 启动快速启动故障转移...
立即执行故障转移, 请稍候...
故障转移成功, 新的主数据库为 "htdb2"
15:40:18.15 2011年9月30日 星期五
--下面是mount htdb1时observer会话的信息
15:54:24.50 2011年9月30日 星期五
正在为数据库 "htdb1" 启动恢复过程...
正在恢复数据库 "htdb1", 请稍候...
操作要求关闭实例 "htdb1" (在数据库 "htdb1" 上)
正在关闭实例 "htdb1"...
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
操作要求启动实例 "htdb1" (在数据库 "htdb1" 上)
正在启动实例 "htdb1"...
无法连接到数据库
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
失败。
警告: 您不再连接到 ORACLE。
请完成以下步骤并重新发出 REINSTATE 命令:
启动并装载实例 "htdb1"(属于数据库"htdb1")
15:55:04.92 2011年9月30日 星期五
--再次启动htdb1到mount状态
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 2438529024 bytes
FixedSize 2228920 bytes
VariableSize 1828719944 bytes
DatabaseBuffers 587202560 bytes
RedoBuffers 20377600 bytes
数据库装载完毕。
--执行reinstate操作(在htdb2上)
DGMGRL> reinstate database htdb1
正在恢复数据库 "htdb1", 请稍候...
已成功恢复数据库 "htdb1"
--查看状态已经成功failover
DGMGRL> show configuration verbose
配置 - htdb1
保护模式: MaxAvailability
数据库:
htdb2 - 主数据库
htdb1 - (*) 物理备用数据库
htdb3 - 物理备用数据库
(*) 快速启动故障转移目标
属性:
FastStartFailoverThreshold = '30'
OperationTimeout = '30'
FastStartFailoverLagLimit = '30'
CommunicationTimeout = '180'
FastStartFailoverAutoReinstate = 'TRUE'
FastStartFailoverPmyShutdown = 'TRUE'
BystandersFollowRoleChange = 'ALL'
快速启动故障转移: ENABLED
阈值: 30 秒
目标: htdb1
观察程序: hotel02
滞后限制: 30 秒 (未使用)
关闭主数据库: TRUE
自动恢复: TRUE
配置状态:
SUCCESS
--DG管理页面状态
查看Fast-StartFailover状态
通过SHOW CONFIGURATION VERBOSE命令可以查看Fast-Start Failover的基本运行状态
DGMGRL> show configuration verbose
配置 - htdb1
保护模式: MaxAvailability
数据库:
htdb1 - 主数据库
htdb2 - (*) 物理备用数据库
htdb3 - 物理备用数据库
(*) 快速启动故障转移目标
属性:
FastStartFailoverThreshold = '30'
OperationTimeout = '30'
FastStartFailoverLagLimit = '30'
CommunicationTimeout = '180'
FastStartFailoverAutoReinstate = 'TRUE'
FastStartFailoverPmyShutdown = 'TRUE'
BystandersFollowRoleChange = 'ALL'
快速启动故障转移: ENABLED
阈值: 30 秒
目标: htdb2
观察程序: hotel02
滞后限制: 30 秒 (未使用)
关闭主数据库: TRUE
自动恢复: TRUE
配置状态:
SUCCESS
要查看Fast-Start Failover更多的信息就要查看V$DATABASE视图中的相关的列了。
FS_FAILOVER_STATUS
这个列显示了Fast-Start Failover的状态,通过查看这个列我们可以知道数据库时处于什么状态之中,详细的状态信息在这里。
FS_FAILOVER_CURRENT_TARGET
当前数据库的failover的目标数据库
FS_FAILOVER_THRESHOLD
执行自动failover的时间超时值
FS_FAILOVER_observer_PRESENT
是否启动了observer,通过查看这个列我们可以知道是否有observer在监控着这个数据库
FS_FAILOVER_observer_HOST
监控此数据库的observer所在的位置
禁用Fast-StartFailover的命令为:
DISABLEFAST_START FAILOVER [FORCE]
加上FORCE之后将会强行在执行DISABLE命令的数据库以及这个数据库可连通的其他数据库上面上禁用Fast-StartFailover,而其他无法连接上的数据库将保持原来的状态;不加FROCE时如果有那个数据库暂时无法连接的话那么DISABLE操作将会失败。所以在当primary和standby数据库的网络连接良好的情况下要使用不带FORCE的命令。
通常需要使用FORCE的情形
Ø 当因为网络问题造成primary无法和observer及那些已完成同步的standby通讯时,primary将会停止工作,如果primary的恢复时间可期,且想要primary继续工作的话就需要使用FORCE选项暂时在primary上禁用fast-startfailover,不过之前一定要检查看数据库有没有自动failover。
Ø 当primary和standby没有完成同步的时候想要手工的执行failover的命令,在fast-startfailover启用的时候是无法执行的,这时候也需要使用FORCE选项强行禁用fast-startfailover。
Ø 在fast-startfailover失败之后还想将数据库failover到其他可用的standby上时也需要先使用FORCE强制禁用fast-startfailover然后在手工进行failover操作。
Ø 如果确定有问题的primary可以很快的恢复,此时不想让fast-startfailover自动failover,也可以使用FORCE选项强行禁用fast-startfailover。
启用observer的操作很简单,使用DGMGRL连接到数据库,然后执行STARTOBSERVER命令就行了。
要启动observer的话必须使用SYS连接到DGMGRL,同一时间只能启动一个observer,如果尝试启动多个observer将会收到这样的消息
ORA-16647:could not start more than one observer
要停止一个observer的话只需要用DGMGRL连接到数据库,然后执行STOPOBSERVER命令就行了。
要确定一个数据库是否在observer的监视中必须要去查看V$DATABASE视图中的FS_FAILOVER_OBSERVER_PRESENT和FS_FAILOVER_OBSERVER_HOST。只有当FS_FAILOVER_OBSERVER_PRESENT为YES的时候才说明这个数据库时处于observer的监控之中。
同时数据库是否有observer监视这个信息我们也可以从DGMGRL中查看到
DGMGRL>show database htdb2 statusreport
STATUSREPORT
INSTANCE_NAME SEVERITY ERROR_TEXT
* ERROR ORA-16820: 快速启动故障转移观察程序不再对此数据库进行观察
在启动observer的时候,observer会自动的在当前目录中生成一个默认名字为fsfo.dat的二进制文件,这个文件里面保存了fast-startfailover的配置信息,同时也包含了到primary和standby的连接方式。也可以在启动observer的时候使用FILE参数指定配置文件的位置,命令如下
STARTOBSERVER [FILE=<observerconfigurationfile>];
--内容如下
[oracle@hotel01~]$ ls -l fsfo.dat
-rw-------1 oracle oinstall 322 09-30 15:07 fsfo.dat
[oracle@hotel01~]$ cat fsfo.dat
vE懑_贪#htdb1htdb2t(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hotel01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=htdb1)(SERVER=DEDICATED)))t(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hotel02)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=htdb2)(SERVER=DEDICATED)))vE懑_贪