Fast-Start Failover工作过程及实例

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

禁用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管理

启用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懑_贪

 

 

你可能感兴趣的:(over,dataguard,Fast,faile,DG_BROKER)