
数据库转换的基本概念
转换的类型
switchover
switchover是primary数据库和它的一个standby数据库之间角色的切换,通常是有计划的数据库转换,保证不会有数据丢失。
Failover
failover发生在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忽略了一部分数据库话也会造成数据丢失。
Data Guard转换的三个层次
第一个层次是在没有配置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和failover
switchover
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将会保持不变。
将primary switchover standby,standby switchover primary
---查看数据库状态
Primary:

Standby:

DGMGRL> switchover to stoms
立即执行切换, 请稍候...
新的主数据库 "stoms" 正在打开...
操作要求关闭实例 "oms" (在数据库 "oms" 上)
正在关闭实例 "oms"...
ORA-01031: insufficient privileges
警告: 您不再连接到 ORACLE。
请执行以下步骤以完成切换:
关闭实例 "oms" (属于数据库 "oms")
启动并装载实例 "oms" (属于数据库 "oms")
DGMGRL>
----查看数据库状态
primary:

standby:

主备已经正常切换。
---查看日志应用情况
Primary:

Standby:

DGMGRL> show configuration
Configuration - dg_oms
Protection Mode: MaxPerformance
Databases:
stoms - Primary database
oms - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL>
注意:切换后从库最好从新启动应用,否则将提示以下错误:
DGMGRL> show configuration
Error:
Configuration - dg_oms
Protection Mode: MaxPerformance
Databases:
oms - Primary database
stoms - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
ORA-16570: database needs restart
ORA-06512: at "SYS.X$DBMS_DRS", line 228
ORA-06512: at line 1
DGM-17017: unable to determine configuration status
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;
broker执行完全failover的过程
检查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。
broker执行立即failover的过程
确认目标standby可用,不可用的话failover失败。RAC环境中将关闭standby的其他不参与的instance。
立即停止redo log apply或是sql apply,不管是否还有可恢复的数据,这样可能会造成数据丢失。
将目标standby转换成新的primary并打开到读写模式,并启动redo传送服务。
-- 完全failover
DGMGRL> failover to stoms; ----/备库上执行///-------
Performing failover NOW, please wait...
Failover succeeded, new primary is "stoms"
DGMGRL> show configuration
Configuration - dg_oms
Protection Mode: MaxPerformance
Databases:
stoms - Primary database
oms - Physical standby database (disabled)
ORA-16661: the standby database needs to be reinstated
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
从上面的状态可以看到此时的新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 |
完全failover逻辑standby | 如果启用了flashback而且retention足够的话可以reinstate,否则只能recreate | 所有standby都会被disabled,都需要recreate |
立即failover到物理standby或逻辑standby | 必须要recreate | 所有standby都会被disabled,都需要recreate |
Reinstate操作
在broker中进行reinstate数据库操作只需要运行一个命令就行了,不过前提是配置了flashback以及足够的retention。
REINSTATE DATABASE db_unique_name;
基本步骤是:
重启数据库到mount状态
使用dgmgrl连接到primary数据库
运行REINSTATE DATABASE命令





