<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
  <title>Renato Barros — Blog</title>
  <subtitle>Oracle, Exadata, Cloud e Engenharia de Bancos de Dados</subtitle>
  <link href="https://barros.inf.br/feed.xml" rel="self" />
  <link href="https://barros.inf.br/" />
  <updated>2026-11-04T00:00:00Z</updated>
  <id>https://barros.inf.br/</id>
  <author>
    <name>Renato Barros</name>
  </author>
  <entry>
    <title>Bem-vindo ao novo barros.inf.br</title>
    <link href="https://barros.inf.br/posts/bem-vindo-ao-novo-site/" />
    <updated>2026-11-04T00:00:00Z</updated>
    <id>https://barros.inf.br/posts/bem-vindo-ao-novo-site/</id>
    <content type="html">&lt;p&gt;Durante um bom tempo, o &lt;strong&gt;barros.inf.br&lt;/strong&gt; foi apenas o meu currículo online. Funcionava bem para recrutadores, mas eu sentia falta de um lugar para registrar o que aprendo no dia a dia com Oracle, Exadata e Cloud.&lt;/p&gt;
&lt;p&gt;A partir de agora o site passa a ser um &lt;strong&gt;blog técnico&lt;/strong&gt;, organizado assim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://barros.inf.br/blog/&quot;&gt;Blog&lt;/a&gt;&lt;/strong&gt; — posts curtos: dicas rápidas, scripts, comandos e notas de campo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://barros.inf.br/artigos/&quot;&gt;Artigos&lt;/a&gt;&lt;/strong&gt; — conteúdos mais longos e aprofundados, com passo a passo e explicações de arquitetura.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://barros.inf.br/projetos/&quot;&gt;Projetos&lt;/a&gt;&lt;/strong&gt; — as academias, guias interativos e cheat sheets que publiquei (GoldenGate, Data Guard, Exadata, DBATOOLKIT e outros).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://barros.inf.br/curriculo/&quot;&gt;Currículo&lt;/a&gt;&lt;/strong&gt; — a versão completa do meu currículo, em português e &lt;a href=&quot;https://barros.inf.br/en/curriculum/&quot;&gt;em inglês&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;o-que-voce-vai-encontrar-por-aqui&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/bem-vindo-ao-novo-site/#o-que-voce-vai-encontrar-por-aqui&quot;&gt;O que você vai encontrar por aqui&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Os temas principais serão Oracle Database (RAC, ASM, Data Guard, GoldenGate, RMAN), Exadata, performance tuning com AWR/ASH, migrações para OCI, AWS e Azure, e automação com Shell, Python, Terraform e Ansible.&lt;/p&gt;
&lt;p&gt;A ideia é escrever de forma prática: o problema, o que verificar, os scripts e o porquê de cada passo.&lt;/p&gt;
&lt;h2 id=&quot;acompanhe&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/bem-vindo-ao-novo-site/#acompanhe&quot;&gt;Acompanhe&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Você pode assinar o &lt;a href=&quot;https://barros.inf.br/feed.xml&quot;&gt;feed RSS&lt;/a&gt; ou me seguir no &lt;a href=&quot;https://www.linkedin.com/in/renatotitelecom/&quot;&gt;LinkedIn&lt;/a&gt;. Sugestões de temas são muito bem-vindas — é só &lt;a href=&quot;https://barros.inf.br/contato/&quot;&gt;entrar em contato&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Monitorando o Oracle Data Guard com SQL: status, lag e gaps</title>
    <link href="https://barros.inf.br/posts/monitorando-data-guard-com-sql/" />
    <updated>2026-11-03T00:00:00Z</updated>
    <id>https://barros.inf.br/posts/monitorando-data-guard-com-sql/</id>
    <content type="html">&lt;p&gt;Quando alguém pergunta &lt;em&gt;“o standby está em dia?”&lt;/em&gt;, a resposta precisa vir em segundos — e com números. Neste artigo reúno as consultas que uso para avaliar um ambiente &lt;strong&gt;Oracle Data Guard&lt;/strong&gt; (testadas em 19c), sem depender de ferramentas gráficas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Onde executar:&lt;/strong&gt; algumas views só trazem informação útil no standby (como &lt;code&gt;V$DATAGUARD_STATS&lt;/code&gt;), outras fazem mais sentido no primário. Indico em cada passo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-quem-e-quem-papel-e-modo-de-protecao&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#1-quem-e-quem-papel-e-modo-de-protecao&quot;&gt;1. Quem é quem: papel e modo de proteção&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Comece confirmando o papel de cada banco e o modo de proteção configurado. Execute no primário &lt;strong&gt;e&lt;/strong&gt; no standby:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       db_unique_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       database_role&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       open_mode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       protection_mode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       protection_level&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       switchover_status
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$&lt;span class=&quot;token keyword&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O que observar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DATABASE_ROLE&lt;/code&gt; deve ser &lt;code&gt;PRIMARY&lt;/code&gt; de um lado e &lt;code&gt;PHYSICAL STANDBY&lt;/code&gt; do outro.&lt;/li&gt;
&lt;li&gt;Se &lt;code&gt;PROTECTION_LEVEL&lt;/code&gt; for diferente de &lt;code&gt;PROTECTION_MODE&lt;/code&gt;, o ambiente está operando abaixo do nível configurado (por exemplo, &lt;code&gt;MAXIMUM AVAILABILITY&lt;/code&gt; caindo para &lt;code&gt;RESYNCHRONIZATION&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPEN_MODE = READ ONLY WITH APPLY&lt;/code&gt; indica Active Data Guard em uso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-transport-lag-e-apply-lag&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#2-transport-lag-e-apply-lag&quot;&gt;2. Transport lag e apply lag&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No &lt;strong&gt;standby&lt;/strong&gt;, a view &lt;code&gt;V$DATAGUARD_STATS&lt;/code&gt; mostra o atraso de transporte e de aplicação:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       unit&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       time_computed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       datum_time
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$dataguard_stats
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  name &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;transport lag&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;apply lag&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;apply finish time&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interpretação rápida:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;transport lag&lt;/strong&gt; alto → problema de rede, de destino de archive (&lt;code&gt;LOG_ARCHIVE_DEST_n&lt;/code&gt;) ou o primário não está enviando redo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;apply lag&lt;/strong&gt; alto com transport lag baixo → o redo chegou, mas o MRP está parado, lento ou aguardando algo.&lt;/li&gt;
&lt;li&gt;Compare &lt;code&gt;DATUM_TIME&lt;/code&gt; com &lt;code&gt;SYSDATE&lt;/code&gt;: se o valor estiver muito antigo, a estatística não está sendo atualizada — o que por si só já é um sinal de problema.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-processos-de-recuperacao&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#3-processos-de-recuperacao&quot;&gt;3. Processos de recuperação&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A partir do 19c, prefira &lt;code&gt;V$DATAGUARD_PROCESS&lt;/code&gt; (a antiga &lt;code&gt;V$MANAGED_STANDBY&lt;/code&gt; está obsoleta). No &lt;strong&gt;standby&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       role&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       client_role&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       thread&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       sequence&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       block&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$dataguard_process
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; role&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Procure pelo processo com &lt;code&gt;ROLE = &#39;recovery apply slave&#39;&lt;/code&gt; / &lt;code&gt;&#39;managed recovery&#39;&lt;/code&gt; (MRP). Se não houver MRP, a aplicação de redo não está rodando. Para iniciar o apply em tempo real:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DATABASE&lt;/span&gt; RECOVER MANAGED STANDBY &lt;span class=&quot;token keyword&quot;&gt;DATABASE&lt;/span&gt; DISCONNECT &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SESSION&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Se o ambiente é gerenciado pelo &lt;strong&gt;Data Guard Broker&lt;/strong&gt;, prefira &lt;code&gt;DGMGRL&amp;gt; EDIT DATABASE &#39;&amp;lt;standby&amp;gt;&#39; SET STATE=&#39;APPLY-ON&#39;;&lt;/code&gt; para manter a configuração do broker consistente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-existe-gap-de-archive&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#4-existe-gap-de-archive&quot;&gt;4. Existe gap de archive?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No &lt;strong&gt;standby&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; thread&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       low_sequence&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       high_sequence&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$archive_gap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nenhuma linha retornada é o resultado esperado. Se houver gap, verifique se os archives faltantes ainda existem no primário (ou no backup) e se o FAL (&lt;code&gt;FAL_SERVER&lt;/code&gt;) está configurado.&lt;/p&gt;
&lt;h2 id=&quot;5-ultima-sequencia-recebida-x-aplicada-por-thread&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#5-ultima-sequencia-recebida-x-aplicada-por-thread&quot;&gt;5. Última sequência recebida x aplicada, por thread&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Em ambientes &lt;strong&gt;RAC&lt;/strong&gt;, olhe cada thread separadamente. No &lt;strong&gt;standby&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; thread&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sequence&lt;span class=&quot;token comment&quot;&gt;#)                                   AS ultima_recebida,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; applied &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;YES&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; sequence&lt;span class=&quot;token comment&quot;&gt;# END) AS ultima_aplicada&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$archived_log
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  resetlogs_change&lt;span class=&quot;token comment&quot;&gt;# = (SELECT resetlogs_change# FROM v$database)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; thread&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; thread&lt;span class=&quot;token comment&quot;&gt;#;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma diferença de uma ou duas sequências é normal (o archive corrente ainda está sendo aplicado). Diferenças maiores e crescentes merecem investigação.&lt;/p&gt;
&lt;h2 id=&quot;6-destinos-de-archive-com-erro-no-primario&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#6-destinos-de-archive-com-erro-no-primario&quot;&gt;6. Destinos de archive com erro (no primário)&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; dest_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       dest_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       database_mode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       recovery_mode&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       gap_status&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       error
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   v$archive_dest_status
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;INACTIVE&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Qualquer valor em &lt;code&gt;ERROR&lt;/code&gt; ou &lt;code&gt;GAP_STATUS&lt;/code&gt; diferente de &lt;code&gt;NO GAP&lt;/code&gt; precisa ser tratado antes que o lag cresça.&lt;/p&gt;
&lt;h2 id=&quot;7-verificacao-via-broker&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#7-verificacao-via-broker&quot;&gt;7. Verificação via Broker&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Se o broker estiver habilitado, ele resume tudo em um comando:&lt;/p&gt;
&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;DGMGRL&gt; SHOW CONFIGURATION LAG;
DGMGRL&gt; VALIDATE DATABASE &#39;&amp;lt;standby&gt;&#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;code&gt;VALIDATE DATABASE&lt;/code&gt; é especialmente útil antes de um switchover planejado: ele aponta se o standby está pronto para assumir.&lt;/p&gt;
&lt;h2 id=&quot;resumo-checklist-rapido&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/monitorando-data-guard-com-sql/#resumo-checklist-rapido&quot;&gt;Resumo: checklist rápido&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verificação&lt;/th&gt;
&lt;th&gt;Onde&lt;/th&gt;
&lt;th&gt;Resultado esperado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Papel e modo de proteção&lt;/td&gt;
&lt;td&gt;Ambos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PROTECTION_LEVEL = PROTECTION_MODE&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport / apply lag&lt;/td&gt;
&lt;td&gt;Standby&lt;/td&gt;
&lt;td&gt;Próximo de zero (segundos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processo MRP&lt;/td&gt;
&lt;td&gt;Standby&lt;/td&gt;
&lt;td&gt;Presente e aplicando&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;V$ARCHIVE_GAP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Standby&lt;/td&gt;
&lt;td&gt;Nenhuma linha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;V$ARCHIVE_DEST_STATUS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Primário&lt;/td&gt;
&lt;td&gt;Sem erro, &lt;code&gt;NO GAP&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Com essas consultas em um script único, dá para responder em poucos segundos se o ambiente de DR está realmente pronto — e, melhor ainda, automatizar o envio desse resumo por e-mail. Esse será o tema de um próximo post.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Objetos inválidos antes e depois de uma mudança no banco</title>
    <link href="https://barros.inf.br/posts/objetos-invalidos-antes-e-depois-da-mudanca/" />
    <updated>2026-10-28T00:00:00Z</updated>
    <id>https://barros.inf.br/posts/objetos-invalidos-antes-e-depois-da-mudanca/</id>
    <content type="html">&lt;p&gt;Toda mudança em banco de produção (GMUD) tem um risco silencioso: &lt;strong&gt;objetos que ficam inválidos&lt;/strong&gt; depois de um &lt;code&gt;ALTER TABLE&lt;/code&gt;, de uma package recompilada ou de um grant removido. Se você não sabe quantos objetos já estavam inválidos &lt;em&gt;antes&lt;/em&gt;, fica impossível afirmar se a mudança quebrou algo.&lt;/p&gt;
&lt;p&gt;Por isso, no meu roteiro de execução, sempre registro a situação antes e depois.&lt;/p&gt;
&lt;h2 id=&quot;antes-da-mudanca&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/objetos-invalidos-antes-e-depois-da-mudanca/#antes-da-mudanca&quot;&gt;Antes da mudança&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Contagem por owner e tipo:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; object_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; qtd
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   dba_objects
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;INVALID&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; object_type
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; object_type&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E a lista detalhada, com os mais recentemente alterados primeiro:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; object_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; object_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_ddl_time
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   dba_objects
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;INVALID&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; last_ddl_time &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;depois-da-mudanca&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/objetos-invalidos-antes-e-depois-da-mudanca/#depois-da-mudanca&quot;&gt;Depois da mudança&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Execute &lt;strong&gt;as mesmas consultas&lt;/strong&gt;. Se surgiram novos inválidos, a coluna &lt;code&gt;LAST_DDL_TIME&lt;/code&gt; ajuda a identificar o que foi afetado pela mudança — normalmente eles aparecem no topo da lista.&lt;/p&gt;
&lt;p&gt;Para recompilar apenas um schema:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXEC&lt;/span&gt; DBMS_UTILITY&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;COMPILE_SCHEMA&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;schema&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;NOME_DO_SCHEMA&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; compile_all &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou, para o banco todo (com o usuário &lt;code&gt;SYS&lt;/code&gt;), o script padrão:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;@?&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;rdbms&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;admin&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;utlrp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;sql&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dica&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://barros.inf.br/posts/objetos-invalidos-antes-e-depois-da-mudanca/#dica&quot;&gt;Dica&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Guarde a saída das duas execuções junto com a evidência da GMUD. Se alguém perguntar dias depois &lt;em&gt;“esse objeto ficou inválido por causa da mudança?”&lt;/em&gt;, você responde com dados — e não com memória.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Dica rápida: encontrando a sessão bloqueadora raiz no RAC</title>
    <link href="https://barros.inf.br/posts/sessoes-bloqueadoras-no-rac/" />
    <updated>2026-10-20T00:00:00Z</updated>
    <id>https://barros.inf.br/posts/sessoes-bloqueadoras-no-rac/</id>
    <content type="html">&lt;p&gt;Usuários reclamando de lentidão, telas travadas e muitas sessões em &lt;code&gt;enq: TX - row lock contention&lt;/code&gt;. Antes de sair matando sessões, descubra &lt;strong&gt;quem está no topo da cadeia&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Em RAC, use sempre as views &lt;code&gt;GV$&lt;/code&gt; — o bloqueador pode estar em outra instância. A coluna &lt;code&gt;FINAL_BLOCKING_SESSION&lt;/code&gt; já aponta a sessão raiz:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inst_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sid&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;serial&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;machine&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;program&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sql_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;seconds_in_wait&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;blocking_instance&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;blocking_session&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;final_blocking_instance&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;final_blocking_session
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   gv$&lt;span class=&quot;token keyword&quot;&gt;session&lt;/span&gt; s
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;blocking_session &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;seconds_in_wait &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depois, olhe a sessão raiz com calma — o que ela está fazendo, há quanto tempo está &lt;code&gt;INACTIVE&lt;/code&gt;, qual o último SQL:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; inst_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sid&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;serial&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;#, username, status, machine, program,&lt;/span&gt;
       sql_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prev_sql_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_call_et&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; logon_time
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   gv$&lt;span class=&quot;token keyword&quot;&gt;session&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inst_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
         &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; final_blocking_instance&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; final_blocking_session
         &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;   gv$&lt;span class=&quot;token keyword&quot;&gt;session&lt;/span&gt;
         &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;  final_blocking_session &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma sessão &lt;code&gt;INACTIVE&lt;/code&gt; com &lt;code&gt;LAST_CALL_ET&lt;/code&gt; alto segurando lock geralmente é transação aberta sem &lt;code&gt;COMMIT&lt;/code&gt; — muitas vezes de uma ferramenta cliente esquecida aberta. Antes de encerrar, alinhe com o responsável pela aplicação. Se for preciso matar, em RAC informe a instância:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ALTER&lt;/span&gt; SYSTEM &lt;span class=&quot;token keyword&quot;&gt;KILL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SESSION&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sid,serial#,@inst_id&#39;&lt;/span&gt; IMMEDIATE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>