OracleでREDOログのサイズを大きくする手順とログスイッチの最適化

Redo/アーカイブログ

Oracleデータベースでは、REDOログのサイズが小さいとログスイッチが頻繁に発生し、性能や可用性に悪影響を与えることがあります。
この記事では、REDOログを大きくする安全な手順と、ログスイッチ頻度の目安を解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


🔍 REDOログとログスイッチとは?

REDOログは、データベース変更の履歴(トランザクションログ)を記録するファイルです。
Oracleは順番にログを切り替えて使用し、この切り替えをログスイッチ(Log Switch)と呼びます。


✅ ログスイッチの推奨頻度

ログスイッチが多すぎると以下の問題が発生します。

  • チェックポイント多発によるI/O負荷増加
  • アーカイブログ生成の遅延
  • RMANバックアップ処理の負荷増大

🔸推奨頻度:1時間に1〜2回


📊 ログスイッチ頻度の確認SQL

SELECT
TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24') AS HOUR,
COUNT(*) AS SWITCH_COUNT
FROM
V$LOG_HISTORY
WHERE
FIRST_TIME > SYSDATE - 1
GROUP BY
TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24')
ORDER BY
HOUR;
SQL> SELECT
2 TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24') AS HOUR,
3 COUNT(*) AS SWITCH_COUNT
4 FROM
5 V$LOG_HISTORY
6 WHERE
7 FIRST_TIME > SYSDATE - 1
8 GROUP BY
9 TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24')
10 ORDER BY
11 HOUR;

HOUR SWITCH_COUNT
------------- ------------
2025-11-19 17 1
2025-11-19 18 2
2025-11-19 19 3
2025-11-19 20 1

📌 現在のREDOログ情報の確認

REDOログのサイズ・状態・メンバー数を確認

SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;
SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ---------------- ---------- ----------
1 CURRENT 200 1
2 INACTIVE 200 1
3 ACTIVE 200 1

REDOログの物理パスを確認

SELECT GROUP#, MEMBER FROM V$LOGFILE ORDER BY GROUP#;
SQL> SELECT GROUP#, MEMBER FROM V$LOGFILE ORDER BY GROUP#;

GROUP# MEMBER
---------- ----------------------------------------
1 /u01/app/oracle/oradata/ORCL/redo01.log
2 /u01/app/oracle/oradata/ORCL/redo02.log
3 /u01/app/oracle/oradata/ORCL/redo03.log

🛠 REDOログサイズを大きくする手順

🔸REDOログサイズは直接変更できないため、以下の流れで対応します:

  1. 新しい大きなサイズのロググループを追加
  2. ログスイッチを実行して現在のロググループを退避
  3. 古いロググループを削除
  4. 不要になったログファイルをOS上で削除

1. 新しいロググループの追加(例:1GB)

ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/app/oracle/oradata/ORCL/redo04.log' SIZE 1G;
ALTER DATABASE ADD LOGFILE GROUP 5 '/u01/app/oracle/oradata/ORCL/redo05.log' SIZE 1G;
ALTER DATABASE ADD LOGFILE GROUP 6 '/u01/app/oracle/oradata/ORCL/redo06.log' SIZE 1G;

2. 削除対象グループの状態確認

SELECT GROUP#, STATUS FROM V$LOG ORDER BY GROUP#;

❗削除不可なSTATUS:

  • CURRENT(現在使用中)
  • ACTIVEかつクラッシュリカバリに必要なもの

3. 状態がACTIVEで削除できない場合の対応

ALTER DATABASE DROP LOGFILE GROUP 2;

🔻エラーになる場合:

ORA-01624: ログ2はインスタンスのクラッシュ・リカバリに必要です。

✅ 削除できるようにするための手順

✅ 手順①:チェックポイントを発行

ALTER SYSTEM CHECKPOINT;

✅ 手順②:ログスイッチを複数回実行

ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE;

これにより、CURRENTが他のグループに移動し、GROUP 2がINACTIVEになる可能性があります。

✅ 手順③:再確認

SELECT GROUP#, STATUS FROM V$LOG ORDER BY GROUP#;

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

✅ 手順④:削除実行

ALTER DATABASE DROP LOGFILE GROUP 2;
SQL> set lin 1000 pages 1000
SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
1 ACTIVE 200 1
2 CURRENT 200 1
3 INACTIVE 200 1

SQL> col member for a50
SQL> SELECT GROUP#, MEMBER FROM V$LOGFILE ORDER BY GROUP#;

GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/V19/redo01.log
2 /u01/app/oracle/oradata/V19/redo02.log
3 /u01/app/oracle/oradata/V19/redo03.log

