switchoverswitchover是primary数据库和它的一个standby数据库之间角色的切换,通常是有计划的数据库转换,保证不会有数据丢失。failoverfailover发生在primary数据库失败之后,它的一个standby接替它成为primary数据库。failover通常发生primary数据库不可恢复的情况下,根据数据库保护模式的不一样failover可能会有数据丢失。
对于switchover操作来说,遵循以下的步骤
首先选择未应用的redo的standby,这个可以通过show database db_unique_name recvqentries看到。
对于物理和逻辑standby同时存在时,优先选择redo apply queue最小的物理standby,因为物理standby在转换之后所有的standby都能正常工作,而转换到逻辑standby之后同一组里面的物理standby将要重建。
对failover操作来说,遵循以下的步骤
为降低数据丢失的数量,首先要选择应用日志最多的standby。
对于物理和逻辑standby同时存在时,优先选择物理standby,因为物理standby在转换之后所有的standby都能正常工作,而转换到逻辑standby之后同一组里面的standby将要重建。另外一个如果逻辑standby使用dbms_logstdby.skip忽略了一部 分数据库话也会造成数据丢失。
第一个层次是在没有配置broker的环境中,在这种环境下,如果要进行数据库的角色却换的话通常需要3个步骤:
首先是检查data guard环境中的数据库是否满足转换的条件。
然后登陆到primary数据库运行sql转换角色,再重启primary数据库使其变成standby。
再登录到要转换的standby数据库上,运行sql转换角色,再重新启动standby以变成新的primary。
第二个层次是配置了broker但是没有配置fsf(fast-start failover)的环境中,在这里做switchover和failover都只需要一个简单的命令,剩下的重启primary和standby的操作就交给broker去做了。
第三个层次是配置了fsf的机器,这时候数据库的状态由fsf observer监控着,一旦primary数据库出现了问题需要failover操作,fsf会自动进行数据库的转换,根本就不需要人来参与了。
broker管理下的switchover的过程
检查primary和standby是否online,是否有错误,如果有错误则switchover失败。
如果primary是rac,则关掉rac中所有不参与switchover的instance。
将primary数据库转换成standby数据库,然后将目标standby数据库转换成新的primary数据库。
更新broker控制文件记录转换之后的数据库角色信息。
如果新的standby是物理standby的话将会重启之,然后开始redo log应用。rac环境中将会重启那些被关闭的instance。
如果是物理standby环境的话重启新的primary数据库然后开始rodo log的传送到其他的standby中。
最后broker会确认转换之后的新primary和standby都工作正常,redo log传送和应用都正常。对于那些没有参与switchover的standby将会保持不变。
下面是一个switchover的详细过程
dgmgrl> show configuration
configuration
name: fsf
enabled: yes
protection mode: maxavailability
fast-start failover: disabled
databases:
torcla - physical standby database
torclb - primary database
current status for "fsf":
success
dgmgrl> switchover to torcla
performing switchover now, please wait...
operation requires shutdown of instance "torclb" on database "torclb"
shutting down instance "torclb"...
ora-01109: database not open
database dismounted.
oracle instance shutdown.
operation requires shutdown of instance "torcla" on database "torcla"
shutting down instance "torcla"...
operation requires startup of instance "torclb" on database "torclb"
starting instance "torclb"...
oracle instance started.
database mounted.
operation requires startup of instance "torcla" on database "torcla"
starting instance "torcla"...
switchover succeeded, new primary is "torcla"
torcla - primary database
torclb - physical standby database
failover有两种类型:完全failover和立即failover。
完全failover进行完全failover操作的是很broker会竟可能的恢复数据,同时在failover完成之后会根据情况尽可能的将没有参与failover的standby变成新的primary的可用的standby。立即failover立即failover的操作开始之后broker不再去试图恢复更多的数据,另一个就是failover完成之后所有没有参与failover的standby都要重新启用。
调用这两种failover的命令如下
-- 完全failover
failover to standby_database_name;
-- 立即failover
failover to standby_database_name immediate;
检查primary是否可用,可用的话给出一条警告信息。
确认目标standby可用,不可用的话failover失败。rac环境中将关闭standby的其他不参与的instance。
等待目标standby完成还在队列中的redo信息之后关闭redo log apply或是sql apply。
将目标standby转换成新的primary。
将新的primary数据库打开为读写模式。
检查其他的standby是否能成为新primary的standby,如果可以的话则该standby的状态保证不变,否则则需要re-enable。
启动redo传送服务将redo传送给那些不需要re-enable的standby数据库。
如果是rac环境则重启那些之前关闭的instance。
立即停止redo log apply或是sql apply,不管是否还有可恢复的数据,这样可能会造成数据丢失。
将目标standby转换成新的primary并打开到读写模式,并启动redo传送服务。
一个完全failover的例子
dgmgrl> failover to torclb
performing failover now, please wait…
failover succeeded, new primary is “torclb”
dgmgrl> show configuration
name: fsf enabled: yes protection mode: maxperformance fast-start failover: disabled databases: torcla – physical standby database (disabled) torclb – primary database
current status for “fsf”:
从上面的状态我们可以看到此时的新standby是不可用的,处于disabled状态。
在角色转换之后我们可能还需要进行额外的操作来启用被禁用的数据库,操作已经data guard的类型不同需要启用数据库情况也不同。
转换操作 reinstate或recreate 有问题的primary数据库 重新启用没有参与failover的standby
switchover到物理standby
不需要其他操作
switchover到逻辑standby
所有物理standby需要recreate
完全failover到物理standby
如果启用了flashback而且retention足够的话可以reinstate,否则只能recreate
对于物理standby如果启用了flashback而且retention足够的话可以reinstate,否则只能recreate
对于逻辑standby必须recreate
完全failover逻辑standby
所有standby都会被disabled,都需要recreate
立即failover到物理standby或逻辑standby
必须要recreate
在broker中进行reinstate数据库操作只需要运行一个命令就行了,不过前提是配置了flashback以及足够的retention。
reinstate database db_unique_name;
基本步骤是:
重启数据库到mount状态
使用dgmgrl连接到primary数据库
运行reinstate database命令
下面对上一步failover之后的新standby做一次reinstate操作
dgmgrl> reinstate database torcla
reinstating database "torcla", please wait...
continuing to reinstate database "torcla" ...
reinstatemen to fdatabase "torcla" succeeded
protectionmode: maxperformance
可以看到reinstate之后数据库torcla已经可以正常使用了。
参考至:http://www.dbabeta.com/2009/learn-data-guard-broker_role-transition.html
如有错误,欢迎指正
作者:czmmiao 文章出处:http://czmmiao.iteye.com/blog/2124881