Oracle数据库以主/备角色之一运行,可以通过以下方法更改数据库角色:
本篇先介绍利用sql操作的方法,下一篇介绍利用DG Broker操作的方法。
切换前
切换中(同步恢复前)
切换后
只要有可能,就应该切换到物理备库:
原主库将切换为物理备库。
redo log将从新主库归档到配置中的所有备库。
原主库将作为切换操作的一部分重启。请注意,不需要重启新主库。
切换中不涉及的备库(称为旁观者备库) 继续以切换前的状态运行,并且将自动开始应用从新主库接收的重做数据。
当配置在最大保护模式下运行时,不允许切换到逻辑备用数据库。
原主库将切换为逻辑备库。
切换完成后,无需重启主库或逻辑备库。
切换后,代理配置中的其他逻辑旁观者备库将保持可用,无需重新启动任何数据库。
在切换到逻辑备库后,所有物理和快照备库都将被禁用,必须从新主库的副本中重新创建。
步骤1:在主库上,检查switchover_status
状态为TO STANDBY
或 SESSIONS ACTIVE
均可切换,SESSIONS ACTIVE说明还有活跃会话
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
步骤2:将主库转为物理备库
with session shutdow用于强制关闭活动会话。
SQL> alter database commit to switchover to standby with session shutdown;
Database altered.
步骤3:重启并进行日志应用
如果是rac,只有一个实例能运行MRP进程,其他实例只能运行RFS进程接收日志。
SQL> shutdown immediate
SQL> startup
SQL> alter database recover managed standby database using current logfile disconnect from session parallel 4;
步骤4:检查状态,可以看到已变为从库
SQL> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database;
NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME
------------------------- ------------ -------------------- ---------------- -------------------- ------------------------------
ORCL ARCHIVELOG READ ONLY PHYSICAL STANDBY SESSIONS ACTIVE orcl
至此对原主库操作已完成,下面是对目标从库的操作。
步骤5:检查目标备库状态
状态为TO PRIMARY 或 SESSIONS ACTIVE均可切换,SESSIONS ACTIVE说明还有活跃会话。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO_PRIMARY
步骤6:将备库切为主库
SQL> alter database commit to switchover to primary with session shutdown;
步骤7:OPEN新主库
检查数据库的打开模式,可以看到已变为主数据库角色
SQL> ALTER DATABASE OPEN;
SQL> select name,open_mode,database_role from v$database;
NAME OPEN_MODE DATABASE_ROLE
--------- --------------------
MYTEST READ WRITE PRIMARY
步骤8:若其他备库的日志应用停止了,需要启动
SQL> alter database recover managed standby database using current logfile disconnect from session parallel 4;
failover与switchover最大的区别在于此时主库故障,切换可能丢数据(丢不丢取决于保护模式设置),并且Failover后主从关系不会自动恢复,可以使用代理的恢复功能或闪回恢复主从关系。
① 手动failover
需要DBA手动干预,可以再细分为Complete Failover和Immediate Failover。
如果满足以下任一条件,请使用立即故障转移:
备库遇到ORA-752
错误
备库遇到ORA-600
[3020]
错误,并且Oracle support已确定它是由于在主库中lost write造成的
不可能进行完全故障转移
如果在故障转移目标上发生ORA-752或ORA-600 [3020]错误,请不要尝试恢复旧主库,因为这样做可能会导致数据丢失。必须从新主库的备份中重新创建旧主库作为备库(就是要重搭DG了)。
② Fast-Start FailOver(FSFO,自动故障转移)
需要在Data Guard Broker中进行配置。当主数据库不可用时,DG Broker会将主库自动故障转移到预设的备库。
以手动Failover为例,FSFO配置相对复杂,单独在后面文章介绍。
故障转移前建议处理主库尚未传送的日志,如果不介意丢数据,可以跳过这一步。
步骤1:如果主库还能到mount状态,执行以下命令将未发送redo全部发送到目标备库。如果不能,跳过该步。执行完后等待从库应用完所有redo日志,如果期间没有报错,直接跳到第4部分开始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;
THREAD LAST
---------- ----------
1 100
如果主库服务器没有宕机,检查这个归档是不是主库最新的,如果不是,拷贝还未发送的归档日志到从库。
步骤3:检查目标备库是否有gap
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1 90 92
如上示例缺少sequence numbers为90, 91, 92 for thread 1的归档,如果主库服务器没有宕机,建议拷贝到目标备库。
步骤4:在目标备库注册缺失的归档日志
alter database register physical logfile 'filespec1';
步骤1:停止目标备库日志应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
步骤2:完成备库日志应用
alter database recover managed standby database finish;
-- force选项,个人理解相当于前面提到的Immediate Failover,不再对备库进行数据应用,立刻进行切换
alter database recover managed standby database finish force;
如果没有报错,执行下一步。
如果报错,可能归档存在gap,需要重新检查准备工作中归档日志是否都已拷贝到从库并进行注册。如果情况紧急来不及处理、或者主服务器已宕机、或者不介意丢数据,可以直接激活当前备库,但是此后主从关系将断开,需要重搭。
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
步骤3:检查备库状态
状态为TO PRIMARY或SESSIONS ACTIVE均可切换,SESSIONS ACTIVE说明还有活跃会话
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
步骤4:将备库切为主库
这个命令跟前面switchover其实是一样的,二者的差距在于failover前面多执行了一个 alter database recover managed standby database finish [force];
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
步骤5:OPEN新主库
ALTER DATABASE OPEN;
步骤6:检查新主库状态
SQL> select name,open_mode,database_role from v$database;
NAME OPEN_MODE DATABASE_ROLE
--------- -------------------- ----------------
MYTEST READ WRITE PRIMARY
这里介绍Failover后利用闪回恢复主从同步的方法,要求原主库(Failover后的备库)闪回功能必须打开并且闪回日志还在。利用DG Broker操作的方法放在下一篇介绍,其实原理是一样的,只是Oracle帮你做了。
假设当前failover已完成,新主库已打开。
在新主库上执行:
select to_char(standby_became_primary_scn) from v$database;
在原主库上,也就是现在的备库执行:
startup mount
flashback database to scn 9978113; --这个值为在新主库上查询到的SCN值
alter database convert to physical standby;
shutdown immediate
startup
alter database recover managed standby database using current logfile disconnect from session parallel 4;
至此,failover和其后的主从同步恢复已经完成,下一篇来看如何利用DG Broker来简化这些操作。
参考
https://docs.oracle.com/cd/E11882_01/server.112/e40771/sofo.htm#DGBKR360
https://docs.oracle.com/cd/E11882_01/server.112/e41134/role_management.htm#SBYDB00625
https://docs.oracle.com/cd/E11882_01/server.112/e41134/sql_stmts.htm#SBYDB4903
https://docs.oracle.com/cd/E11882_01/server.112/e41134/scenarios.htm#SBYDB4888
https://blog.csdn.net/shiyu1157758655/article/details/55261193
How To Open Physical Standby For Read Write Testing and Flashback (文档 ID 805438.1)