这里主库是orcl,从库是orclstd
一 将主库降为从库
1.1查看主库SWITCHOVER_STATUS的状态
#确认主库是否可以做switchover
#不能切换的情况
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
------------------
SESSIONS ACTIVE
在这种情况下,说明还有活动session,需要先kill掉,只留下当前sys进程
select sid,SERIAL# from v$session;
SID SERIAL#
---------- ----------
12 14
17 3
查出当前连接session
SQL> select distinct ss.sid from v$mystat ss;
杀掉其他session ,示例
SQL> alter system kill session '12,14';
#可以切换的情况:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY
1.2 将主库切换至备用模式
SQL> alter database commit to switchover to physical standby with session shutdown;
假如报错:
ORA-16416: 没有可行的 Physical Standby切换目标
则检查下主从的log_archive_dest_2值是否为空,如果为空,需要设置
示例:
show parameter log_archive_dest_2;
alter system set log_archive_dest_2='service=orclstd valid_for=(online_logfiles,primary_role) db_unique_name=orclstd' scope=both ;
1.3关闭主数据库,将其启动到mount状态
SQL> shutdown abort;
SQL> startup mount;
二 将从库提升为主库
2.1 查看备库SWITCHOVER_STATUS状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
注:如果是TO PRIMARY表示可以正常切换,不过还会遇到NOT ALLOWED和PENDING或者LATENT,实际操作下来如果备库的switchover_status为not allowed或者to primary都可以正常切换。假如是RECOVERY NEEDED,则执行下alter database recover managed standby database using current logfile disconnect from session;否则后面切换至主库的时候会报错:
ORA-16139: 需要介质恢复
2.2 将备库切为主库
SQL> alter database commit to switchover to primary with session shutdown;
2.3 打开新的主数据库
SQL> ALTER DATABASE OPEN;
#查看状态,确保open_mode是READ WRITE,DATABASE_ROLE是primary
select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
READ WRITE PRIMARY
三 在原主库/新的备库上启动 REDO apply
SQL> alter database recover managed standby database using current logfile disconnect from session;
假如报错:
ORA-01153: 激活了不兼容的介质恢复,则先启动数据库到open状态,再执行该命令,试下。
#启动数据库
alter database open;
#检查状态,确保open_mode值是READ ONLY WITH APPLY,database_role是PHYSICAL STANDBY
select open_mode,database_role from v$database;
假如open_mode值是read only,不是read only with apply,则再应用一次redo试下:
SQL> alter database recover managed standby database using current logfile disconnect from session;
select open_mode,database_role from v$database;
四 检查主从的log_archive_dest_2是否为空
#检查主从的log_archive_dest_2值是否为空,如果为空,需要设置
示例:
show parameter log_archive_dest_2;
alter system set log_archive_dest_2='service=orclstd valid_for=(online_logfiles,primary_role) db_unique_name=orclstd' scope=both ;
五 验证数据同步
在主库插入一条数据,看能否同步到从库上。
如果不能,则做以下检查。
5.1 检查主从log_archive_dest_state_n,log_archive_dest_2状态
需要确保log_archive_dest_state_1/2的状态是ENABLE。我遇到过一次状态是RESET,导致主库的归档日志无法传输到备库上。
show parameter log_archive_dest_state_1;
show parameter log_archive_dest_state_2;
#检查主从的log_archive_dest_2值是否为空,如果为空,需要设置
示例:
show parameter log_archive_dest_2;
alter system set log_archive_dest_2='service=orclstd valid_for=(online_logfiles,primary_role) db_unique_name=orclstd' scope=both ;
5.2 检查从库standby log的状态是否正常
SQL> select group#,sequence#,first_change#,next_change#,status,used from v$standby_log;
如果都为UNASSIGNED,则说明备库异常,是active状态方为正常。
5.3 检查告警日志有何报错
假如报FAL[client]: Error fetching gap sequence, no FAL server specifie,则需要配置fal_server
5.4 检查主库中归档位置配置是否有误
select error from v$archive_dest where target='STANDBY';
5.5 检查DG状态
SELECT MESSAGE FROM V$DATAGUARD_STATUS;
5.6 检查主库的switchover_status
SQL> select switchover_status from v$database ;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
如果结果为FAILED DESTINATION,则不正常,需要检查下主备的告警日志,排查下原因。
5.7 检查主库归档日志能否实时同步到备库
5.7.1 查看备库现有归档日志
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME
---------- ------------ ------------
6 08-NOV-19 08-NOV-19
7 08-NOV-19 08-NOV-19
8 08-NOV-19 08-NOV-19
8 08-NOV-19 08-NOV-19
5.7.2 在主库上切换日志
SQL> ALTER SYSTEM SWITCH LOGFILE;
5.7.3 检查备库是否能接收到新产生的归档日志并应用
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# APPLIED
---------- ------------------
6 YES
7 YES
8 YES
8 YES
最近收到的日志文件的APPLIED列的值将是IN-MEMORY,如果该日志文件已应用,则为YES。