すでにデータベースを運用しているけど、後からREDOログのサイズって変更できるのかな?
結論から言うと、既存のREDOログサイズの変更はできないため、新たにREDOロググループを作成し、既存のREDOロググループを削除し入れ替える必要がある。
以下が大まかな流れ。
- ロググループ番号 1, 2, 3 がすでに存在していると想定
- 新たに 4, 5, 6 グループを作成
- グループ 1, 2, 3を削除
新規ロググループの追加
まずは新しいロググループを追加する。
alter database <DB名> add logfile group <番号> '<ファイル名>' size <サイズ>M;
実行例
SQL> alter database orcl add logfile group 4 '/u01/app/orcl/oradata/orcl/redo04.log' size 100M;
データベースが変更されました。
SQL> alter database orcl add logfile group 5 '/u01/app/orcl/oradata/orcl/redo05.log' size 100M;
データベースが変更されました。
SQL> alter database orcl add logfile group 6 '/u01/app/orcl/oradata/orcl/redo06.log' size 100M;
データベースが変更されました。
作成したグループに新しいログメンバーの追加
新しいロググループ 4, 5, 6 にログメンバーを追加する。
alter database <DB名> add logfile member '<ファイル名>' to group <番号>;
実行例
SQL> alter database add logfile member '/u01/app/orcl/oradata/orcl/redo04_2.log' to group 4;
データベースが変更されました。
SQL> alter database add logfile member '/u01/app/orcl/oradata/orcl/redo05_2.log' to group 5;
データベースが変更されました。
SQL> alter database add logfile member '/u01/app/orcl/oradata/orcl/redo06_2.log' to group 6;
データベースが変更されました。
REDOログの状態確認
追加したロググループとメンバーが出力されることを確認する。
set lines 1000
set pages 1000
col member for a50
select l.group#,l.members,f.member, l.sequence#,l.bytes/1024/1024 MB,l.archived,l.status from v$log l,v$logfile f where l.group# = f.group# order by l.group#;
実行例
SQL> set lines 1000
SQL> set pages 1000
SQL> col member for a50
SQL> select l.group#,l.members,f.member, l.sequence#,l.bytes/1024/1024 MB,l.archived,l.status from v$log l,v$logfile f where l.group# = f.group# order by l.group#;
GROUP# MEMBERS MEMBER SEQUENCE# MB ARC STATUS
---------- ---------- -------------------------------------------------- ---------- ---------- --- ----------------
1 2 /u01/app/orcl/oradata/orcl/redo01_2.log 235 50 YES INACTIVE
1 2 /u01/app/orcl/oradata/orcl/redo01.log 235 50 YES INACTIVE
2 2 /u01/app/orcl/oradata/orcl/redo02.log 236 50 YES INACTIVE
2 2 /u01/app/orcl/oradata/orcl/redo02_2.log 236 50 YES INACTIVE
3 2 /u01/app/orcl/oradata/orcl/redo03_2.log 237 50 NO CURRENT
3 2 /u01/app/orcl/oradata/orcl/redo03.log 237 50 NO CURRENT
4 1 /u01/app/orcl/oradata/orcl/redo04.log 0 100 YES UNUSED
5 1 /u01/app/orcl/oradata/orcl/redo05.log 0 100 YES UNUSED
6 1 /u01/app/orcl/oradata/orcl/redo06.log 0 100 YES UNUSED
9行が選択されました。
ログスイッチを実行
追加したロググループが CURRENT となるまでログスイッチを実行する。
alter system switch logfile;
実行例
SQL> alter system switch logfile;
システムが変更されました。
SQL> select l.group#,l.members,f.member, l.sequence#,l.bytes/1024/1024 MB,l.archived,l.status from v$log l,v$logfile f where l.group# = f.group# order by l.group#;
GROUP# MEMBERS MEMBER SEQUENCE# MB ARC STATUS
---------- ---------- -------------------------------------------------- ---------- ---------- --- ----------------
1 2 /u01/app/orcl/oradata/orcl/redo01_2.log 241 50 YES INACTIVE
1 2 /u01/app/orcl/oradata/orcl/redo01.log 241 50 YES INACTIVE
2 2 /u01/app/orcl/oradata/orcl/redo02.log 242 50 YES INACTIVE
2 2 /u01/app/orcl/oradata/orcl/redo02_2.log 242 50 YES INACTIVE
3 2 /u01/app/orcl/oradata/orcl/redo03_2.log 243 50 YES ACTIVE
3 2 /u01/app/orcl/oradata/orcl/redo03.log 243 50 YES ACTIVE
4 1 /u01/app/orcl/oradata/orcl/redo04.log 244 100 YES ACTIVE
5 1 /u01/app/orcl/oradata/orcl/redo05.log 245 100 NO CURRENT ★
6 1 /u01/app/orcl/oradata/orcl/redo06.log 240 100 YES INACTIVE
9行が選択されました。
既存のロググループを削除
古いロググループ 1, 2, 3 を削除していく。
alter database <DB名> drop logfile group <番号>;
実行例
SQL> alter database orcl drop logfile group 1;
データベースが変更されました。
SQL> alter database orcl drop logfile group 2;
データベースが変更されました。
SQL> alter database orcl drop logfile group 3;
alter database orcl drop logfile group 3
*
行1でエラーが発生しました。:
ORA-01624: ログ3はインスタンスorcl(スレッド1)のクラッシュ・リカバリに必要です。 ORA-00312: オンライン・ログ3
スレッド1: '/u01/app/orcl/oradata/orcl/redo03.log'
ORA-00312: オンライン・ログ3 スレッド1: '/u01/app/orcl/oradata/orcl/redo03_2.log'
SQL> select l.group#,l.members,f.member, l.sequence#,l.bytes/1024/1024 MB,l.archived,l.status from v$log l,v$logfile f where l.group# = f.group# order by l.group#;
GROUP# MEMBERS MEMBER SEQUENCE# MB ARC STATUS
---------- ---------- -------------------------------------------------- ---------- ---------- --- ----------------
3 2 /u01/app/orcl/oradata/orcl/redo03.log 243 50 YES ACTIVE ★!!!!
3 2 /u01/app/orcl/oradata/orcl/redo03_2.log 243 50 YES ACTIVE
4 1 /u01/app/orcl/oradata/orcl/redo04.log 244 100 YES ACTIVE
5 1 /u01/app/orcl/oradata/orcl/redo05.log 245 100 NO CURRENT
6 1 /u01/app/orcl/oradata/orcl/redo06.log 240 100 YES INACTIVE
エラー発生!?
もし ORA-01624 や ORA-00312 エラーが発生した場合、以下コマンドを使ってステータスを INACTIVE にしよう
alter system checkpoint;
古いロググループが削除されたか確認
前述した REDO ログ状況の確認コマンドを使って、希望通りの状態となっているかを確認する。
実行例
SQL> select l.group#,l.members,f.member, l.sequence#,l.bytes/1024/1024 MB,l.archived,l.status from v$log l,v$logfile f where l.group# = f.group# order by l.group#;
GROUP# MEMBERS MEMBER SEQUENCE# MB ARC STATUS
---------- ---------- -------------------------------------------------- ---------- ---------- --- ----------------
4 2 /u01/app/orcl/oradata/orcl/redo04_2.log 244 100 YES INACTIVE
4 2 /u01/app/orcl/oradata/orcl/redo04.log 244 100 YES INACTIVE
5 2 /u01/app/orcl/oradata/orcl/redo05.log 245 100 NO CURRENT
5 2 /u01/app/orcl/oradata/orcl/redo05_2.log 245 100 NO CURRENT
6 2 /u01/app/orcl/oradata/orcl/redo06.log 240 100 YES INACTIVE
6 2 /u01/app/orcl/oradata/orcl/redo06_2.log 240 100 YES INACTIVE