Every DBA knows that the size of their redo logs is very important. Too small, and the frequent log switches tie-up the LGWR, ARCH and DBWR background processes. Too large and you risk losing data during an instance crash.
As a general rule, you size your online redo logs not to switch more then 5 times per hour during peak DML times. Here is a script that measures redo log sizing and log switches.
Some things to consider with changing the size of online redologs:
You do it for performance reasons – mostly because your original files are too small and you get log switches too often
It is an Online Operation – no end user will even notice about it – apart from maybe better performance afterwards
You will not put your Database at risk with it – if you do it right :-)
Let me give you an example:
Current redo file information is as below:
Now , to get 100m sized logfiles and we want them mirrored[Multiplexing] for security reason. First, we create new log groups of the desired size:As a general rule, you size your online redo logs not to switch more then 5 times per hour during peak DML times. Here is a script that measures redo log sizing and log switches.
Some things to consider with changing the size of online redologs:
You do it for performance reasons – mostly because your original files are too small and you get log switches too often
It is an Online Operation – no end user will even notice about it – apart from maybe better performance afterwards
You will not put your Database at risk with it – if you do it right :-)
Let me give you an example:
Current redo file information is as below:
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
1 1 INACTIVE 50
2 1 INACTIVE 50
3 1 CURRENT 50
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ------------------------------------------------------------
3 /u01/app/oracle/oradata/orcl/redo03.log
2 /u01/app/oracle/oradata/orcl/redo02.log
1 /u01/app/oracle/oradata/orcl/redo01.log
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
1 1 INACTIVE 50
2 1 INACTIVE 50
3 1 CURRENT 50
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ------------------------------------------------------------
3 /u01/app/oracle/oradata/orcl/redo03.log
2 /u01/app/oracle/oradata/orcl/redo02.log
1 /u01/app/oracle/oradata/orcl/redo01.log
SQL> alter database add logfile
('/u01/app/oracle/oradata/orcl/redo_g4m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g4m2.rdo')
size 100m;
Database altered.
SQL> alter database add logfile
('/u01/app/oracle/oradata/orcl/redo_g5m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g5m2.rdo')
size 100m;
Database altered.
SQL> alter database add logfile
('/u01/app/oracle/oradata/orcl/redo_g6m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g6m2.rdo')
size 100m;
Database altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
1 1 INACTIVE 50
2 1 INACTIVE 50
3 1 CURRENT 50
4 2 UNUSED 100
5 2 UNUSED 100
6 2 UNUSED 100
6 rows selected.
('/u01/app/oracle/oradata/orcl/redo_g4m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g4m2.rdo')
size 100m;
Database altered.
SQL> alter database add logfile
('/u01/app/oracle/oradata/orcl/redo_g5m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g5m2.rdo')
size 100m;
Database altered.
SQL> alter database add logfile
('/u01/app/oracle/oradata/orcl/redo_g6m1.rdo',
'/u01/app/oracle/oradata/orcl/redo_g6m2.rdo')
size 100m;
Database altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
1 1 INACTIVE 50
2 1 INACTIVE 50
3 1 CURRENT 50
4 2 UNUSED 100
5 2 UNUSED 100
6 2 UNUSED 100
6 rows selected.
Here we are using suffix rdo as it is not so easy misinterpreted as a mere ascii textfile that can be deleted if space is needed.
Now we are going to drop the small files – with SQL commands first!
SQL> alter database drop logfile group 1;
Database altered.
That was easy, wasn’t it? Notice that the OS file is not gone yet – we have to delete them manually (if they are not OMF). All groups that have the status INACTIVE can be dropped that way.Database altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
2 1 INACTIVE 50
3 1 CURRENT 50
4 2 UNUSED 100
5 2 UNUSED 100
6 2 UNUSED 100
SQL> alter database drop logfile group 2;
Database altered.
If the status is CURRENT or ACTIVE, it won’t be possible to drop the group – you can do nothing wrong here!GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
2 1 INACTIVE 50
3 1 CURRENT 50
4 2 UNUSED 100
5 2 UNUSED 100
6 2 UNUSED 100
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database drop logfile group 3;
alter database drop logfile group 3
*
ERROR at line 1:
ORA-01623: log 3 is current log for instance orcl (thread 1) - cannot drop
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
SQL> alter system switch logfile;
System altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
3 1 ACTIVE 50
4 2 CURRENT 100
5 2 UNUSED 100
6 2 UNUSED 100
ACTIVE means, the checkpoint associated to the redo protocol in that group is not yet finished. It is in other words still needed for a possible instance recovery and cant be dropped therefore. But we can force the checkpoint:System altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
3 1 ACTIVE 50
4 2 CURRENT 100
5 2 UNUSED 100
6 2 UNUSED 100
SQL> alter system checkpoint;
System altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
3 1 INACTIVE 50
4 2 CURRENT 100
5 2 UNUSED 100
6 2 UNUSED 100
SQL> alter database drop logfile group 3;
Database altered.
Now we are finished with my SQL commands and we can continue with deleting the files of the small groups from the OS. The instance was OPEN all the time and no user was in any way concerned by this whole action. By the way, we mirrored the log groups to protect my database against really serious problems that would arise otherways, if a whole log group gets lost – for example because someone deletes a file from the OS.System altered.
SQL> select group#,members,status,bytes/1024/1024 as mb from v$log;
GROUP# MEMBERS STATUS MB
---------- ---------- ---------------- ----------
3 1 INACTIVE 50
4 2 CURRENT 100
5 2 UNUSED 100
6 2 UNUSED 100
SQL> alter database drop logfile group 3;
Database altered.
No comments:
Post a Comment