Oracle はすべてのデータ変更をオンライン REDO ログに記録します。データベースがクラッシュした場合でも、REDO ログを適用してコミット済みトランザクションを復元できます(インスタンスリカバリ)。
REDO ログのサイズが小さすぎると ログスイッチが頻発してパフォーマンスが悪化し、多重化が不十分だと ファイル障害でデータが失われるリスクがあります。この記事では REDO ログの仕組みから管理手順まで実例で解説します。
この記事でわかること
- オンライン REDO ログの仕組み(グループ・メンバー・LGWR)
- V$LOG・V$LOGFILE で現在の状態を確認する方法
- ログスイッチの発生条件と手動切り替え(ALTER SYSTEM SWITCH LOGFILE)
- ロググループの追加・メンバーの追加による多重化(ミラーリング)
- ログファイルのサイズを変更する手順
- log file switch (checkpoint incomplete) などのアラートエラーへの対処
オンライン REDO ログの仕組み
オンライン REDO ログはグループ(Group)という単位で管理されます。各グループには同一内容を持つメンバー(Member)(ファイル)が1つ以上あり、LGWR(Log Writer)プロセスが全メンバーに同時書き込みします。
グループは ラウンドロビンで切り替わります:現在のグループが満杯になるとログスイッチが発生し、次のグループに切り替わります。切り替わったグループはチェックポイント完了後に再利用されます。
| グループのステータス | 説明 |
|---|---|
| CURRENT | 現在 LGWR が書き込み中のグループ |
| ACTIVE | インスタンスリカバリに必要(チェックポイント未完了) |
| INACTIVE | チェックポイント完了済み・アーカイブ済み(再利用可能) |
| UNUSED | まだ一度も使用されていないグループ |
V$LOG・V$LOGFILE で現在の状態を確認する
ロググループの状態を確認する(V$LOG)
-- グループ一覧と状態を確認
SELECT
group#,
members, -- グループ内のメンバー(ファイル)数
status, -- CURRENT / ACTIVE / INACTIVE / UNUSED
archived, -- アーカイブ済みか(YES/NO)
ROUND(bytes / 1024 / 1024, 0) AS size_mb, -- ファイルサイズ(MB)
sequence# -- ログシーケンス番号
FROM V$LOG
ORDER BY group#;
メンバー(ファイル)の場所を確認する(V$LOGFILE)
-- ログメンバーの実際のファイルパスを確認
SELECT
group#,
member, -- ファイルのフルパス
type, -- ONLINE(通常)または STANDBY
status -- NULL(正常)/ INVALID(読み込み不可)/ DELETED / STALE
FROM V$LOGFILE
ORDER BY group#, member;
-- グループとメンバーを結合して一覧表示
SELECT
l.group#,
l.status AS group_status,
ROUND(l.bytes / 1024 / 1024, 0) AS size_mb,
f.member AS file_path,
f.status AS member_status
FROM V$LOG l
JOIN V$LOGFILE f ON l.group# = f.group#
ORDER BY l.group#, f.member;
最低構成と推奨構成
Oracle は最低3グループ・各グループに2メンバー(別ディスク)の構成を推奨します。グループが2つだけだと、ACTIVE グループのチェックポイント完了を待つ間にジョブが止まることがあります。また、1メンバーのみだとファイル障害でデータが失われるリスクがあります。
Oracle は最低3グループ・各グループに2メンバー(別ディスク)の構成を推奨します。グループが2つだけだと、ACTIVE グループのチェックポイント完了を待つ間にジョブが止まることがあります。また、1メンバーのみだとファイル障害でデータが失われるリスクがあります。
ログスイッチの発生条件と手動切り替え
ログスイッチは以下のタイミングで発生します。
- 現在のグループが満杯になったとき
ALTER SYSTEM SWITCH LOGFILEで手動切り替えしたときALTER SYSTEM CHECKPOINTを実行したときALTER DATABASE BACKUP CONTROLFILEなどの特定の操作のとき
ログスイッチの発生頻度を確認する
-- 直近24時間のログスイッチ回数を時間帯ごとに確認
SELECT
TRUNC(first_time, 'HH') AS hour_start,
COUNT(*) AS switch_count
FROM V$LOG_HISTORY
WHERE first_time >= SYSDATE - 1
GROUP BY TRUNC(first_time, 'HH')
ORDER BY hour_start;
-- 目安: 30分に1回未満が理想。10分に1回以上はログサイズ不足の可能性
手動でログスイッチを行う
-- 手動ログスイッチ(ACTIVE グループを INACTIVE にしてから削除したい場合など) ALTER SYSTEM SWITCH LOGFILE; -- チェックポイントを実行(ACTIVE → INACTIVE に促す) ALTER SYSTEM CHECKPOINT; -- スイッチ後に状態を再確認 SELECT group#, status, archived FROM V$LOG ORDER BY group#;
ロググループ・メンバーの追加(多重化)
ロググループを追加する
-- 新しいロググループを追加する(グループ番号を指定しない場合は自動採番)
ALTER DATABASE ADD LOGFILE GROUP 4
('/oradata/redo04a.log', '/oradata2/redo04b.log') -- 2メンバーを別ディスクに
SIZE 500M;
-- グループ番号を指定しない書き方(Oracleが空き番号を割り当て)
ALTER DATABASE ADD LOGFILE
('/oradata/redo05a.log', '/oradata2/redo05b.log')
SIZE 500M;
既存グループにメンバーを追加する(多重化)
-- グループ1に2本目のメンバーを追加してミラーリングする ALTER DATABASE ADD LOGFILE MEMBER '/oradata2/redo01b.log' TO GROUP 1; -- 確認 SELECT group#, member, status FROM V$LOGFILE ORDER BY group#, member;
ログファイルのサイズを変更する手順
既存のログファイルのサイズは変更できません。サイズを変更するには「新しいサイズのグループを追加 → 古いグループを削除」という手順が必要です。
ログファイルのサイズを変更する手順(安全な方法)
-- ① 現在の状態を確認
SELECT group#, members, status, ROUND(bytes/1024/1024) AS mb FROM V$LOG ORDER BY group#;
-- 例: グループ1〜3 が 200MB で構成されている状態とする
-- ② 新しいサイズ(500MB)のグループを追加
ALTER DATABASE ADD LOGFILE GROUP 4 ('/oradata/redo04a.log') SIZE 500M;
ALTER DATABASE ADD LOGFILE GROUP 5 ('/oradata/redo05a.log') SIZE 500M;
ALTER DATABASE ADD LOGFILE GROUP 6 ('/oradata/redo06a.log') SIZE 500M;
-- ③ ログスイッチを繰り返して古いグループを INACTIVE にする
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM CHECKPOINT;
-- 状態を確認しながら繰り返す(グループ1〜3 が INACTIVE になるまで)
SELECT group#, status FROM V$LOG ORDER BY group#;
-- ④ INACTIVE になったら古いグループを削除
ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 2;
ALTER DATABASE DROP LOGFILE GROUP 3;
-- ⑤ 削除したグループのファイルを OS 上からも削除する(DB は削除しない)
-- rm /oradata/redo01.log など(OS コマンドで削除)
-- ⑥ 確認
SELECT group#, members, status, ROUND(bytes/1024/1024) AS mb FROM V$LOG ORDER BY group#;
CURRENT・ACTIVE グループは削除できない
ALTER DATABASE DROP LOGFILE GROUP n は、対象グループが INACTIVE または UNUSED のときのみ実行できます。CURRENT は削除不可、ACTIVE はチェックポイント完了(INACTIVE 化)後に削除できます。
アラートログのエラーと対処法
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
| log file switch (checkpoint incomplete) | ログスイッチは完了したが次のグループのチェックポイントが未完了。ログサイズが小さすぎる or I/O が遅い | ログファイルを大きくする(200MB → 500MB 以上が目安)。グループ数を増やす |
| log file switch (archiving needed) | ARCHIVELOGモードでアーカイブが追いつかず次のグループが使えない | アーカイブ先の容量確認。ARCHn プロセスの増設(LOG_ARCHIVE_MAX_PROCESSES) |
| cannot allocate new log, sequence | すべてのグループが ACTIVE で再利用できない | ログファイルを大きくする。チェックポイント間隔の設定見直し(FAST_START_MTTR_TARGET) |
| ORA-00350 | ログファイルのアーカイブが必要 | アーカイブログの書き出し先に空きを確保する |
ログスイッチの頻度をリアルタイムで確認する
-- 直近1時間のログスイッチが多い場合の診断
SELECT
TO_CHAR(first_time, 'YYYY-MM-DD HH24:MI') AS switch_time,
group#,
thread#,
sequence#
FROM V$LOG_HISTORY
WHERE first_time >= SYSDATE - 1/24 -- 直近1時間
ORDER BY first_time DESC;
-- 10分以内のスイッチが頻発している場合はログサイズを増やすことを検討
まとめ
- V$LOG:グループの状態(CURRENT/ACTIVE/INACTIVE)・サイズ・シーケンス番号を確認する
- V$LOGFILE:実際のファイルパスとメンバーの状態を確認する
- 多重化:各グループに2本以上のメンバーを別ディスクに配置して冗長性を確保する
- サイズ変更:「大きいグループを追加 → 古いグループを INACTIVE 化 → DROP」の手順で行う
- log file switch (checkpoint incomplete):ログサイズ不足が原因。500MB 以上を目安にサイズを拡大する
- log file switch (archiving needed):アーカイブ先の容量不足。ARCHn プロセスの増設で対処する
ログ書き込み待ちの待機イベント log file sync の原因と対処は待機イベント(Wait Events)完全ガイドを参照してください。容量不足の緊急対応全般は 容量不足緊急対応完全ガイドも参照してください。
