Oracle Database - Recriando Redolog files
Olá pessoal, nesse post vou mostrar como recriar os Redologs de acordo com o workload do Banco de dados Oracle, a recriação pode ser necessária em casos onde o ambiente foi criado pensando em uma carga X mas em ambientes de produção sabemos que picos, e cargas Y fora do comum podem acontecer e um dos sintomas de que os Redologs estão mal dimensionados são as ocorrências do evento de espera Log File Sync, onde temos commits frequentes e Redologs muito pequenos. Em ambientes onde os Online Redologs são muito pequenos, os log switches são muito frequentes, o que pode ocasionar um atraso na escrita dos dados de redo para os arquivos, aumentando assim o tempo de wait de Log File Sync. Geralmente neste cenário podemos identificar outros wait events acontecendo no banco, como o Log File Switch Completion e o Log File Switch (Checkpoint Incomplete).
Para esse laboratório vou realizar alguns switchs de redo para simular um pico de geração de redos fora do comum, o numero ideal de switchs é: 1 switch a cada 12 minutos em média, oque nos dá um total de 5 switchs por hora na média, qualquer número a mais do que isso pode ser um desvio, um caso isolado durante o dia não chega a ser um problema, mas várias horas no dia com picos acima de 5 deve ser observado e monitorado, recomendo olhar os últimos 30 dias ou os últimos 2 meses para identificar padrões, cargas especificas atividades pontuais que são executadas pela operação, tudo isso pode te ajudar a identificar se de fato temos um problema ou se estamos falando de um evento isolado.
1- Executando os switchs para simular uma carga de alterações
SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> / / System altered. SQL> / System altered. SQL> System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> ...
OBS: Se o ambiente for Multitenant, execute o switch e os demais comandos apresentados nesse post no CDB.
Abaixo temos a métrica dos últimos dias do meu ambiente:
Script:
-- ######################################################################################################## -- -- -- File Name : info_redo.sql -- -- Description : Displays info about redo generation - matriz -- -- Comments : N/A -- -- Requirements : Access to the V$ views. -- -- Call Syntax : @info_redo -- -- Last Modified : 05/07/2024 -- -- Author : Pedro Vido - https://pedrovidodba.blogspot.com -- -- -- -- ######################################################################################################## set heading off; set feedback off; prompt prompt select '-----------------------------' from dual; select ' REDO - MAPA DE GERACAO ' from dual; select '-----------------------------' from dual; prompt prompt set heading on; set feedback on; set lines 9999 column dt format a8 heading 'DATE' column t1 format a4 heading 00h column t2 format a4 heading 01h column t3 format a4 heading 02h column t4 format a4 heading 03h column t5 format a4 heading 04h column t6 format a4 heading 05h column t7 format a4 heading 06h column t8 format a4 heading 07h column t9 format a4 heading 08h column t10 format a4 heading 09h column t11 format a4 heading 10h column t12 format a4 heading 11h column t13 format a4 heading 12h column t14 format a4 heading 13h column t15 format a4 heading 14h column t16 format a4 heading 15h column t17 format a4 heading 16h column t18 format a4 heading 17h column t19 format a4 heading 18h column t20 format a4 heading 19h column t21 format a4 heading 20h column t22 format a4 heading 21h column t23 format a4 heading 22h column t24 format a4 heading 23h column tt format a5 heading TOTAL select to_char(first_time,'yyyymmdd') dt, decode(sum(decode(to_char(first_time,'hh24'),'00',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'00',1,0))) t1, decode(sum(decode(to_char(first_time,'hh24'),'01',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'01',1,0))) t2, decode(sum(decode(to_char(first_time,'hh24'),'02',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'02',1,0))) t3, decode(sum(decode(to_char(first_time,'hh24'),'03',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'03',1,0))) t4, decode(sum(decode(to_char(first_time,'hh24'),'04',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'04',1,0))) t5, decode(sum(decode(to_char(first_time,'hh24'),'05',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'05',1,0))) t6, decode(sum(decode(to_char(first_time,'hh24'),'06',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'06',1,0))) t7, decode(sum(decode(to_char(first_time,'hh24'),'07',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'07',1,0))) t8, decode(sum(decode(to_char(first_time,'hh24'),'08',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'08',1,0))) t9, decode(sum(decode(to_char(first_time,'hh24'),'09',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'09',1,0))) t10, decode(sum(decode(to_char(first_time,'hh24'),'10',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'10',1,0))) t11, decode(sum(decode(to_char(first_time,'hh24'),'11',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'11',1,0))) t12, decode(sum(decode(to_char(first_time,'hh24'),'12',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'12',1,0))) t13, decode(sum(decode(to_char(first_time,'hh24'),'13',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'13',1,0))) t14, decode(sum(decode(to_char(first_time,'hh24'),'14',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'14',1,0))) t15, decode(sum(decode(to_char(first_time,'hh24'),'15',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'15',1,0))) t16, decode(sum(decode(to_char(first_time,'hh24'),'16',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'16',1,0))) t17, decode(sum(decode(to_char(first_time,'hh24'),'17',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'17',1,0))) t18, decode(sum(decode(to_char(first_time,'hh24'),'18',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'18',1,0))) t19, decode(sum(decode(to_char(first_time,'hh24'),'19',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'19',1,0))) t20, decode(sum(decode(to_char(first_time,'hh24'),'20',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'20',1,0))) t21, decode(sum(decode(to_char(first_time,'hh24'),'21',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'21',1,0))) t22, decode(sum(decode(to_char(first_time,'hh24'),'22',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'22',1,0))) t23, decode(sum(decode(to_char(first_time,'hh24'),'23',1,0)),0,'-',sum(decode(to_char(first_time,'hh24'),'23',1,0))) t24, decode(count(*),0,'-',count(*)) tt from sys.gv_$log_history where first_time > SYSDATE - 31 group by to_char(first_time,'yyyymmdd') order by 1 desc; SET LINES 9999 SET PAGES 100 COL DATA FORMAT A25 COL GB_SIZE FORMAT 999,999,999,999 COL QTDE FORMAT 999,999,999,999 COL DUMMY FORMAT a10 HEADING "" COMPUTE AVG OF GB_SIZE ON DUMMY BREAK ON dummy SELECT '' as dummy, TRUNC(COMPLETION_TIME,'DD') DATA, sum(BLOCKS*BLOCK_SIZE)/1024/1024/1024 GB_SIZE, COUNT(*) QTDE, MIN(SEQUENCE#) MIN_SEQ# FROM V$ARCHIVED_LOG L WHERE STANDBY_DEST = 'NO' AND COMPLETION_TIME >= trunc(sysdate) - 50 GROUP BY TRUNC(COMPLETION_TIME,'DD') ORDER BY DATA; set heading off; set feedback off; prompt prompt select '-----------------------------' from dual; select ' REDO - INFORMACOES ' from dual; select '-----------------------------' from dual; prompt prompt set heading on; set feedback on; set lines 9999 pages 9999; col member for a60; select a.THREAD#, a.GROUP#, a.STATUS, b.MEMBER, (a.BYTES/1024/1024) as TAM_MB, nvl( b.STATUS, 'EM USO' ) LOG_FILE_STATUS, a.ARCHIVED, a.SEQUENCE# from V$LOG a, V$LOGFILE b where b.GROUP# = a.GROUP# order by 1, 2 / prompt set heading off; set feedback off; select 'Tamanho do REDO atual : '|| sum(bytes/1024/1024/1024) || ' GB' from gv$log; SELECT 'ARCHIVE_LAG_TARGET in Min: '|| VALUE/60 FROM GV$PARAMETER WHERE NAME = 'archive_lag_target'; prompt prompt set heading on; set feedback on;
Saída do Comando:
SYS@orclpdb> @info_redo ----------------------------- REDO - MAPA DE GERACAO ----------------------------- DATE 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 20h 21h 22h 23h TOTAL -------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----- 20260428 4 - - - - - - - - - - - - - - - - - - - - - - - 4 20260427 12 12 12 12 12 12 12 12 12 12 12 12 26 73 81 82 55 76 104 114 108 79 12 13 967 -- <-- Pico 20260426 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 289 20260425 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 289 20260424 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 14 15 14 12 12 12 12 12 12 296 20260423 12 12 12 14 12 12 12 12 12 12 14 15 41 31 36 18 39 30 62 83 56 12 12 12 583 -- <-- Pico 20260422 12 12 12 13 12 12 12 12 12 13 13 34 51 76 102 45 16 66 76 32 65 68 12 12 788 -- <-- Pico 20260421 59 17 12 14 12 12 12 12 12 12 13 14 69 59 74 34 16 77 48 14 35 63 14 12 716 -- <-- Pico 20260420 - - - - - - - - - - - - - - - - - - - - - 36 15 59 110 -- <-- Pico
9 rows selected. DATA GB_SIZE QTDE MIN_SEQ# ---------- ------------------------- ---------------- ---------------- ---------- 20-APR-2026 00:00:00 57 738 96576 21-APR-2026 00:00:00 58 716 97314 22-APR-2026 00:00:00 66 788 98030 23-APR-2026 00:00:00 43 583 98840 24-APR-2026 00:00:00 8 296 99423 25-APR-2026 00:00:00 2 289 99719 26-APR-2026 00:00:00 2 289 100008 27-APR-2026 00:00:00 81 967 100297 28-APR-2026 00:00:00 0 5 101264 ********** ---------------- ---------------- avg 29 457 ----------------------------- REDO - INFORMACOES ----------------------------- THREAD# GROUP# STATUS MEMBER TAM_MB LOG_FIL ARC SEQUENCE# ---------- ---------- ---------------- ------------------------------------------------------------ ---------- ------- --- ---------- 1 1 CURRENT /u02/oradata/ORCL/redo01.log 200 EM USO NO 101269 1 2 ACTIVE /u02/oradata/ORCL/redo02.log 200 EM USO NO 101267 1 3 ACTIVE /u02/oradata/ORCL/redo03.log 200 EM USO NO 101268 3 linhas selecionadas. Tamanho do REDO atual : ,5859375 GB ARCHIVE_LAG_TARGET in Min: 0 SYS@orclpdb>
2 - Estimando o tamanho dos Redologs
Podemos ver acima que temos picos de switch onde a geração está muito acima do limite e dessa forma é necessário a recriação desses redos para melhorar a performance do ambiente e evitar os Eventos de Logfile sync.
Agora, para redimensionar os redologs de maneira que não criemos redologs muito grandes que podem impactar no recovery do Banco de dados, devemos estimar o tamanho ideal dos Redos com a seguinte fórmula.
Como no script acima ele traz todas as informações necessárias para a fórmula podemos realizar um calculo básico:
(Maior horário de pico de switchs) * (Tamanho total dos Redos) / (Quantidade de switchs desejado) = (Tamanho ideal dos Redos)Maior horário de pico de switchs: 114 (Dia 22/04/2026)
Tamanho total dos Redos: 512 MB
Quantidade de switchs desejado: 12/hr
114*512/12 = 4.864Ou seja, podemos ver que o tamanho ideal dos Redos seria em torno de 5G arredondando para cima. Então, 5 novos Redolog files de 1G cada resolveriam o nosso problema para comportar a carga imposta ao ambiente. Dessa forma vamos a criação dos novos Redos, e drop dos antigos.
3- Criando novos Redologs
Como já temos os grupos 1,2 e 3, vamos seguir criando a partir do grupo 4 até o grupo 8.
ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo04.log') SIZE 1G;
ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo05.log') SIZE 1G;
ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo06.log') SIZE 1G;
ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo07.log') SIZE 1G;
ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo08.log') SIZE 1G;SQL> ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo04.log') SIZE 1G;
Database altered.
SQL> ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo05.log') SIZE 1G;
Database altered.
SQL> ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo06.log') SIZE 1G;
Database altered.
SQL> ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo07.log') SIZE 1G;
Database altered.
SQL> ALTER DATABASE ADD LOGFILE ('/u02/oradata/ORCL/redo08.log') SIZE 1G;
Database altered.
SQL>
Agora vamos validar os novos grupos e o status dos antigos:
THREAD# GROUP# STATUS MEMBER TAM_MB LOG_FIL ARC SEQUENCE#
---------- ---------- ---------------- ------------------------------------------------------------ ---------- ------- --- ----------
1 1 CURRENT /u02/oradata/ORCL/redo01.log 200 EM USO NO 101269
1 2 INACTIVE /u02/oradata/ORCL/redo02.log 200 EM USO NO 101267
1 3 INACTIVE /u02/oradata/ORCL/redo03.log 200 EM USO NO 101268
1 4 UNUSED /u02/oradata/ORCL/redo04.log 1024 EM USO YES 0
1 5 UNUSED /u02/oradata/ORCL/redo05.log 1024 EM USO YES 0
1 6 UNUSED /u02/oradata/ORCL/redo06.log 1024 EM USO YES 0
1 7 UNUSED /u02/oradata/ORCL/redo07.log 1024 EM USO YES 0
1 8 UNUSED /u02/oradata/ORCL/redo08.log 1024 EM USO YES 0
8 linhas selecionadas.
Podemos ver que os novos grupos foram criados e estão com o status UNUSED, pois ainda não foram usados de fato.
Dessa forma devemos realizar alguns switchs pois na imagem acima podemos ver que o grupo 1 está em uso (CURRENT), devemos fazer com que os novos grupos estejam em uso para que os antigos possam ser dropados, assim vamos realizar alguns switchs ate que o grupo 4 esteja em uso e depois um checkpoint, assim teremos o grupo 1,2 e 3 com status INACTIVE e prontos para o drop:
SQL> alter system switch logfile; System altered. SQL> alter system switch logfile;
System altered. SQL> alter system switch logfile;
System altered. SQL> alter system checkpoint; System altered. SQL>
THREAD# GROUP# STATUS MEMBER TAM_MB LOG_FIL ARC SEQUENCE# ---------- ---------- ---------------- ------------------------------------------------------------ ---------- ------- --- ---------- 1 1 INACTIVE /u02/oradata/ORCL/redo01.log 200 EM USO NO 101269 1 2 INACTIVE /u02/oradata/ORCL/redo02.log 200 EM USO NO 101267 1 3 INACTIVE /u02/oradata/ORCL/redo03.log 200 EM USO NO 101268 1 4 INACTIVE /u02/oradata/ORCL/redo04.log 1024 EM USO NO 101270 1 5 INACTIVE /u02/oradata/ORCL/redo05.log 1024 EM USO NO 101271 1 6 CURRENT /u02/oradata/ORCL/redo06.log 1024 EM USO NO 101272 1 7 UNUSED /u02/oradata/ORCL/redo07.log 1024 EM USO YES 0 1 8 UNUSED /u02/oradata/ORCL/redo08.log 1024 EM USO YES 0 8 linhas selecionadas.
4- Dropando Redologs
Agora que os 3 grupos estão inativos vamos seguir com o drop:
ALTER DATABASE DROP LOGFILE GROUP 1; ALTER DATABASE DROP LOGFILE GROUP 2; ALTER DATABASE DROP LOGFILE GROUP 3;
SQL> ALTER DATABASE DROP LOGFILE GROUP 1; Database altered. SQL> ALTER DATABASE DROP LOGFILE GROUP 2; Database altered. SQL> ALTER DATABASE DROP LOGFILE GROUP 3; Database altered. SQL>
Agora validamos novamente se apenas os novos grupos permanecem:
THREAD# GROUP# STATUS MEMBER TAM_MB LOG_FIL ARC SEQUENCE#
---------- ---------- ---------------- ------------------------------------------------------------ ---------- ------- --- ----------
1 4 INACTIVE /u02/oradata/ORCL/redo04.log 1024 EM USO NO 101270
1 5 INACTIVE /u02/oradata/ORCL/redo05.log 1024 EM USO NO 101271
1 6 CURRENT /u02/oradata/ORCL/redo06.log 1024 EM USO NO 101272
1 7 UNUSED /u02/oradata/ORCL/redo07.log 1024 EM USO YES 0
1 8 UNUSED /u02/oradata/ORCL/redo08.log 1024 EM USO YES 0
5 linhas selecionadas.
Dessa forma realizamos a recriação dos switchs de forma segura.
5- Configurando ARCHIVE_LAG_TARGET
Agora, caso tenhamos uma geração de switchs menor do que o esperado, podemos configurar o parametro archive_lag_target para forçar a geração de archives a cada X segundos com o seguinte comando:
-- Forçar log switch a cada 15 minutos ALTER SYSTEM SET ARCHIVE_LAG_TARGET = 900 SCOPE=BOTH;
SQL> show parameter archive_lag_target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ archive_lag_target integer 0 SQL> SQL> ALTER SYSTEM SET ARCHIVE_LAG_TARGET = 900 SCOPE=BOTH; System altered. SQL> show parameter archive_lag_target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ archive_lag_target integer 900 SQL> SQL>
Conclusão:
- Como analisar os Redolog files
- Como estimar o tamanho dos Redolog files
- Como recriar os Redolog files
- Como realizar switch de Redolog
- Como realizar um checkpoint
- Como dropar Redolog files com segurança
- Como configurar o parâmetro ARCHIVE_LAG_TARGET
Material de Apoio:
Por hoje é isso pessoal, espero que esse conteúdo ajude de alguma forma e caso tenham alguma dúvida podem deixar aqui nos comentários ou me mandar via E-mail com Título da postagem, meu E-mail para envio de dúvidas e sugestões de novas postagens: pedrohvido@gmail.com.
Comentários
Postar um comentário