【Oracle】Data Guard 完全ガイド|スタンバイDB構成・保護モード・SWITCHOVER・FAILOVER の手順まで解説

Oracle Data Guardはプライマリデータベースのコピー(スタンバイデータベース)を別サイトに維持し、障害発生時に迅速に切り替えることで高可用性(HA)とディザスタリカバリ(DR)を実現する機能です。プライマリの REDO ログをスタンバイに転送して継続的に同期し、プライマリに障害が起きたときにスタンバイを新しいプライマリとして稼働できます。

Data Guard には追加ライセンスが必要です(Enterprise Edition に含まれる)。読み取り専用クエリをスタンバイ側で実行する Active Data Guard は別ライセンスです。

この記事でわかること

  • Physical Standby と Logical Standby の違い
  • 保護モード(Maximum Protection / Availability / Performance)の選び方
  • Data Guard の構成要素(LOG_ARCHIVE_DEST_n・FAL_SERVER・スタンバイ REDO ログ)
  • V$DATABASE・V$DATAGUARD_STATUS でステータスを確認する方法
  • SWITCHOVER(計画切り替え)と FAILOVER(緊急切り替え)の手順
  • Data Guard Broker(DGMGRL)で一元管理する方法
  • Active Data Guard でスタンバイを読み取り専用で活用する方法
スポンサーリンク

Physical Standby と Logical Standby の違い

項目 Physical Standby(物理スタンバイ) Logical Standby(論理スタンバイ)
同期方法 REDO ログをブロックレベルで適用(Redo Apply) REDO ログを SQL に変換して適用(SQL Apply)
スタンバイでのクエリ 通常は MOUNT 状態。Active Data Guard なら読み取り専用で OPEN 可 読み取り専用でオープン可能(SQL Apply 中も可)
適用のレイテンシ ほぼリアルタイム SQL 変換のため若干遅い
プラットフォーム プライマリと同じ OS・ビット数・エンディアンが必要 異なる OS でも可
用途 最も一般的・HA/DR に推奨 レポート用途・異なる OS への移行など

保護モード(Protection Mode)の選び方

保護モード 特徴 REDO 転送方式 推奨用途
Maximum Protection データの完全保護。スタンバイが切断されるとプライマリもシャットダウン SYNC + AFFIRM(同期・確認) ゼロデータ損失が必須の金融系
Maximum Availability スタンバイが使えない場合はプライマリは続行(Performance モードに自動降格) SYNC + AFFIRM 高可用性重視・標準推奨
Maximum Performance プライマリのパフォーマンス優先。スタンバイへの転送は非同期 ASYNC(非同期) パフォーマンス重視・遠距離サイト
保護モードの確認と変更
-- 現在の保護モードを確認する
SELECT protection_mode, protection_level, database_role
FROM V$DATABASE;
-- protection_mode: MAXIMUM PROTECTION / MAXIMUM AVAILABILITY / MAXIMUM PERFORMANCE
-- database_role: PRIMARY / PHYSICAL STANDBY / LOGICAL STANDBY

-- 保護モードを変更する(Maximum Availability → Maximum Performance の例)
-- ※ プライマリ側でのみ実行可能
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;

-- Data Guard の状態を確認する
SELECT source_db_unique_name, target_db_unique_name, status, error
FROM V$ARCHIVE_DEST_STATUS
WHERE target = 'STANDBY';

Data Guard の主要な構成パラメータ

プライマリ側の主要パラメータ設定
-- プライマリ側のパラメータ設定例(init.ora または spfile)

-- DB の一意名(スタンバイと区別するために必須)
ALTER SYSTEM SET DB_UNIQUE_NAME = 'primdb' SCOPE=SPFILE;

-- REDO ログの転送先(スタンバイ)
-- SYNC: 同期転送, ASYNC: 非同期転送
-- AFFIRM: ディスクへの書き込み確認, NOAFFIRM: 確認なし
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 =
    'SERVICE=standby ASYNC NOAFFIRM DB_UNIQUE_NAME=stbydb'
    SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE SCOPE=BOTH;

-- スタンバイが再起動した場合のログ再送信元(FAL = Fetch Archive Log)
ALTER SYSTEM SET FAL_SERVER = 'standby' SCOPE=BOTH;  -- スタンバイ側の TNS エイリアス
ALTER SYSTEM SET FAL_CLIENT = 'primary' SCOPE=BOTH;  -- プライマリ側の TNS エイリアス

