|
5. 角色切换
Data Guard角色切换有两种方式:switchover 和 failover。
5.1. Switchover
5.1.1. 物理Standby
Switchover切换不会丢失数据,切换之后原先的Primary数据库和Standby数据库角色互换,并且每个数据库在Data Guard配置中仍然继续运行。切换必须从Primary数据库发起,具体步骤如下:
Step 1. Primary数据库检查视图V$DATABASE中的SWITCHOVER_STATUS列(SELECTSWITCHOVER_STATUS FROM V$DATABASE),如果是TO STANDBY则表示可以正常切换,如果是SESSIONS ACTIVE,在切换时带上WITH SESSION SHUTDOWN 子句也可以成功切换。
Step 2. Primary数据库发起switchover切换,ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 切换之后重启实例 SHUTDOWN IMMEDIATE; STARTUPMOUNT;
Step 3. Standby数据库检查视图V$DATABASE中的SWITCHOVER_STATUS列(SELECTSWITCHOVER_STATUS FROM V$DATABASE),如果是TO PRIMARY则表示可以正常切换,如果是SESSIONS ACTIVE,在切换时带上WITH SESSION SHUTDOWN 子句也可以成功切换。
Step 4. Standby数据库切换Primary数据库,ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 如果该Standby数据库从上次启动实例之后从未以read-only模式打开过,则直接ALTER DATABASE OPEN; 否则需要重启实例 SHUTDOWNIMMEDIATE; STARTUP;
Step 5. 如果必要的话,重启新Standby数据库的Log Apply服务 ALTER DATABASE RECOVER MANAGED STANDBYDATABASE; (详见4.1)。
5.1.2. 逻辑Standby
同物理Standby一样,switchover也必须从Primary数据库发起。
Step 1. Primary数据库检查视图V$DATABASE中的SWITCHOVER_STATUS列(SELECT SWITCHOVER_STATUS FROM V$DATABASE),如果是TO STANDBY或SESSIONS ACTIVE则表示可以正常切换。
Step 2. Primary数据库执行SQL语句ALTER DATABASE PREPARE TO SWITCHOVER TOLOGICAL STANDBY;这一句SQL的作用是通知当前的Primary数据库准备切换至Standby,并从新的Primary数据库接收Redo Log。 此时V$DATABASE视图中SWITCHOVER_STATUS列的状态是PREPARING SWITCHOVER。
Step 3. Standby数据库执行SQL语句ALTER DATABASE PREPARE TO SWITCHOVER TOPRIMARY; 这一句SQL的作用是在Standby数据库上启动Redo传输服务,此时该Standby数据库会将Redo Log传输到当前的Primary数据库和其他的Standby数据库,但是不做应用。
Step 4. Primary数据库检查视图V$DATABASE中的SWITCHOVER_STATUS列,在Step3完成后(LogMiner Multiversioned Data Dictionary被当前Primary数据库接收完成),SWITCHOVER_STATUS状态将变更为TO LOGICAL STANDBY。此时可以取消switchover切换,Primary和Standby分别执行SQL语句:ALTER DATABASE PREPARE TO SWITCHOVERCANCEL;
Step 5. Primary数据库执行ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY; 切换到Standby数据库。检查视图V$DATABASE中的SWITCHOVER_STATUS列,如果是TO_PRIMARY表示切换成功。
Step 6. Standby数据库执行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 切换到Primary数据库。
Step 7. 在新的Standby数据库(即原先的Primary数据库)执行ALTER DATABASE START LOGICAL STANDBY APPLY; 开启SQL APPLY。
5.2. Failover
5.2.1. 物理Standby
如果使用了failover切换,那么故障的Primary数据库将会被踢出Data Guard配置。大部分情况下,除了将被切换成Primary数据库的那台Standby数据库,其余的Standby数据库在failover切换之后将继续在Data Guard中正常运行,不需要重启或作其他操作。在少数情况下,会需要为新的Primary数据库重做这些Standby,具体情况下面会描述到。如果要进行failover切换,请按照以下的步骤,不要使用ALTER DATABASE ACTIVATE STANDBY DATABASE;语句,否则会造成数据丢失。另外如果Data Guard不是最大保护或者最高可用的话,也会丢失部分数据。
Step 1. 解决gap(详见3.4)。如果Data Guard为最大保护或者最高可用,那么在Primary故障发生时是没有gap的,所以可以直接跳到Step4进行操作。
Step 2. 重复Step1直到没有gap。
Step 3. 待切换的Standby数据库检查视图V$ARCHIVED_LOG,查出最高的日志序列号 SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BYthread#) AS LAST from V$ARCHIVED_LOG; 从Primary数据库的归档日志路径下,找到任何比之前查询到的最高序列号更高的日志,并copy到Standby数据库,使用SQL语句ALTER DATABASE REGISTER PHYSICAL LOGFILE'filespec1'; 进行注册。完成之后重复Step1,确保没有gap。
Step 4. 从Standby数据库发起failover切换。ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; FORCE关键字表示让RFS进程直接终止,而不等待网络超时。
Step 5. 执行SQL语句ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 切换成Primary数据库。在执行完这一句SQL语句之后,目标Standby数据库将切换成Primary数据库,切换之后该数据库将无法再被作为Standby数据库,并且从老的Primary数据库再传来任何Redo也无法被应用。Data Guard中其余的Standby数据库将不需要重启,自动从新的Primary数据库接收日志并应用,当然前提是归档路径配置正确。
Step 6. 这一步是否需要取决于该Standby数据库从上次启动到现在是否曾经以只读模式打开,如果打开过,则需要重启,如果没有则直接open即可。
Step 7. 备份新的Primary数据库。
5.2.2. 逻辑Standby
Step 1. 将Primary数据库上会传输过来的归档日志copy到Standby数据库并注册。(详见3.4.2)
Step 2. 检查视图SELECT APPLIED_SCN, LATEST_SCN FROM V$LOGSTDBY_PROGRESS; 如果APPLIED_SCN和LATEST_SCN值相同,则表示Standby恢复的数据和Primary相同。如果Standby数据库没有启用SQL APPLY,则可以通过SQL语句ALTER DATABASE START LOGICAL STANDBY APPLYFINISH; 开启。
Step 3. 检查LOG_ARCHIVE_DEST_2是否配置,VALID_FOR属性是否正确配置。如果没有,先配置好。(详见3.3)
Step 4. Standby数据库执行ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY; 这句语句会终止RFS进程,并且将Standby Redo Log中还未应用的日志进行应用,然后停止SQL APPLY,将数据库切换为Primary数据库。如果没有加FINISH APPLY,那么Standby Redo Log中的日志将不会被应用。
Step 5. 在原先Data Guard配置中其余的Standby数据库上执行以下三步,重新和新的Primary数据库组成Data Guard。
1. ALTER SESSION DISABLE GUARD;
2.创建到新Primary数据库的db link
3.ALTER SESSION ENABLE GUARD;
Step 6. 在Standby数据库上执行ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARYdblink; 这里的dblink就是step 5创建的db link名字。
Step 7. 备份新的Primary数据库。
6. Data Guard物理Standby常用视图
视图名
| 数据库角色 | 视图内容描述 | V$ARCHIVE_DEST
| Primary, physical
| 显示Data Guard配置中所有的归档路径
| V$ARCHIVE_DEST_STATUS
| Primary, physical
| 显示归档路径的配置信息和状态
| V$ARCHIVE_GAP
| Primary, physical
| 显示归档日志gap,用于在failover切换时处理归档裂缝
| V$ARCHIVED_LOG
| Primary, physical
| 显示控制文件中保存的归档日志信息
| V$DATAGUARD_CONFIG
| Primary, physical
| 列出Data Guard中所有的DB_UNIQUE_NAME和
LOG_ARCHIVE_CONFIG参数信息
| V$DATAGUARD_STATS
| Primary, physical
| 显示所有Primary上未能传输给Standby的Redo Log信息,如果在Primary上查询该视图,那么结果值将被清除。
| V$DATAGUARD_STATUS
| Primary, physical
| 显示Data Guard中的事件信息,同时这些信息也会被记录在alert.log中和其他的trace文件中
| V$MANAGED_STANDBY
| Physical only
| 显示当前Standby的所有状态信息
| V$STANDBY_LOG
| Primary, physical
| 显示所有的Standby Redo Log信息
|
|
|