data guard已经是现今标准的主流容灾方案,由于日志传递对于网络适应程度强,且可以采用同步实时的传递方式和异步延迟的传递方式
实验环境:oel+oracle11.2.0.3+physical standby
众所周知,data guard已经是现今标准的主流容灾方案,由于日志传递对于网络适应程度强,且可以采用同步实时的传递方式和异步延迟的传递方式,甚至可以成为远程的异地容灾方案。不管用于何种用途,dg都免不了要进行角色转换,即将standby 数据库切换为primary数据库,角色转换分为:switchover和failover两种;两种区别从三个角度来对比:
(1)、使用场合不同:switchover 用于有准备的、计划之中的切换,通常是系统升级、数据迁移等常态任务;failover用于意料之外的突发情况,比如异常掉电、自然灾难等等。
(2)、数据丢失程度不同:switchover不会丢失数据,failover通常意味着有部分数据丢失。
(3)、善后处理的不同:switchover之后dataguard环境不会被破坏,任然有primary、standby两种角色的系统存在。但是failover之后,dataguard环境就会被破坏,必须需要重建。
一、switchover因为switchover这种转化是有dba主动、人为触发的,所以switchover的步骤都是标准化的。switchover流程是从primary database开始,终止于standby database。
switchover步骤如下:
1 在主库端检查数据库可切换状态
sql> select switchover_status from v$database;
switchover_status:to standby 表示可以正常切换.
如果switchover_status 的值为sessions active,表示当前有会话处于active状态
2 开始主库正常切换
如果switchover_status 的值为to standby:
sql>alter database commit to switchover to physical standby;
database altered.
如果switchover_status 的值为sessions active:
sql>alter database commit to switchover to physical standby with session shutdown;
database altered.
当 primary database 收到这条命令后,会发生这几件事情:
(1)、这条命令执行完毕之后,主库上就不会产生redo,所有dml相关的cursor都会失效,用户也将不能再执行事务。
(2)、每个日志线程的当前日志被归档,并在接下来的每个thread新的日志头记录一个特殊的切换标准eor(end of redo),然后再次归档,其结果就是把eor发送给所有standby database,primary database 转换成了standby。
(3)、在这个旧的primary database 上,mrp(managed recovery process)进程会自动启动,并应用最后一个归档日志,,也就是eor这个日志,一旦这个eor应用完成,数据库就会dismounted,并必须启动成一个standby database。
3 重启先前的主库
sql> shutdown immediate;(11g有时候要shutdown abort才行,不然报错)
sql> startup mount;
4 这时候到备份库 在备库验证可切换状态
sql>select switchover_status from v$database;
switchover_status
-----------------
to_primary
1 row selected
5 将目标备库转换为主库
如果switchover_status 的值为to standby 则:
sql> alter database commit to switchover to primary;
database altered.
如果switchover_status 的值为sessions active 则:
sql>alter database commit to switchover to primary with session shutdown;
database altered.
执行完这个命令后,standby database 的控制文件也从standby 控制文件转换成标准的控制文件了,接下来数据库就可以open database,打开成业务数据库了。
6 重启目标备库
sql> shutdown immediate;
sql> startup;
7 先前主库启动日志传送进程
sql> alter database recover managed standby database disconnect;
8 检查主备库角色状态:
select switchover_status,database_role from v$database;
至此,一个完整的switchover 完成角色互换,可以正常使用了。