-- スタンバイ REDO ログ(SRL)をプライマリに作成する
-- SRL サイズはオンライン REDO ログと同じにする。グループ数はオンライン REDO ログ数 + 1 以上
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 '/u01/oradata/standby_redo01.log' SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 '/u01/oradata/standby_redo02.log' SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 '/u01/oradata/standby_redo03.log' SIZE 200M;

-- スタンバイへのパラメータファイル転送を有効化する
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT = AUTO SCOPE=BOTH;
-- AUTO: プライマリのデータファイル追加がスタンバイに自動的に反映される

Data Guard のステータス監視

プライマリ・スタンバイの状態確認クエリ
-- ① プライマリ側での確認
-- アーカイブログの転送状況を確認する
SELECT dest_id, status, error, gap_status,
       db_unique_name
FROM V$ARCHIVE_DEST_STATUS
WHERE target = 'STANDBY';

-- 転送済みの最新シーケンス番号を確認する
SELECT thread#, sequence#, archived, applied, completion_time
FROM V$ARCHIVED_LOG
WHERE standby_dest = 'YES'
ORDER BY sequence# DESC
FETCH FIRST 10 ROWS ONLY;

-- ② スタンバイ側での確認
-- 適用済みの最新シーケンス番号を確認する(スタンバイで実行)
SELECT thread#, MAX(sequence#) AS applied_max
FROM V$ARCHIVED_LOG
WHERE applied = 'YES'
GROUP BY thread#;

-- 適用ラグ(遅延)を確認する
SELECT name, value, datum_time
FROM V$DATAGUARD_STATS
WHERE name IN ('apply lag', 'transport lag', 'apply finish time');
-- apply lag: スタンバイの適用遅延(0 seconds が理想)
-- transport lag: ログ転送の遅延

-- MRP(Managed Recovery Process)の状態を確認する
SELECT process, status, sequence#, block#, active_agents, known_agents
FROM V$MANAGED_STANDBY
ORDER BY process;
-- MRP0: 適用プロセス(WAIT_FOR_LOG または APPLYING_LOG が正常)
-- RFS: リモートファイルサーバープロセス

-- Data Guard のイベント・エラーを確認する
SELECT timestamp, severity, error_code, message
FROM V$DATAGUARD_STATUS
WHERE severity IN ('Error', 'Warning')
ORDER BY timestamp DESC
FETCH FIRST 20 ROWS ONLY;

SWITCHOVER(計画切り替え)と FAILOVER(緊急切り替え)

SWITCHOVERは計画的な切り替えで、プライマリとスタンバイを安全に入れ替えます。データ損失はなく、元のプライマリは新しいスタンバイとして動作し続けます。

FAILOVERはプライマリが使用不能な場合の緊急切り替えです。データ損失が発生する可能性があります。

SWITCHOVER の手順(計画切り替え)
-- ① プライマリ側: SWITCHOVER の準備と実行
-- スタンバイが切り替え可能な状態か確認する
SELECT switchover_status FROM V$DATABASE;
-- TO STANDBY: SWITCHOVER 可能
-- SESSIONS ACTIVE: アクティブセッションがある(セッションを終了させる必要がある)

-- プライマリをスタンバイロールに切り替える
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
-- プライマリが切り替わり、新しいスタンバイとして MOUNT 状態になる

-- ② スタンバイ側: プライマリロールに切り替える
-- スタンバイでの確認
SELECT switchover_status FROM V$DATABASE;
-- TO PRIMARY: SWITCHOVER 可能

-- スタンバイをプライマリロールに切り替える
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

-- 新しいプライマリを OPEN する
ALTER DATABASE OPEN;

-- ③ 元プライマリ(新しいスタンバイ)を起動する
-- 新しいスタンバイ側で実行
STARTUP MOUNT;
-- MRP(ログ適用プロセス)を起動する
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
FAILOVER の手順(緊急切り替え・プライマリ障害時)
-- プライマリが使用不能な場合、スタンバイ側で実行する
-- ① スタンバイの適用状態を確認する
SELECT process, status, sequence# FROM V$MANAGED_STANDBY;

