Role transitions分为 switchover、failover
1.switchover
数据不丢,执行后只是角色互换了。
2.failover
当主库故障时,备库切到主库角色,如果切换前,主库不是运行在MAXIMUM AVAILIABLITY或者MAXIMUM PROTECTION模式下,可能会有数据丢失。如果主库开启闪回的话,在切换后,故障恢复后,还是能够作为备库角色的。
switchover切换条件:
1、确保主备库的standby redo log 都已经建好
2、备库执行SQL:
SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
STATUS GAP_STATUS
--------- ------------------------
VALID NO GAP
只有STATUS字段值为VALID,GAP_STATUS字段值为NOGAP才能切。
3、保证主备库的tempfile与备库的tempfile一致(大小,对应路径)
4、switchover时如果主库是RAC的话,只保留一个主库实例启动着
5、如果备库运行为 real-time query状态时,将所有的备库实例切换到mounted状态,同时关掉所有连接到备库的链接,确保切换速度
6、对于多备库实例的情况,如果切换是切到物理standby的话,其他的物理standby还是新的主库的备库,原逻辑standby将不再是新主库的备库,同样,如果切到的是逻辑standby,则原来其他的逻辑standby都会是新的主库的standby,而原来的物理standby还是老的主库的备库。
failover切换条件:
1、如果主库运行在MAXIMUM PROTECTION模式,则切到MAXIMUM PERFORMANCE模式
SQL>alter database set standby database to maximum performance;
2、满足switchover切换条件
Switchover步骤(Physical standby):
1、主库查询:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
如果值是“TO STANDBY”,或者“SESSION ACTIVE”的话,都可以切换,如果不是的话,就不具备切换的条件,不能切。
2、主库执行SQL准备切换:
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;(如果第一步的值是TO STANDBY的话,这边就不需要加WITH SESSION SHUTDOWN)
3、将原主库启动到mount
SQL>SHUTDOWNN ABORT -- (11.2.0.4以后的版本就无需shutdown了,执行了第二步后会自动shutdown)
SQL>STARTUP MOUNT
4、备库查询:
SQL>SELECCT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TOPRIMARY
如果值是“TO PRIMARY”或者“SESSIONS ACTIVE”则表明备库已可以切换了。如果值是其他的话就查看下是否redo apply还在进行,redo传输配置是否有问题。修改直到查询处理的值是其中两个。
5、原备库执行:
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
6、新主库打开
SQL>ALTER DATABASE OPEN;
7、新备库执行:
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
8、其他原备库重新执行REDO APPLY:
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
完成。
Failover步骤(Physical standby):
1、将主库所有未传输(unsent)的redo都刷到备库上,如果主库还能mount的话,就有可能将未传输的已归档的redo以及当前redo flush到备库上,如果flush成功的话,有可能数据不丢,即使主库不是运行在不丢数据的保护模式下。
主库执行:
SQL>ALTER SYSTEM FLUSH REDO TO wsqstandby; (wsqstandby为备库DB_UNIQUE_NAME)
2、确保备库拥有最近已归档的日志
查看当前已归档的最高的SEQUENCE#,已THREAD#分组:
SQL>SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG;
将这些缺少的归档拷到备库,然后注册到物理备库中。
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
3、备库查看并解决redo log gap:
SQL>SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果结果有值的话,将这些SEQUENCE#对应的日志文件拷到备库服务器,并register到备库中,直到没有gap:
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
4、重复第3步直至没有gap,如果还有gap无法解决,将会丢数据。
5、备库停redo apply
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
6、备库完成apply所有已经接收的redo:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
这一步如果没报错则继续到第7步,如果报错(前面有gap无法解决),则failover还可以继续,须执行以下SQL将物理备库ACTIVE:
SQL>ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;执行完后,直接跳到第9步。
7、备库查询:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
如果值是“TO PRIMARY”或“SESSIONS ACTIVE”,则表明可以切换;如果不是则查看redo apply是否还没有停止,知道值是其中两个方可继续切换。
8、备库切到主库角色
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
9、新主库打开
SQL>alter database open;
10、新主库全库备份
11、原其他备库恢复REDO APPLY
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
完成。
Switchover步骤(Logical standby):
1、主库查询:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
如果值是“TO STANDBY”,或者“SESSION ACTIVE”的话,都可以切换,如果不是的话,就不具备切换的条件,不能切,检查配置。
2、主库准备切换:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
执行成功的话,再查下switchover_status会显示PREPARING SWITCHOVER;
3、备库准备切换:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
执行完后switchover_status的值马上变成PREPARING DICTIONARY,等到完成redo stream记录后,值就变成PREPARING SWITCHOVER,此时就可以切了。
4、确保原主库准备接收新的主库的redo stream
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO LOGICAL STANDBY
取消切换准备的步骤:
1.主库取消:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
2.备库取消:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
如果值是“TO LOGICAL STANDBY”的话则继续切换,执行第5步
5、主库切换:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
这个命令将等待主库上当前所有事务到事务结束,这段时间新的事务将无法产生。在switchover前,确保主库没有任何update动作,所有会话都关掉,没有连接。
6、备库查询:
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
如果值是“TO PRIMARY”,则备库可以进行切换了,执行第7步。
7、备库切换到主库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
8、新备库执行redo apply
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
完成。
Failover步骤(Logical standby):
1、主库flush redo到备库
SQL> ALTER SYSTEM FLUSH REDO TO wsqstandby;
2、备库执行命令,将所有未apply的日志注册到备库
SQL>ALTER DATABASE REGISTER LOGICAL LOGFILE '/disk1/oracle/dbs/log-%r_%s_%t.arc';
3、备库执行
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
4、备库执行,ACTIVE新的主库
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;
5、查看是否有其他备库能够作为新的备库
6、新主库全库备份
源文档 <http://docs.oracle.com/cd/E11882_01/server.112/e41134/role_management.htm#SBYDB5199>