Oracle DataGuard主备切换(switchover)

Oracle DataGuard主备切换有两种方式,一种是手动,一种是使用dgmgr切换
一、手动切换
(一)先查看主备库的状态何日志是否正常
1、主库

SQL>set line 300 pages 300

select name,remote_archive,database_role,guard_status,db_unique_name from v$database;
SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME  FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

2、备库

SQL>set line 300 pages 300

select name,remote_archive,database_role,guard_status,db_unique_name from v$database;
SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME  FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

3、再查看是否可以进行切换
在主库
需要检查SWITCHOVER_STATUS参数,如果值为”SESSION ACTIVE”或者”TO STANDBY”, 则主数据库角色可以切换为备库角色。

SQL> set line 300 pages 300

SQL> SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;

4、进行主备切换
将其切换到备库,切换后,数据库会关闭

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

5、将主库启动到mount状态

SQL> SHUTDOWN ABORT #11.2.0.4以下低版本执行,高版本不需要执行

SQL> STARTUP MOUNT

6、将备库切换成主库并启动到open
查看备库状态
注意:需要检查SWITCH_STATUS参数,如果值为”SESSION ACTIVE”或”TO PRIMARY”,则备库可以切换为主库。

SQL> SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;

7、切换到主库

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

8、打开数据库
此时数据库为mount状态,需打开数据库

SQL> SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;
SQL> ALTER DATABASE OPEN ;

再次查看备份的SWITCHOVER_STATUS是否变为TO STANDBY

SQL> SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;

9、新的备库开启日志应用

SQL> ALTER DATABASE OPEN;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

10、验证是否切换成功
原主库现备库查看

SQL> set linesize 999

select name,open_mode,database_role,protection_mode,switchover_status from v$database;

原备库现主库查看

SQL> set linesize 999

select name,open_mode,database_role,protection_mode,switchover_status from v$database;

我们可以看到主备已经切换完成,整个过程也比较顺利。期间也出现了两个问题,现在总结一下。

1、切换过程中备库SWITCHOVER_STATUS状态为NOT ALLOWED。

解决方法:
先看告警日志

SQL> show parameter dump;
cd /u01/app/oracle/diag/rdbms/orcl11gdg/orcl11g/trace

在trace目录下查看alert_orcl11g.log日志是否有告警
一般是因为主备库的数据没完全同步

rman target /
RMAN> list incarnation;

需重置备库化身和主库保持一致
备库

SQL> shutdown immediate

SQL> startup mount

[oracle@standbynode ~]$rman target / 

RMAN> reset database to incarnation 3;

RMAN> list incarnation;

打开备库和备库开启日志应用

开启备库

SQL> alter database open;

备库开启日志实时应用

SQL> alter database recover managed standby database using current logfile disconnect from session;

查看进程

SQL> select pid,process, status, thread#,sequence#, block#, blocks from v$managed_standby;

2、切换过程中备库SWITCHOVER_STATUS状态为FAILED DESTINATION。
解决方法:
先看告警日志

SQL> show parameter dump;
cd /u01/app/oracle/diag/rdbms/orcl11gdg/orcl11g/trace

在trace目录下查看alert_orcl11g.log日志是否有告警
一般是监听有问题或者主库状态异常。总之要学会看trace日志。

二、DG_BROKER
需要搭建DG_BROKER,后面再分享搭建的。其实最关键是将主备库的dg_broker_start的VALUE设置为true。然后进行监听之类的配置。

SQL>alter system set dg_broker_start=true scope=both;