数据切换时dataguard的价值所在,在升级的时候,在主数据库出现故障暂时无法恢复的时候,都需要进行主备数据库切换,减少系统停机时间。最高可用性架构中,DataGuard也是非常重要的组成部分,它能在rac的基础上进一步提高Oracle数据库的可用性。
DataGuard 切换又分为两种:switchover(正常切换)和failover(异常切换),在升级,服务器运维等计划停机的时候常用到switchover切换,在一些非计划停机的时候常用到failover切换,switchover的切换不会导致数据的丢失,根据不同的保护模式,日志传输,应用情况,failover切换可能导致数据的丢失。
一.switchover切换
如果standby数据库是一个rac数据库,只保留一个节点实例运行,关闭其他所有节点实例。
第1步、主库停止监听
[oracle@node2 /]$ lsnrclt stop
理论上是不需要停止主库监听的,但是实际上如果切换时数据库繁忙,还有大量会话连接操作数据库,
在执行切换操作的时候需要等待oracle执行session shutdown,有时会很慢,这里建议直接停止监听,
还可以通过查 ps -ef | grep "LOCAL=NO",查看进行, LOCAL=NO是客户端连接进程,
[oracle@node2 /]$ ps -ef | grep "LOCAL=NO"
oracle 12896 1 0 17:26 ? 00:00:00 oraclenode2 (LOCAL=NO)
oracle 12972 1 0 17:29 ? 00:00:00 oraclenode2 (LOCAL=NO)
oracle 12976 1 0 17:30 ? 00:00:00 oraclenode2 (LOCAL=NO)
oracle 12982 12937 0 17:31 pts/4 00:00:00 grep LOCAL=NO
并kill -9 杀掉这些没有释放的连接,再执行下面的切换
第2步、主库执行切换
主库状态角色确认
SQL>select switchover_status from v$database;
查询结果分两种情况:
第一种情况
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
如果查询结果是SESSIONS ACTIVE: 执行下面的:
SQL> alter database commit to switchover to physical standbywith session shutdown;
第二种情况
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
如果查询结果是:TO STANDBY 执行下面的:
SQL> alter database commit to switchover to physical standby;
显示to standby 表示满足转换条件
如果显示session active表示还有活动会话,关闭活动会话再检查
如果结果为session active,在切换的时候可以指定with session shutdown子句强制关闭活动会话。
第3步、关闭主库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
第4步、主库启动到mount状态
SQL> startup mount;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 839282688 bytes
Fixed Size 2257880 bytes
Variable Size 499125288 bytes
Database Buffers 335544320 bytes
Redo Buffers 2355200 bytes
Database mounted.
第5步、 主库确定切换后的状态
SQL> select open_mode,database_role,switchover_status from v$database;
OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
---------------------------------------- -----------------------------------
MOUNTED PHYSICAL STANDBY TO PRIMARY
数据库角色变成了PHYSICAL STANDBY(物理备库)
完成了主库的角色转换;
第6步、 主库启动监听
[oracle@node2 /]$ lsnrctl start
switchover 切换备库操作
备库执行切换为主库,以下操作在备库执行
第1步、备库状态角色确认
SQL> select switchover_status from v$database;
第一种情况
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
如果状态为TO PRIMARY 则执行下面的语句:
SQL> alter database commit to switchover to primary;
第二种情况
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
---------------------------------
SESSIONS ACTIVE
如果状态是 SESSIONS ACTIVE 则 执行下面的语句:
SQL> alter database commit to switchover to primary with session shutdown;
如果显示to primary 表示能够将该standby数据库转换为主数据库
第2步、备库打开
SQL> alter database open;
Database altered.
如果之前以只读模式打开过,必须重新启动数据库实例。
第3步、备库状态角色确认
SQL> select open_mode,database_role,switchover_status from v$database;
OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
---------------------------------------- ------------------------
READ WRITE PRIMARY TO STANDBY
第4步、原主库启动同步
在原主库上执行:
SQL> alter database open read only;
Database altered.
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
switchover 切换完成
注意:完成后重启其他standby数据库到日志应用模式
如果standby数据库是rac数据库,那么只有一个实例能够运行MRP进程,其他实例只能运行RFS进程接收日志。