quinta-feira, 17 de maio de 2012

Redimensionamento ou recriando os arquivos de “Redo Log”


Neste artigo, irei demonstrar como redimensionar os arquivos de “redo logs”, neste exemplo os arquivos de “redo logs” serão redimensionados de 100 MB para 250 MB.


Porém, antes vamos verificar os grupos existentes no banco de dados e seus respectivos tamanhos.


SQL> SELECT a.group#, a.member, b.bytes
  2  FROM v$logfile a, v$log b 
  3  WHERE a.group# = b.group#;


    GROUP# MEMBER                        BYTES
---------- ----------------------------- ------------
         1 /u03/oradata/redo_g01a.log     104,857,600
         1 /u04/oradata/redo_g01b.log     104,857,600
         1 /u05/oradata/redo_g01c.log     104,857,600
         2 /u03/oradata/redo_g02a.log     104,857,600
         2 /u04/oradata/redo_g02b.log     104,857,600
         2 /u05/oradata/redo_g02c.log     104,857,600
         3 /u03/oradata/redo_g03a.log     104,857,600
         3 /u04/oradata/redo_g03b.log     104,857,600
         3 /u05/oradata/redo_g03c.log     104,857,600


9 rows selected.




Agora vamos verificar os passos para redimensionar ou recriar todos os grupos de “redo log”:


1. Verificar o status do grupo de “redo log”


Deve-se forçar um “switch” do “redo log” até que o último "redo log" permaneça marcado com o status de “CURRENT”, para executar esse passo usar o comando abaixo:


Verificação dos status dos grupos de “redo logs”.


SQL> select group#, status from v$log;


    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE




Execução do “switch” dos “redo logs”.


SQL> alter system switch logfile;


SQL> alter system switch logfile;




Nova verificação dos status dos grupos de “redo logs”.


SQL> select group#, status from v$log;


    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 CURRENT


2. Remover o primeiro grupo de "redo log"


Depois de fazer o “switch” dos grupos de “redo logs”, já poderemos remover o primeiro grupo, para execução desta tarefa usar:




SQL> alter database drop logfile group 1;


Database altered.


NOTA: Algumas vezes, durante o processo de remoção o grupo de “redo log” poderá apresentar a mensagem de erro abaixo:


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 tests (thread 1)
ORA-00312: online log 1 thread 1: ''


Isso poderá ocorrer porque o banco de dados não realizou um “checkpoint” automaticamente para liberar os grupos de “redo logs”.


Para resolver o problema, deve-se executar manualmente um “checkpoint” no banco de dados para que o “redo log” possa ser liberado para remoção, usando o comando abaixo:


SQL> ALTER SYSTEM CHECKPOINT GLOBAL;


3. Recriar o grupo de “redo log” que foi removido


Para recriar o grupo de “redo log” com o tamanho de 250 MB, deve-se executar o comando abaixo:


SQL> alter database add logfile group 1 (
  2  '/u03/oradata/redo_g01a.log',  
  3  '/u04/oradata/redo_g01b.log',
  4  '/u05/oradata/redo_g01c.log') size 250m reuse;


Database altered.


4. Forçar um novo “switch” no “redo log”


Depois de recriar o grupo, deve-se forçar um “switch” do “redo log”. O grupo de “redo log” que acabou de ser criado deverá apresentar o status “CURRENT”.


Verificação dos status dos grupos de “redo logs”, nesta verificação nota-se que o grupo 1 de “redo log”, ainda está com o status “UNUSED”, isso se deve porque esse grupo ainda não foi utilizado pelo banco de dados.


SQL> select group#, status from v$log;


    GROUP# STATUS
---------- ----------------
         1 UNUSED
         2 INACTIVE
         3 CURRENT




Execução do “switch” dos “redo logs”.


SQL> alter system switch logfile;




Nova verificação dos status dos grupos de “redo logs”.


SQL> select group#, status from v$log;


    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 ACTIVE


5. Continue a executar os passos de (1 a 4) até que todos os “redo logs” tenham sido recriados.


Após a recriação de um grupo de “redo log”, continue a recriar (ou redimensionar) todos os grupos de “redo logs” até que todos os grupos sejam recriados, na sequência deve-se revalidar os novos tamanhos dos “redo logs”.


SQL> SELECT a.group#, a.member, b.bytes
  2    FROM v$logfile a, v$log b 
  3   WHERE a.group# = b.group#;


    GROUP# MEMBER                         BYTES
---------- ------------------------------ ------------
         1 /u03/oradata/redo_g01a.log     262,144,000
         1 /u04/oradata/redo_g01b.log     262,144,000
         1 /u05/oradata/redo_g01c.log     262,144,000
         2 /u03/oradata/redo_g02a.log     262,144,000
         2 /u04/oradata/redo_g02b.log     262,144,000
         2 /u05/oradata/redo_g02c.log     262,144,000
         3 /u03/oradata/redo_g03a.log     262,144,000
         3 /u04/oradata/redo_g03b.log     262,144,000
         3 /u05/oradata/redo_g03c.log     262,144,000


9 rows selected.




Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com