oracle dg主备切换
主备切换一般两种原因,一是做主、备库维护,需要用户手动去切换,另一种主库发生了故障,需要强行去切换。
主备状态介绍
v$database Switchover_Status 值的含义
NOT ALLOWED 当前的数据库不是带有备用数据库的主数据库
PREPARING DICTIONARY 该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备
PREPARING SWITCHOVER 接受用于切换的重做数据时,逻辑备用配置会使用它
RECOVERY NEEDED 备用数据库还没有接收到切换请求
SESSIONS ACTIVE 在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话
RESOLVABLE GAP 备库未开启数据同步,导致主备数据有差异
SWITCHOVER PENDING 适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库
SWITCHOVER LATENT 切换没有完成并返回到主数据库
TO LOGICAL STANDBY 主数据库已经收到了来自逻辑备用数据库的完整的字典
TO PRIMARY 该备用数据库可以转换为主数据库
TO STANDBY 该主数据库可以转换为备用数据库
一、主动切换(switch)
1. 确定主备角色状态
# 查询主库状态为TO STANDBY或SESSIONS ACTIVE
SQL> select database_role, switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
---------------- --------------------
PRIMARY TO STANDBY
# DATABASE_ROLE PRIMARY 为主库,PHYSICAL STANDBY 备库
#switchover_status 为TO STANDBY
# 查询从库状态为NOT ALLOWED
SQL> select database_role, switchover_status from v$database;
DATABASE_ROLE SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY NOT ALLOWED
2. 主库切换
# 切换主库角色为备库
alter database commit to switchover to physical standby;
#(等待会话断开,也可以主动去kill掉这些会话)或者执行
alter database commit to switchover to physical standby with session shutdown;
shutdown immediate;
# 重启数据库到open模式
startup nomount;
alter database mount standby database;
alter database open read only;
# 开启redo同步
alter database recover managed standby database using current logfile disconnect from session;
附图:
3. 查看备库状态(原备库)
#查询备库状态为TO PRIMARY或SESSIONS ACTIVE
select database_role, switchover_status from v$database;
# 状态变为 TO PRIMARY 原本是NOT ALLOWED,主库改备库后,会变成TO PRIMARY
#如果状态是to primary:执行
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
#打开数据库(切换完后为mount状态)也可以直接打开 alter database open;
shutdown immediate;
startup;
select database_role, switchover_status from v$database;
#
附图:
4.验证主备状态(省略)
– 正常切换完成,可在主库insert/update数据看是否实时可在备库中select到
二、故障切换(failover)
- Failover仅应在主库确实无法恢复或紧急情况下使用。
– 主库出现故障,强行切换(备库操作,主库坏了)
1. 模拟故障,主库强制关机
SQL> shutdown abort;
#ORACLE instance shut down.
1.1 切换前准备(本例不讨论缺失数据问题)
#1 如果主库还能到mount状态,执行以下命令将未发送redo全部发送到目标备库。如果不能,跳过该步。执行完后等待从库应用完所有redo日志,如果期间没有报错,直接跳到故障转移部分分开始failover
alter system flush redo to 'target_db_name';
# 2检查目标备库接收到的最新归档日志号
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG;
#如果主库服务器没有宕机,检查这个归档是不是主库最新的,如果不是,拷贝还未发送的归档日志到从库。
#3:检查目标备库是否有gap
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
#如果缺少归档,如果主库服务器没有宕机,建议拷贝到目标备库。
#4:在目标备库注册缺失的归档日志
alter database register physical logfile 'filespec1';
2. 切换备库为主
# 查询备库状态NOT ALLOWED
select database_role,switchover_status from v$database;
停止同步并应用所有redo
alter database recover managed standby database cancel;
#关闭日志传输
alter database recover managed standby database finish force;
#查询状态
select switchover_status from v$database;
#提升为Primary
alter database commit to switchover to primary with session shutdown;
#这里如果存在gap,会报ORA-16139,需要强制切换
alter database activate physical standby database;
#打开数据库(切换完后为mount状态)开启DB
alter database open;
#查看新主库状态 查询数据库状态为TO STANDBY(表示切换完成)
select open_mode,database_role,switchover_status from v$database;
附图:
3.若原主库故障解决,利用RMAN将主库恢复到备库
。
# 启动到nomount
SQL> startup nomount
#使用RMAN进行DG
[oracle@dg02 ~]$ rman target sys/xxxx@dgbase01 auxiliary sys/xxxx@dgbase02
# 复制
RMAN> duplicate target database for standby from active database nofilenamecheck;
# 打开DB
SQL> alter database open;
SQL> select open_mode,database_role,switchover_status from v$database;
# 开启redo同步
SQL> alter database recover managed standby database using current logfile disconnect from session;
# 查询状态
SQL> select open_mode,database_role,switchover_status from v$database;
4.验证(省略)