The following demonstration shows how to resize the online redo log files in an oracle database.
The query below gives the size of all the online redo log files which is 250MB.
SQL> SELECT a.group#, a.member, b.bytes FROM v$logfile a, v$log b WHERE a.group# = b.group#;
GROUP# MEMBER BYTES
---------- -------------------------------------------------- ----------
1 /fs02/oradata/demo/demo_redo1a.log 262144000
1 /fs03/oradata/demo/demo_redo1b.log 262144000
1 /fs04/oradata/demo/demo_redo1c.log 262144000
2 /fs02/oradata/demo/demo_redo2a.log 262144000
2 /fs03/oradata/demo/demo_redo2b.log 262144000
2 /fs04/oradata/demo/demo_redo2c.log 262144000
3 /fs02/oradata/demo/demo_redo3a.log 262144000
3 /fs03/oradata/demo/demo_redo3b.log 262144000
3 /fs04/oradata/demo/demo_redo3c.log 262144000
9 rows selected.
Check the status of the log group.
SQL> select group#, status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 INACTIVE
Now force a log switch until the last redo log is marked "CURRENT" by issuing the following command:
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select group#, status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 INACTIVE
3 CURRENT
Drop the first logfile group and recreate the same with the desired size, in this case 512MB
SQL> alter database drop logfile group 1;
Database altered.
or
SQL> alter database drop logfile group 1;
ALTER DATABASE DROP LOGFILE GROUP 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of instance ORA920 (thread 1)
ORA-00312: online log 1 thread 1: '<file_name>'
Nothing to panic here and this is an easy problem to resolve. Simply perform a checkpoint on the database and try to drop again.
SQL> alter system checkpoint global;
System altered.
SQL> alter database drop logfile group 1;
Database altered.
---------------------------------------------------------------------------------------------------
Re-create the dropped redo log group with different size
alter database add logfile group 1 (
'/fs02/oradata/demo/demo_redo1a.log',
'/fs03/oradata/demo/demo_redo1b.log',
'/fs04/oradata/demo/demo_redo1c.log') size 500m reuse;
After re-creating the online redo log group, force a log switch. The online redo log group just created should become the "CURRENT" one.
SQL> select group#, status from v$log;
GROUP# STATUS
---------- ----------------
1 UNUSED
2 INACTIVE
3 CURRENT
SQL> alter system switch logfile;
SQL> select group#, status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 ACTIVE
Do the same for all the logfiles.
alter database add logfile group 2 (
'/fs02/oradata/demo/demo_redo2a.log',
'/fs03/oradata/demo/demo_redo2b.log',
'/fs04/oradata/demo/demo_redo2c.log') size 500m reuse;
alter database add logfile group 3 (
'/fs02/oradata/demo/demo_redo3a.log',
'/fs03/oradata/demo/demo_redo3b.log',
'/fs04/oradata/demo/demo_redo3c.log') size 500m reuse;
Now, if you check the sizes of the logfiles you can see the size increased.
SQL> SELECT a.group#, a.member, b.bytes FROM v$logfile a, v$log b WHERE a.group# = b.group#;
GROUP# MEMBER BYTES
---------- -------------------------------------------------- ----------
1 /fs02/oradata/demo/demo_redo1a.log 524288000
1 /fs03/oradata/demo/demo_redo1b.log 524288000
1 /fs04/oradata/demo/demo_redo1c.log 524288000
2 /fs02/oradata/demo/demo_redo2a.log 524288000
2 /fs03/oradata/demo/demo_redo2b.log 524288000
2 /fs04/oradata/demo/demo_redo2c.log 524288000
3 /fs02/oradata/demo/demo_redo3a.log 524288000
3 /fs03/oradata/demo/demo_redo3b.log 524288000
3 /fs04/oradata/demo/demo_redo3c.log 524288000
9 rows selected.
Mission accomplished. :-)