Datarguard環境 スイッチオーバー手順について

Dataguard環境のスイッチオーバーの実行を試してみましたので記録
として残します。


■検証環境

手順については以下の環境で確認しました。

OS:Asianux Server 3(64-bit)
DB:Oracle Database Enterprise Edition 11.2.0.1
Dataguard:Phisycal Standby 環境

 

■手順を実行する上での注意点について

-実行する手順は全てSQL*PLUSから実行します。SYSユーザ等の管理者権限を持つユーザにて行って下さい。

 

-こちらの手順はフィジカルスタンバイ環境のスイッチオーバー実行手順となります。ロジカルスタンバイ環境やStandard Editionの基本スタンバイ環境では行わないで下さい。

 

-手順はあくまで個人の趣味の範囲で記載させて頂いております。その為実行頂く場合は全て自己責任でお願い致します。

 


■スイッチオーバー実行手順■

 

(1)以下のSQLを実行しプライマリ側DBがOPEN状態である事を確認します。STATUS列がOPENであることを確認して下さい。

COLUMN STATUS FORMAT A16
COLUMN DATABASE_ROLE FORMAT A24
SELECT DATABASE_ROLE,STATUS FROM V$DATABASE ,V$INSTANCE;




以下、ご参考までに実行例と致します。

SQL> COLUMN STATUS FORMAT A16
SQL> COLUMN DATABASE_ROLE FORMAT A24
SQL> SELECT DATABASE_ROLE,STATUS FROM V$DATABASE ,V$INSTANCE;

DATABASE_ROLE                STATUS
------------------------ ----------------
PRIMARY                            OPEN

※OPENモードで無い場合は、OPENモードで起動させて下さい。

 

(2) 以下のSQLを実行しスタンバイ側でDBがMOUNTモードで起動している事を確認します。STATUS列がMOUNTEDである事を確認します。

COLUMN STATUS FORMAT A16
COLUMN DATABASE_ROLE FORMAT A24
SELECT DATABASE_ROLE,STATUS FROM V$DATABASE ,V$INSTANCE;



以下ご参考までに実行例と致します。

SQL> COLUMN STATUS FORMAT A16
SQL> COLUMN DATABASE_ROLE FORMAT A24
SQL> SELECT DATABASE_ROLE,STATUS FROM V$DATABASE ,V$INSTANCE;

DATABASE_ROLE                STATUS
------------------------ ----------------
PHYSICAL STANDBY           MOUNTED


注)スタンバイDBを停止している場合は、MOUNTモードで起動下さい。ACTIVE DATAGUARD機能を利用し、スタンバイDBをREAD ONLY状態で起動している場合は、停止後MOUTNモードで起動下さい。

(3)以下のSQLを実行しスタンバイDBで管理リカバリモードとなっている事を確認下さい。実行結果のRECOVERY_MODE列の値がMANAGED REAL TIME APPLYとなっている場合は管理リカバリモードが有効だと判断出来ます。

 

COLUMN DEST_NAME FORMAT A24
COLUMN RECOVERY_MODE FORMAT A24
SELECT DEST_NAME,RECOVERY_MODE FROM V$ARCHIVE_DEST_STATUS
WHERE DEST_NAME = 'LOG_ARCHIVE_DEST_1';



以下、ご参考までに実行例と致します。

SQL> COLUMN DEST_NAME FORMAT A24
SQL> COLUMN RECOVERY_MODE FORMAT A24
SQL> SELECT DEST_NAME,RECOVERY_MODE FROM V$ARCHIVE_DEST_STATUS
WHERE DEST_NAME = 'LOG_ARCHIVE_DEST_1';


DEST_NAME                       RECOVERY_MODE
------------------------ ------------------------
LOG_ARCHIVE_DEST_1        MANAGED REAL TIME APPLY

 


(4)以下のSQLを実行しプライマリ側でスタンバイロールに切り替えが可能である事を確認します。実行した結果「TO STANDBY」または「SESSIONS ACTIVE」となった場合はスイッチオーバーが可能です。

 

SELECT SWITCHOVER_STATUS FROM V$DATABASE;



ご参考までに以下、実行例です。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
------------------------------------------------------------
TO STANDBY

 

(5)以下を実行しプライマリ側で以下のSQLを実行しロールの切り替えを行います。

ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;


ご参考までに以下、実行例です。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

データベースが変更されました。



(6)以下を実行しプライマリ側で以下を実行し、DBを停止後MOUTモードで起動します。

 

SHUTDOWN ABORT;
STARTUP MOUNT;

 

ご参考までに以下、実行例です。

SQL> SHUTDOWN ABORT;
ORACLEインスタンスがシャットダウンされました。

SQL> STARTUP MOUNT;
ORACLEインスタンスが起動しました。

Total System Global Area 1286066176 bytes
Fixed Size 2213016 bytes
Variable Size 754977640 bytes
Database Buffers 520093696 bytes
Redo Buffers 8781824 bytes
データベースがマウントされました。


注1)11.2.0.4以降のバージョンでは、(5)の手順で内部的にDBの停止と起動が行われますので、(6)の手順は不要です。


注2)DBの停止はABORTモードで行う必要がございます。ABORTモードでDBの停止を行った場合は、実行中のセッションは強制的に終了されコミットされていないトランザクションについてはロールバックされます。

 

(7)以下SQLを実行しスタンバイ側でプライマリへの切り替えが可能である事を確認します。実行結果がTO PRYMARYまたはSESSIONS ACTIVEの場合、プライマリへの切り替えが可能であることを表します。

SELECT SWITCHOVER_STATUS FROM V$DATABASE;


ご参考までに以下、実行例です。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
------------------------------------------------------------
TO PRYMARY


(8)スタンバイ側で以下を実行し、プライマリへのロール切り替えを行います。

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;


ご参考までに以下、実行例です。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

データベースが変更されました。


注)上記の実行には多少、時間がかかる場合があります。

(9)新プライマリ側で以下を実行しDBをオープンにします。

ALTER DATABASE OPEN;



ご参考までに以下、実行例です。

SQL>ALTER DATABASE OPEN;

データベースが変更されました。


(10)新スタンバイにて以下を実行し、管理リカバリ機能を有効にします。

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;


ご参考までに以下、実行例です。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

データベースが変更されました。

 

(11) 以下SQLを実行しスイッチオーバー実行後に新プライマリ、旧スタンバイ側でREDO適用状況を確認します。

SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;


実行結果が以下の両方の条件を満たしている場合は新プライマリと新スタンバイのREDO適用状況に問題ないと判断できます。


-1.「SEQUENCE#」列の最も大きい値(実行例の★1)がプライマリとスタンバイ双方で一致している場合

-2.「SEQUENCE#」列の最も大きい値と同じ行の「APPLIED」列(実行例の★2)が「YES」となっている場合


以下ご参考までに実行例とさせて頂きます。

(新プライマリ側で実行)
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

SEQUENCE# APPLIED
---------- ---------------------------
15 YES
16 YES
17 YES
18 YES
19 YES
20 YES
★1 21 YES ★2



(新スタンバイ側で実行)
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

SEQUENCE# APPLIED
---------- ---------------------------
15 YES
16 YES
17 YES
18 YES
19 YES
20 YES
★1 21 YES  ★2

 

Dataguard環境のスイッチオーバー手順は以上となります。