mercredi 11 février 2009

Redimensionner les journaux (redo log files)

Voici un script que j'ai créé pour me simplifier la vie lorsque je veux redimensionner les journaux (redo logs). Vous pouvez l'exécuter sans crainte car il n'exécute aucune commande qui modifiera les fichiers. Ce script bâtit tout simplement les commandes à exécuter ultérieurement pour redimensionner les redo log files :

set define on wrap on numwidth 12 serveroutput on
set pagesize 999 termout on arraysize 2 linesize 2000
Accept vTailRedo prompt 'Taille (en Mbytes) des Redolog (Nul=20M): ' default 20

Declare
vTailRedo number := &&vTailRedo; -- Taille (en Mbytes) des redo files

vLigne varchar2(4000);
vCommt varchar2(20);
vMember varchar2(4000);

Cursor cur_log is
Select i.instance_name,l.group#,l.thread#,l.status,

round((l.bytes/1024/1024),0) taill
from v$log l, v$instance i
order by l.thread#, l.group#;

Cursor cur_member(pNoGroup Number) is
Select rownum,l.group#,l.member
from v$logfile l
where l.group# = pNoGroup
order by l.group#,l.member;

Begin
dbms_output.put_line('-- ****************************');
dbms_output.put_line('-- Redimensionner les redo logs');
dbms_output.put_line('-- ****************************');
dbms_output.put_line('-- => Le statut du redolog file doit être INACTIF');
dbms_output.put_line(chr(10));
For i in cur_log
-- Extraire les groupes
Loop
dbms_output.put_line('-- Thread/Groupe # 'i.thread#'/'i.group#

' => Status: 'i.status
' => Taille actuelle : 'i.taill'M');
if vTailRedo = i.taill then
vCommt := '-- ';
else
vCommt := null;
end if;
vLigne := vCommt'Alter database drop logfile group 'i.group#';'chr(10)
vCommt'Alter database 'chr(10)
vCommt' add logfile thread 'i.thread#

' group 'i.group#' (';
For J in cur_member(i.group#)
-- Extraire les membres du groupe
Loop
if j.rownum > 1 then
vLigne := vLigne', ';
end if;
-- Vérifier si ASM est utilisé
if substr(j.member,1,1) = '+' then
vMember:= substr(j.member,1,(instr(j.member,'/',1)-1));
else
vMember := j.member;
end if;
vLigne := vLigne''''vMember'''';
End loop;
vLigne := vLigne') size 'vTailRedo'M reuse;';
dbms_output.put_line(vLigne);
dbms_output.put_line(chr(10));
vLigne := null;
End loop;
dbms_output.put_line('-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
dbms_output.put_line('Commandes à effectuer pour changer le REDO'

' Log active/courant');
dbms_output.put_line('-- Pour forcer le switch de groupe de redo log :');
dbms_output.put_line('ALTER SYSTEM SWITCH LOGFILE;');
dbms_output.put_line('-- Archiver le redo courant et activer le suivant');
dbms_output.put_line('ALTER SYSTEM CHECKPOINT;');
End;
/

3 commentaires:

  1. Dear Eric

    Thank You for your script
    So, I find an error :

    I replaced :
    Cursor cur_member(pNoGroup Number) is
    Select rownum,l.group#,l.member
    from v$logfile l
    where l.group# = pNoGroup
    order by l.group#,l.member;
    by

    Cursor cur_member(pNoGroup Number) is
    Select rownum,l.group#,l.member
    from v$logfile l
    where l.group# = pNoGroup
    order by rownum;

    because sometimes rownum=1 is not always the first line and so the genration is not good.

    RépondreEffacer
  2. I post the new script, I take into consideration the OMF usage.

    set define on wrap on numwidth 12 serveroutput on
    set pagesize 999 termout on arraysize 2 linesize 2000
    Accept vTailRedo prompt 'Taille (en Mbytes) des Redolog (Nul=100M): ' default 100

    Declare
    vTailRedo number := &&vTailRedo; -- Taille (en Mbytes) des redo files

    vLigne1 varchar2(4000);
    vLigne2 varchar2(4000);
    vCommt varchar2(20);
    vMember varchar2(4000);

    Cursor cur_log is
    Select i.instance_name,l.group#,l.thread#,l.status,
    round((l.bytes/1024/1024),0) taill
    from v$log l, v$instance i
    order by l.thread#, l.group#;

    Cursor cur_member(pNoGroup Number) is
    Select rownum,l.group#,l.member
    from v$logfile l
    where l.group# = pNoGroup
    order by l.group#,l.member;

    Begin
    dbms_output.put_line('-- ****************');
    dbms_output.put_line('-- Resize redo logs');
    dbms_output.put_line('-- ****************');
    dbms_output.put_line('-- => Redolog file Status must be INACTIF');
    dbms_output.put_line(chr(10));
    For i in cur_log
    -- Extraire les groupes
    Loop
    dbms_output.put_line('-- Thread/Groupe # ' ||i.thread#||'/'||i.group#||'=> Status: '||i.status||' => Taille actuelle : '||i.taill||'M');
    if vTailRedo = i.taill then
    vCommt := '-- ';
    else
    vCommt := null;
    end if;
    vLigne1 := vCommt || 'Alter database drop logfile group ' ||i.group#||';' ||chr(10) || 'Alter database ' ||chr(10) || ' add logfile thread ' ||i.thread# ||' group ' || i.group# || ' (';
    vLigne2 := 'Alter database add logfile thread ' ||i.thread# ||' group ' || i.group# || ' size '||vTailRedo||'M ;';

    For J in cur_member(i.group#)
    -- Extraire les membres du groupe
    Loop
    if j.rownum > 1 then
    vLigne1 := vLigne1 || ', ';
    end if;
    -- Vérifier si ASM est utilisé
    if substr(j.member,1,1) = '+' then
    vMember:= substr(j.member,1,(instr(j.member,'/',1)-1));
    else
    vMember := j.member;
    end if;
    vLigne1 := vLigne1||''''||vMember||'''';
    End loop;
    vLigne1 := vLigne1 ||') size '||vTailRedo||'M reuse;';
    dbms_output.put_line(vLigne1);
    dbms_output.put_line(chr(10));
    dbms_output.put_line(' If you use OMF : ');
    dbms_output.put_line(vLigne2);
    dbms_output.put_line(chr(10));
    vLigne1 := null;
    End loop;
    dbms_output.put_line('-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
    dbms_output.put_line('Commandes à effectuer pour changer le REDO Log active/courant');
    dbms_output.put_line('-- Pour forcer le switch de groupe de redo log :');
    dbms_output.put_line('ALTER SYSTEM SWITCH LOGFILE;');
    dbms_output.put_line('-- Archiver le redo courant et activer le suivant');
    dbms_output.put_line('ALTER SYSTEM CHECKPOINT;');
    End;
    /

    RépondreEffacer
  3. Thank you so much Thierry for sharing your script !

    RépondreEffacer