SQL> ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/app/oracle/oradata/V19/redo04.log' SIZE 1G;

データベースが変更されました。

SQL> ALTER DATABASE ADD LOGFILE GROUP 5 '/u01/app/oracle/oradata/V19/redo05.log' SIZE 1G;

データベースが変更されました。

SQL> ALTER DATABASE ADD LOGFILE GROUP 6 '/u01/app/oracle/oradata/V19/redo06.log' SIZE 1G;

データベースが変更されました。

SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
1 INACTIVE 200 1
2 CURRENT 200 1
3 INACTIVE 200 1
4 UNUSED 1024 1
5 UNUSED 1024 1
6 UNUSED 1024 1

6行が選択されました。

SQL> ALTER SYSTEM SWITCH LOGFILE;

システムが変更されました。

SQL> ALTER SYSTEM SWITCH LOGFILE;

システムが変更されました。

SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
1 INACTIVE 200 1
2 ACTIVE 200 1 ★アクティブ
3 INACTIVE 200 1
4 ACTIVE 1024 1
5 CURRENT 1024 1 ★カレント
6 UNUSED 1024 1

6行が選択されました。

SQL> ALTER DATABASE DROP LOGFILE GROUP 1;

データベースが変更されました。

SQL> ALTER DATABASE DROP LOGFILE GROUP 2; ★エラー
ALTER DATABASE DROP LOGFILE GROUP 2
*
行1でエラーが発生しました。:
ORA-01624: ログ2はインスタンスv19(スレッド1)のクラッシュ・リカバリに必要です。 ORA-00312: オンライン・ログ2
スレッド1: '/u01/app/oracle/oradata/V19/redo02.log'


SQL> ALTER SYSTEM SWITCH LOGFILE;

システムが変更されました。

SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
2 ACTIVE 200 1 ★ログスイッチしても変わらない
3 INACTIVE 200 1
4 ACTIVE 1024 1
5 ACTIVE 1024 1
6 CURRENT 1024 1

SQL> ALTER SYSTEM CHECKPOINT; ★チェックポイントを発行

システムが変更されました。

SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
2 INACTIVE 200 1 ★インアクティブに変わる
3 INACTIVE 200 1
4 INACTIVE 1024 1
5 INACTIVE 1024 1
6 CURRENT 1024 1

SQL> ALTER DATABASE DROP LOGFILE GROUP 2; ★削除できた

データベースが変更されました。

SQL> ALTER DATABASE DROP LOGFILE GROUP 3;

データベースが変更されました。

SQL> SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB, MEMBERS FROM V$LOG;

GROUP# STATUS SIZE_MB MEMBERS
---------- ------------------------------------------------ ---------- ----------
4 INACTIVE 1024 1
5 INACTIVE 1024 1
6 CURRENT 1024 1

💡 補足:それでも削除できない場合

一度データベースを再起動することでクラッシュリカバリの対象がクリアされ、削除可能になるケースがあります。

SHUTDOWN IMMEDIATE;
STARTUP;

再起動後に再度状態を確認し、DROPを実行してください。


4. 不要になったログファイルの削除(OSレベル)

rm -f /u01/app/oracle/oradata/ORCL/redo01.log
rm -f /u01/app/oracle/oradata/ORCL/redo02.log
...

V$LOGFILEで確認したパスを参照してください。


5. 冗長性のためにメンバーを追加(本番推奨)

ALTER DATABASE ADD LOGFILE MEMBER '/u02/oracle/oradata/ORCL/redo04b.log' TO GROUP 4;

✅ 作業手順まとめ表

ステップ実施内容コマンド例
1新しいロググループ追加ALTER DATABASE ADD LOGFILE ...
2チェックポイント実行ALTER SYSTEM CHECKPOINT;
3ログスイッチ複数回ALTER SYSTEM SWITCH LOGFILE;
4グループの状態確認SELECT GROUP#, STATUS FROM V$LOG;
5INACTIVEならDROP実行ALTER DATABASE DROP LOGFILE GROUP n;
6OS上のログファイル削除(任意)rm -f redo0n.log

🏁 まとめ

  • REDOログのサイズ拡張には「追加→スイッチ→削除」の流れが必要
  • ACTIVECURRENTのログは直接削除できないため、ログスイッチとチェックポイントが鍵
  • ログスイッチ頻度は1時間に1~2回がOracle社の推奨
  • 状況に応じてDB再起動でクリアされるリカバリ要件もあり


[参考]
9 REDOログの管理

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました