1. プライマリデータベースからスタンバイデータベースへの切り替え
Oracle Data Guardの構成では、プライマリデータベースは一つのみですが、スタンバイデータベースは複数存在できます。そのため、ロールの切り替え操作はまずプライマリからスタンバイへ行います。
1.1 プライマリロールの切り替え状態の確認
プライマリデータベースで現在のロールと切り替えの準備状態を確認します。
SQL> select name, database_role, switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
------------------------- ---------------- --------------------
PRIMARY_DB PRIMARY TO STANDBY
1.2 プライマリからスタンバイへの正常な切り替えコマンド
プライマリデータベースを物理スタンバイデータベースに切り替えます。
SQL> alter database commit to switchover to physical standby;
Database altered.
1.3 切り替え後の操作
データベースをシャットダウンし、マウント状態で再起動します。その後、ロールの状態を確認します。
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
# ロール切り替え後の状態を確認
SQL> select name, database_role, switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
------------------------- ---------------- --------------------
PRIMARY_DB PHYSICAL STANDBY RECOVERY NEEDED
# 保護モードとレベルを確認
SQL> select name, database_role, protection_mode, protection_level from v$database;
NAME DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
------------------------- ---------------- -------------------- --------------------
PRIMARY_DB PHYSICAL STANDBY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
1.4 異常時の切り替えコマンド
「TO STANDBY」の状態でセッションがアクティブな場合、以下のコマンドで強制的に切り替えを実行できます。その後、上記の切り替え後の手順を続けます。
SQL> alter database commit to switchover to physical standby with session shutdown;
2. スタンバイデータベースからプライマリデータベースへの切り替え
2.1 スタンバイロールの切り替え状態の確認
スタンバイデータベースで現在のロールと切り替えの準備状態を確認します。
SQL> select name, database_role, switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ---------------- --------------------
STANDBY_DB PHYSICAL STANDBY TO PRIMARY
2.2 スタンバイからプライマリへの切り替えコマンド
スタンバイデータベースをプライマリデータベースに切り替えます。
SQL> alter database commit to switchover to primary;
Database altered.
2.3 切り替え後の操作
ロールの状態を確認し、インスタンスの状態をチェックします。その後、データベースをOPENモードで起動します。
# ロール切り替え後の状態を確認
SQL> select name, database_role, switchover_status from v$database;
NAME DATABASE_ROLE SWITCHOVER_STATUS
--------- ---------------- --------------------
STANDBY_DB PRIMARY NOT ALLOWED
# 保護モードとレベルを確認
SQL> select name, database_role, protection_mode, protection_level from v$database;
NAME DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
--------- ---------------- -------------------- --------------------
STANDBY_DB PRIMARY MAXIMUM PERFORMANCE UNPROTECTED
# スタンバイからプライマリに切り替えた後のインスタンス状態
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
stddb MOUNTED
# データベースをOPENモードで起動
SQL> alter database open;
Database altered.
# 切り替え後の保護モードとレベルを再度確認
SQL> select database_role, protection_mode, protection_level from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------- -------------------- --------------------
PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
3. 新しいスタンバイデータベースのログ適用サービスの起動
元のプライマリデータベースは現在スタンバイとして動作しています。データベースのオープンモードを確認します。
SQL> select name, open_mode from v$database;
NAME OPEN_MODE
------------------------- --------------------
PRIMARY_DB MOUNTED
データベースをOPENモードで起動します。
SQL> alter database open;
Database altered.
データベースのログ適用サービスを起動します。
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.
# データベースのオープンモードを確認
SQL> select name, open_mode from v$database;
NAME OPEN_MODE
------------------------- --------------------
PRIMARY_DB READ ONLY WITH APPLY
これで、プライマリとスタンバイのロール切り替えが完了しました。