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;
[oracle@standbynode trace]$cd /u01/app/oracle/diag/rdbms/orcl11gdg/orcl11g/trace
在trace目录下查看alert_orcl11g.log日志是否有告警
一般是因为主备库的数据没完全同步
[oracle@standbynode ~]$ 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;
[oracle@standbynode trace]$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;