ACTIVE DATAGUARD Role transitions

 

 

Role transitions分为 switchoverfailover

 

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一致(大小,对应路径)

4switchover时如果主库是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 STANDB
Y

取消切换准备的步骤:

   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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(dg)