-- ② 未転送のログを可能な限り回収する(オプション・通信が可能な場合)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

-- ③ スタンバイをプライマリに切り替える(FAILOVER)
ALTER DATABASE ACTIVATE STANDBY DATABASE;
-- この操作は不可逆(元のプライマリはリインスタンスが必要)

-- ④ データベースを OPEN する
ALTER DATABASE OPEN;

-- ⑤ ログ転送先を新しいプライマリに変更する
-- 元プライマリを新しいスタンバイとして再構成する場合は
-- RMAN の DUPLICATE FROM ACTIVE DATABASE でスタンバイを再作成する

Data Guard Broker(DGMGRL)で一元管理する

DGMGRL の基本操作
# DGMGRL に接続する
dgmgrl /
dgmgrl sys/password@primary

# Data Guard 構成を確認する
DGMGRL> show configuration;
DGMGRL> show database verbose primdb;
DGMGRL> show database verbose stbydb;

# 構成のステータスをサマリで確認する
DGMGRL> show configuration lag;

# SWITCHOVER を DGMGRL から実行する
DGMGRL> switchover to stbydb;

# FAILOVER を DGMGRL から実行する(プライマリが停止している場合)
DGMGRL> failover to stbydb;

# ログ転送の有効化・無効化
DGMGRL> edit database stbydb set state='APPLY-ON';   -- 適用開始
DGMGRL> edit database stbydb set state='APPLY-OFF';  -- 適用停止

# 保護モードの変更
DGMGRL> edit configuration set protection mode as MaxAvailability;

Active Data Guard でスタンバイを読み取り専用で活用する

Active Data Guard(別ライセンスが必要)を使うと、スタンバイに REDO ログを適用しながら読み取り専用でオープンできます。レポートやバッチクエリをスタンバイ側で実行してプライマリの負荷を軽減できます。

Active Data Guard でスタンバイを読み取り専用で開く
-- スタンバイ側でログ適用を続けながら READ ONLY で開く
ALTER DATABASE OPEN READ ONLY;
-- または RECOVER WITH APPLY のオプションで適用しながらオープン

-- MRP を再起動して READ ONLY + REDO 適用を有効にする
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

-- スタンバイの状態を確認する(READ ONLY WITH APPLY が理想)
SELECT open_mode, database_role, protection_mode FROM V$DATABASE;
-- open_mode: READ ONLY WITH APPLY(Active Data Guard が有効)
--            MOUNTED(MRP 適用中、クエリ不可)
--            READ ONLY(クエリ可、適用停止)

-- スタンバイでのクエリ例(読み取り専用)
SELECT COUNT(*) FROM hr.employees;  -- スタンバイ上でクエリ実行可
-- ※ DML(INSERT/UPDATE/DELETE)はスタンバイ上では実行できない

-- ライセンス確認(Active Data Guard は Oracle Enterprise Edition の別オプション)
SELECT value FROM V$OPTION WHERE parameter = 'Active Data Guard';
-- TRUE: Active Data Guard ライセンスあり

まとめ

  • Physical Standby:REDO をブロックレベルで適用。ほぼリアルタイム同期で最も一般的。同じ OS 環境が必要。Active Data Guard で読み取り専用クエリも可
  • 保護モード:Maximum Availability が標準推奨(SYNC 転送・スタンバイ切断時はプライマリ続行)。Maximum Protection はゼロデータ損失必須の場合
  • 状態監視:V$DATAGUARD_STATS の apply lag・transport lag を定期監視する。V$MANAGED_STANDBY で MRP プロセスの動作を確認する
  • SWITCHOVER:計画的な切り替えで、ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY → ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY で安全に入れ替えられる
  • FAILOVER:プライマリ障害時の緊急手順。ALTER DATABASE ACTIVATE STANDBY DATABASE で切り替えるが不可逆。元プライマリはスタンバイとして再構成が必要
  • DGMGRL:Data Guard Broker を使うと SWITCHOVER・FAILOVER を単一コマンドで実行できる。構成管理も一元化できる

Data Guard の REDO ログの転送には ARCHIVELOG モードが必須です。アーカイブログの管理については Oracle ORA-00257(アーカイブログ満杯)完全ガイドを参照してください。RMAN を使った物理スタンバイの初期構築については Oracle RMAN 完全ガイドも参照してください。