タイトル: ARC (Archiver Process / アーカイバ プロセス)
SEOタイトル: Oracle ARC 入門 — REDO の Archive Log 生成 / ARCHIVELOG モード / Data Guard の前提
| この記事の要点 |
|
ARC プロセスとは
Oracle データベースの稼働中、オンライン REDO ログ (REDO Log File) は ログスイッチで順番に切り替わります。ARCHIVELOG モードでは、切り替わって書き終わったログをアーカイブ先 (Archive Log Destination) へコピーするのが ARC の仕事です。
[ オンライン REDO Log Group 1 ] ─┐
[ オンライン REDO Log Group 2 ] ├─ ログスイッチで順番に書込
[ オンライン REDO Log Group 3 ] ─┘
│
│ 書き終わったログを ARC がコピー
▼
[ Archive Log ファイル群 ]
│
▼
[ FRA (Fast Recovery Area) / Standby DB / バックアップ ]
ARCHIVELOG モードの確認と切替
-- 現在のモード確認
SELECT log_mode FROM v$database;
-- LOG_MODE
-- ----------------
-- ARCHIVELOG ← アーカイブ有効
-- NOARCHIVELOG ← 無効
-- NOARCHIVELOG → ARCHIVELOG への切替 (要 mount 状態)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
アーカイブ先の指定 (LOG_ARCHIVE_DEST_n)
アーカイブ先は LOG_ARCHIVE_DEST_1〜LOG_ARCHIVE_DEST_31 までの 31 個まで指定可能です。
-- 1 番目: ローカルディレクトリ
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 =
'LOCATION=/u01/app/oracle/archive
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=ORCL';
-- 2 番目: Standby DB (Data Guard)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 =
'SERVICE=STBY01
ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=STBY01';
-- 3 番目: FRA (Fast Recovery Area)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_3 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST';
-- 確認
SELECT dest_id, status, destination
FROM v$archive_dest
WHERE status != 'INACTIVE';
並列度 — ARC0〜ARC9 + ARCa〜ARCt
負荷の高い OLTP では 1 つの ARC では追いつかなくなるため、複数並列起動できます。
-- 現在の並列度
SHOW PARAMETER log_archive_max_processes
-- NAME TYPE VALUE
-- log_archive_max_processes integer 4
-- 最大 30 まで増やせる
ALTER SYSTEM SET log_archive_max_processes = 8 SCOPE=BOTH;
-- 起動中の ARC を見る
SELECT name, description, paddr
FROM v$bgprocess
WHERE name LIKE 'ARC%' AND paddr <> '00';
-- NAME | DESCRIPTION
-- ARC0 | Archival Process 0
-- ARC1 | Archival Process 1
-- ARC2 | Archival Process 2
-- ...
Data Guard (Standby DB) との関係
Data Guard は本番 DB (Primary) の REDO を Standby DB に送って同期保持する Oracle の HA / DR ソリューションです。REDO の転送方法は二系統あり、いずれも ARCHIVELOG モードが前提です。
| 転送方式 | 担当プロセス | 特徴 |
|---|---|---|
| ARCH 転送 | ARC | ログスイッチ毎にアーカイブを送る。データロスは最大 1 ログ分 |
| LGWR 同期 (SYNC) 転送 | LGWR + LNS (NSS) | コミット毎に Standby へ送り、応答待ち。ゼロデータロス |
| LGWR 非同期 (ASYNC) 転送 | LGWR + LNS (NSA) | コミットと並行で送るが応答待ちなし。ほぼゼロデータロス |
アーカイブ ログ ファイルの命名
-- ファイル名フォーマットは LOG_ARCHIVE_FORMAT で定義
SHOW PARAMETER log_archive_format
-- log_archive_format string %t_%s_%r.dbf
-- パラメータの意味
-- %t ... スレッド番号 (RAC で増える)
-- %s ... ログシーケンス番号 (Log Switch ごとに +1)
-- %r ... RESETLOGS ID
-- %d ... DB Unique Name
-- 既存ファイルの確認
SELECT name, completion_time, archived
FROM v$archived_log
ORDER BY completion_time DESC
FETCH FIRST 10 ROWS ONLY;
容量管理 — 溜まりすぎ問題
アーカイブ ログは放置すると無限に増え続け、ディスクが満杯になった瞬間 DB が ORA-00257 archiver error でハングします。RMAN で定期削除するのが定石。
$ rman target /
# 7 日経過したアーカイブを削除
RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
# Standby へ送り済み + バックアップ取得済みのみ削除
RMAN> DELETE NOPROMPT ARCHIVELOG ALL
BACKED UP 1 TIMES TO DISK
APPLIED ON ALL STANDBY;
cron で日次回しておくのが運用の定番です。
フェイルバック (Switchover / Failover)
Data Guard 構成で本番が落ちた場合、Standby に切り替えて運用継続します。元の本番が復旧したら逆方向のアーカイブ転送で同期を取り戻して入れ替えるのがフェイルバックです。ARC の設定が両 DB に正しく入っていることが前提。
確認
-- ARC が動いているか
SELECT name, description, paddr
FROM v$bgprocess
WHERE name LIKE 'ARC%' AND paddr <> '00';
-- アーカイブ送信状況 (Standby 含む)
SELECT dest_id, status, error, max_sequence
FROM v$archive_dest_status;
-- アーカイブ生成の遅延
SELECT thread#, MAX(sequence#) AS latest_seq
FROM v$log_history
GROUP BY thread#;
FAQ
Q: ARC が起動しているがアーカイブされない
A: v$archive_dest_status でエラーを確認。ディスク満杯、Standby 接続失敗、認証情報切れなどが代表的な原因です。
Q: NOARCHIVELOG モードで運用するメリットは?
A: 開発環境や検証環境では運用負荷が下がるメリットがありますが、本番では ポイントインタイムリカバリができない / Data Guard が構成できない ため必ず ARCHIVELOG にします。
Q: ARC をいくつ並列にすべき?
A: 目安として、1 つの ARC でログ生成量の 2 倍程度のコピー帯域を確保できる構成にし、ピーク時に追いつかない場合だけ増やします。デフォルト 4 で足りる現場が多いです。