プライマリデータベースに障害が発生した際に、自動的にスタンバイデータベースにフェイルオーバーするための機能としてファストスタートフェイルオーバーというものがある。あまり使われているところを見たことがないので、どういう動きをするものなのか確かめてみる。
スイッチオーバー操作とフェイルオーバー操作 (oracle.com)
事前準備
前提として、DataGuard Brokerの構成が必要。今回プライマリとスタンバイについては以下のような構成を想定している。
- サービス名はプライマリがdb19p、スタンバイがdb19s
- プライマリ・スタンバイともにシングルインスタンス構成
さらに、プライマリとスタンバイのデータベースサーバのほかに、オブザーバーのホストを準備しておく必要がある。
オブザーバーのホストにはOracle Clientを管理者オプションでインストールし、tnsnames.ora にプライマリとスタンバイ双方に接続できるように設定を追加しておく。
db19p =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dg1.dn.home)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19p)
)
)
db19s =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dg2.dn.home)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db19s)
)
)
Broker管理のためのdgmgrlコマンドは以降このオブザーバ上で実行する。リスナー経由でプライマリに接続して操作すればよい。
[oracle@dgobs ~]$ dgmgrl sys/oracle@db19p
DGMGRL for Linux: Release 19.0.0.0.0 - Production on 木 8月 29 15:11:02 2024
Version 19.22.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
DGMGRLへようこそ。詳細は"help"と入力してください。
"db19p"に接続しました
SYSDBAとして接続しました。
DGMGRL>
フェイルオーバー後に自動的にスタンバイを再構築させるためには、フラッシュバックデータベースをプライマリとスタンバイの双方で有効にしておく必要がある。マウント状態でフラッシュバックデータベースを有効にしておく。
SQL> alter database flashback on;
データベースが変更されました。
SQL> alter database open;
データベースが変更されました。
設定
プライマリデータベースに障害が発生した際にフェイルオーバーする先として、プライマリ側の構成プロパティにFastStartFailoverTargetを設定する。
DGMGRL> show database db19p FastStartFailoverTarget
FastStartFailoverTarget = ''
DGMGRL> edit database db19p set property FastStartFailoverTarget='db19s';
プロパティ"faststartfailovertarget"が更新されました
DGMGRL> show database db19p FastStartFailoverTarget
FastStartFailoverTarget = 'db19s'
ファストスタートフェイルオーバーを有効にする。
DGMGRL> ENABLE FAST_START FAILOVER;
潜在的データ損失モードで有効.
DGMGRL> show fast_start failover;
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
保護モード: MaxPerformance
ラグ制限: 30 秒
Lag Type: APPLY
しきい値: 30 秒
アクティブなターゲット: db19s
潜在的ターゲット: "db19s"
db19s 有効
オブザーバ: (なし)
プライマリ停止: TRUE
自動回復: TRUE
オブザーバ再接続: (なし)
オブザーバオーバーライド: FALSE
Lag Grace Time: 0 秒
設定可能なフェイルオーバー条件
ヘルス:
Corrupted Controlfile YES
Corrupted Dictionary YES
Inaccessible Logfile NO
Stuck Archiver NO
Datafile Write Errors YES
Oracleエラー条件:
オブザーバーを起動する。
DGMGRL> show configuration
構成 - db19dg
保護モード: MaxPerformance
メンバー:
db19p - プライマリ・データベース
警告: ORA-16819: ファスト・スタート・フェイルオーバー・オブザーバが起動されていません
db19s - (*) フィジカル・スタンバイ・データベース
警告: ORA-16819: ファスト・スタート・フェイルオーバー・オブザーバが起動されていません
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
構成ステータス:
WARNING (ステータスは42秒前に更新されました)
DGMGRL> start observer
Succeeded in opening the observer file "/home/oracle/fsfo_dgobs.dn.home.dat".
[W000 2024-08-29T15:39:56.558+09:00] FSFO target standby is db19s
オブザーバ'dgobs.dn.home'が起動されました
The observer log file is '/home/oracle/observer_dgobs.dn.home.log'.
「start observer」とだけ入力した場合、dgmgrlのプロンプトはここで待機状態になり戻ってこない。バックグラウンドで起動させる方法もあるようだが、ウォレットの構成が必要らしいので今回は行わない。
別の端末から別途dgmgrlを起動してshow configurationを実行すると、オブザーバーに関する警告もなくなっていることがわかる。
DGMGRL> show configuration
構成 - db19dg
保護モード: MaxPerformance
メンバー:
db19p - プライマリ・データベース
db19s - (*) フィジカル・スタンバイ・データベース
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
構成ステータス:
SUCCESS (ステータスは41秒前に更新されました)
障害の検証
プライマリのネットワークを切断させて、何が起こるかを確認してみる。
オブザーバーのログには、プライマリに接続できなくなったことを検知し、ファストスターとフェイルオーバーを開始・成功した旨のメッセージが出力される。
[W000 2024-08-29T15:48:40.030+09:00] Primary database cannot be reached.
[W000 2024-08-29T15:48:55.031+09:00] Primary database cannot be reached.
[W000 2024-08-29T15:48:55.031+09:00] Fast-Start Failover threshold has expired.
[W000 2024-08-29T15:48:55.032+09:00] Try to connect to the standby.
[W000 2024-08-29T15:48:55.032+09:00] Check if the standby is ready for failover.
[S002 2024-08-29T15:48:55.036+09:00] Fast-Start Failover started...
2024-08-29T15:48:55.037+09:00
データベース"db19s"へのファスト・スタート・フェイルオーバーを開始しています...
[S002 2024-08-29T15:48:55.037+09:00] Initiating Fast-start Failover.
現在フェイルオーバーを実行しています。お待ちください...
[P006 2024-08-29T15:48:59.135+09:00] Failed to attach to db19p.
ORA-12543: TNS: 接続先ホストに接続できません。
db19pでデータベースに接続できません
フェイルオーバーに成功しました。新規プライマリは"db19s"です
dgmgrl でオブザーバの状態を確認。プライマリが切り替わっていることがわかる。
DGMGRL> show observer
構成 - db19dg
プライマリ: db19s
アクティブなターゲット: (なし)
オブザーバ"dgobs.dn.home" - マスター
ホスト名: dgobs.dn.home
プライマリに対する最後のping: 3秒前
ターゲットに対する最後のping: 56秒前
DGMGRL> show configuration
構成 - db19dg
保護モード: MaxPerformance
メンバー:
db19s - プライマリ・データベース
警告: ORA-16844: データベースには有効なファスト・スタート・フェイルオーバー・ターゲット・スタンバイ・データベースがありません
db19p - フィジカル・スタンバイ・データベース(disabled)
ORA-16661: スタンバイ・データベースを修復する必要があります
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
構成ステータス:
WARNING (ステータスは48秒前に更新されました)
スタンバイのアラートログにも以下のようにフェイルオーバー開始のメッセージが確認できる。
2024-08-29T15:48:55.012817+09:00
Attempting Fast-Start Failover because the threshold of 30 seconds has elapsed.
2024-08-29T15:48:55.013078+09:00
Process termination requested for pid 4684 [source = rdbms], [info = 2] [request issued by pid: 4754, uid: 54321]
2024-08-29T15:48:55.894636+09:00
Beginning Fast-Start Failover to database db19s.
2024-08-29T15:48:55.895677+09:00
ALTER DATABASE FAILOVER TO db19s
:
2024-08-29T15:49:04.201629+09:00
RSM0 (PID:4690): Database role cleared from PHYSICAL STANDBY [kcvs.c:1133]
Switchover: Complete - Database mounted as primary
TMI: kcv_commit_to_so_to_primary Switchover from physical END 2024-08-29 15:49:04.201852
TMI: dbsdrv failover to target END 2024-08-29 15:49:04.201935
Completed: ALTER DATABASE FAILOVER TO db19s
このとき、プライマリはアラートログに出力された以下のメッセージのように自動的にシャットダウンされている。
2024-08-29T15:49:23.100764+09:00
Primary has heard from neither observer nor target standby within FastStartFailoverThreshold seconds.
It is likely an automatic failover has already occurred. Primary is shutting down.
2024-08-29T15:49:23.100999+09:00
Errors in file /u01/app/oracle/diag/rdbms/db19p/db19p/trace/db19p_lg00_5261.trc:
ORA-16830: FastStartFailoverThresholdの秒数より長くファスト・スタート・フェイルオーバー・パートナから分離しているプライマリ: 停止中
USER (ospid: 5261): terminating the instance due to ORA error 16830
2024-08-29T15:49:23.154252+09:00
System state dump requested by (instance=1, osid=5261 (LG00)), summary=[abnormal instance termination].
System State dumped to trace file /u01/app/oracle/diag/rdbms/db19p/db19p/trace/db19p_diag_5234.trc
2024-08-29T15:49:23.620942+09:00
Dumping diagnostic data in directory=[cdmp_20240829154923], requested by (instance=1, osid=5261 (LG00)), summary=[abnormal instance termination].
2024-08-29T15:49:24.703119+09:00
Instance terminated by USER, pid = 5261
オブザーバーのログを監視していると、以下のように定期的に旧プライマリの修復を試みていることがわかる。
2024-08-29T15:52:41.329+09:00
データベース"db19p"の修復を開始しています...
データベース"db19p"を修復しています。お待ちください...
[W000 2024-08-29T15:53:00.333+09:00] Primary database cannot be reached.
[W000 2024-08-29T15:53:00.333+09:00] Fast-Start Failover target switch is pending.
エラー: ORA-16653: データベースを修復できませんでした
失敗しました。
データベース"db19p"の修復に失敗しました
2024-08-29T15:53:05.946+09:00
[W000 2024-08-29T15:53:05.949+09:00] Disconnecting from database db19s.
[W000 2024-08-29T15:56:05.336+09:00] Try to connect to the primary db19s.
[W000 2024-08-29T15:56:06.341+09:00] Connection to the primary restored!
[W000 2024-08-29T15:56:08.346+09:00] Reinstating database db19p.
切断していたネットワークを復旧してみる。シャットダウンされている旧プライマリの起動を試みた場合、以下のようにオープン状態にはできないが、そこでいったん待機させておく。
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 1073739904 bytes
Fixed Size 8947840 bytes
Variable Size 276824064 bytes
Database Buffers 780140544 bytes
Redo Buffers 7827456 bytes
データベースがマウントされました。
ORA-16649:
他のデータベースにフェイルオーバーするとこのデータベースはオープンできません
この間に、オブザーバは自動的に修復を開始する。
[W000 2024-08-29T16:02:36.722+09:00] Try to connect to the primary db19s.
[W000 2024-08-29T16:02:37.722+09:00] Connection to the primary restored!
[W000 2024-08-29T16:02:39.727+09:00] Reinstating database db19p.
2024-08-29T16:02:39.727+09:00
データベース"db19p"の修復を開始しています...
データベース"db19p"を修復しています。お待ちください...
データベース"db19p"の修復に成功しました
2024-08-29T16:03:02.138+09:00
[W000 2024-08-29T16:03:03.136+09:00] Successfully reinstated database db19p.
[W000 2024-08-29T16:03:03.136+09:00] Disconnecting from database db19s.
旧プライマリのアラートログからは、フラッシュバックデータベースが自動的に実行され、スタンバイへの変換が実行されている様子が確認できる。
2024-08-29T16:02:46.360457+09:00
FLASHBACK DATABASE TO SCN 2656372
2024-08-29T16:02:46.367684+09:00
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
Started logmerger process
2024-08-29T16:02:46.441531+09:00
Parallel Media Recovery started with 2 slaves
2024-08-29T16:02:46.452950+09:00
Recovery of Online Redo Log: Thread 1 Group 2 Seq 22 Reading mem 0
Mem# 0: /u01/app/oracle/oradata/DB19P/redo02.log
2024-08-29T16:02:46.780109+09:00
Incomplete Recovery applied until change 2656373 time 08/29/2024 15:48:23
2024-08-29T16:02:46.781883+09:00
Flashback Media Recovery Complete
Completed: FLASHBACK DATABASE TO SCN 2656372
alter database convert to physical standby
2024-08-29T16:02:46.882448+09:00
ALTER DATABASE CONVERT TO PHYSICAL STANDBY (db19p)
:
2024-08-29T16:02:50.335008+09:00
In-memory operation on ADG is currently only supported on Engineered systems and PaaS.
inmemory_adg_enabled is turned off automatically.
Please contact our support team for EXADATA solutions
CONVERT TO PHYSICAL STANDBY: Complete - Database mounted as physical standby
Completed: alter database convert to physical standby
旧プライマリがスタンバイとして利用できる状態に自動的に復帰する。
DGMGRL> show configuration
構成 - db19dg
保護モード: MaxPerformance
メンバー:
db19s - プライマリ・データベース
警告: ORA-16844: データベースには有効なファスト・スタート・フェイルオーバー・ターゲット・スタンバイ・データベースがありません
db19p - フィジカル・スタンバイ・データベース
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
構成ステータス:
WARNING (ステータスは50秒前に更新されました)
最後に、スイッチオーバーにより元の状態にもどすことで、完全に復旧が可能。
DGMGRL> switchover to db19p;
現在スイッチオーバーを実行しています。お待ちください...
操作にはデータベース"db19p"への接続が必要です
接続中...
"db19p"に接続しました
SYSDBAとして接続しました。
新しいプライマリ・データベース"db19p"がオープン中です...
操作上、インスタンス"db19s" (データベース"db19s")を起動する必要があります
インスタンス"db19s"の起動中...
アイドル・インスタンスに接続しました。
ORACLEインスタンスが起動しました。
"db19s"に接続しました
データベースがマウントされました。
データベースがオープンされました。
スイッチオーバーに成功しました。新しいプライマリは"db19p"です
DGMGRL> show configuration
構成 - db19dg
保護モード: MaxPerformance
メンバー:
db19p - プライマリ・データベース
db19s - (*) フィジカル・スタンバイ・データベース
ファスト・スタート・フェイルオーバー: 潜在的データ損失モードで有効
構成ステータス:
SUCCESS (ステータスは31秒前に更新されました)
コメント