<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[La botica del DBA]]></title><description><![CDATA[La botica del DBA]]></description><link>https://laboticadeldba.com</link><image><url>https://cdn.hashnode.com/uploads/logos/677d8467dbca868e38ce3363/86543fee-05ce-4c1f-84a4-8143eb81c263.jpg</url><title>La botica del DBA</title><link>https://laboticadeldba.com</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 10:44:25 GMT</lastBuildDate><atom:link href="https://laboticadeldba.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[ Crónica de una madrugada: Cuando SYS.siebel_stats amanece inválido en producción]]></title><description><![CDATA[Son las 3:00 AM. Estás revisando los reportes de salud de tu clúster RAC en producción y de pronto, una alerta llama tu atención: un objeto en el esquema SYS amaneció inválido. Y no es cualquier objet]]></description><link>https://laboticadeldba.com/cronica-de-una-madrugada-cuando-sys-siebel-stats-amanece-invlido-en-produccion</link><guid isPermaLink="true">https://laboticadeldba.com/cronica-de-una-madrugada-cuando-sys-siebel-stats-amanece-invlido-en-produccion</guid><category><![CDATA[Oracle]]></category><category><![CDATA[database administration]]></category><category><![CDATA[Performance Tuning]]></category><category><![CDATA[siebel ]]></category><category><![CDATA[Siebel CRM]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Sat, 14 Mar 2026 13:32:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/677d8467dbca868e38ce3363/20a2a453-b672-4227-93bc-39f6bdbf147b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Son las 3:00 AM. Estás revisando los reportes de salud de tu clúster RAC en producción y de pronto, una alerta llama tu atención: un objeto en el esquema <code>SYS</code> amaneció inválido. Y no es cualquier objeto, se llama <code>siebel_stats</code>.</p>
<p>El pulso se acelera por un segundo. Todos hemos estado ahí. Las preguntas caen en cascada: <em>¿Me hackearon? ¿Alguien metió las manos en el motor? ¿Es un proceso interno de Siebel que falló?</em> Y lo más extraño: a los pocos minutos, el objeto vuelve a estar válido por arte de magia.</p>
<p>Como boticarios del dato, no podemos permitirnos cajas negras en nuestra infraestructura. Así que acompáñame a destripar este paquete, entender por qué hace lo que hace, y por qué, en realidad, es uno de los mejores aliados que puedes tener en un entorno Oracle 12c con CRM Siebel.</p>
<hr />
<h3>🔬 El Síntoma: ¿De dónde salió este fantasma?</h3>
<p>Primero, bajemos las pulsaciones. Este paquete <strong>no</strong> es un intruso, pero tampoco viene preinstalado de fábrica ni con el motor de Oracle Database ni con los binarios de Siebel.</p>
<p>Si miramos bajo el capó y leemos la cabecera del código fuente, encontramos esta joya: <code>REM \(Header: coe_gather_statistics.sql 11.4.4.6 2015/09/09 abel.macias carlos.sierra \)</code></p>
<p>Estamos ante una auténtica receta magistral del <strong>Oracle Center of Excellence (COE)</strong>, firmada por referentes absolutos del rendimiento como Carlos Sierra y Abel Macias. Es un script implementado a medida (probablemente en alguna ventana de afinamiento pasada o por recomendación de Oracle ACS) para domar al Optimizador Basado en Costos (CBO) frente al complejo modelo de datos de Siebel.</p>
<p><strong>¿Y por qué se invalidó y compiló solo?</strong> Pura mecánica de Oracle. Si alguna dependencia de este paquete (como la tabla de auditoría <code>siebel_stats_log</code> o alguna vista del diccionario de datos) sufre el más mínimo cambio o mantenimiento, el paquete pasa a estado <code>INVALID</code>. Cuando el <em>Scheduler</em> intenta correr la rutina de madrugada, entra en acción la <strong>Recompilación Diferida (Deferred Recompilation)</strong>: Oracle nota la invalidez, verifica que la estructura sigue siendo coherente y lo recompila al vuelo, ejecutándolo sin que nosotros movamos un dedo.</p>
<hr />
<h3>⚗️ La Fórmula Magistral: Traduciendo el código</h3>
<p>Lanzar un <code>DBMS_STATS.GATHER_SCHEMA_STATS</code> tradicional en un entorno Siebel es como intentar navegar por Santiago con un mapa del año 1990: el optimizador va a tomar decisiones desastrosas. Este paquete del COE interviene exactamente ahí.</p>
<p>Analicemos sus ingredientes clave:</p>
<ul>
<li><p><strong>Filtro Quirúrgico:</strong> El motor no pierde tiempo. El script ignora la basura y se enfoca solo en tablas estándar de Siebel (<code>S_%</code>) y extensiones customizadas (<code>CX_%</code>), saltándose inteligentemente las tablas de ETL.</p>
</li>
<li><p><strong>La vacuna contra los Nested Loops:</strong> Siebel es especialista en crear cientos de tablas vacías. Si Oracle ve "0 filas" en sus estadísticas, asume un costo bajísimo y arma <em>Nested Loops</em> masivos que terminan asfixiando la CPU. ¿Qué hace nuestra fórmula? Si una tabla tiene menos de 15 registros, <strong>borra las estadísticas y bloquea la tabla</strong> (<code>DBMS_STATS.LOCK_TABLE_STATS</code>). Esto fuerza al motor a usar <em>Dynamic Sampling</em>, calculando la ruta en tiempo real. Magia pura.</p>
</li>
<li><p><strong>Evolución a 12c:</strong> El código es inteligente. Detecta que estamos en la versión 12.2.0.1 y delega el cálculo del muestreo a <code>DBMS_STATS.AUTO_SAMPLE_SIZE</code>. Este algoritmo de hash moderno es brutalmente rápido y nos entrega estadísticas precisas en una fracción del tiempo que tomaría en un 11g.</p>
</li>
<li><p><strong>Histogramas a la medida:</strong> La regla de oro en Siebel es recolectar estadísticas <em>solo</em> para columnas indexadas. Sin embargo, el script hace excepciones a mano para el corazón de la visibilidad del CRM (<code>S_POSTN_CON</code>, <code>S_ORG_BU</code>, <code>S_ORG_GROUP</code>), forzando el análisis de <em>todas</em> las columnas. Le estamos dando al optimizador una radiografía perfecta de dónde están los cuellos de botella.</p>
</li>
</ul>
<h3>💊 Contraindicaciones y Monitoreo</h3>
<p>Tener a <code>SYS.siebel_stats</code> operando en las sombras no es un riesgo, es un seguro de vida. Su labor nocturna es la barrera entre un día de operaciones fluido y un colapso generalizado de la aplicación.</p>
<p>Como única recomendación de monitoreo, acostúmbrate a revisar periódicamente la tabla <code>siebel_stats_log</code>. Ahí es donde el procedimiento deja anotado si tropezó con algún <code>ORA-XXXXX</code> mientras tú y yo intentábamos dormir un par de horas.</p>
<hr />
<p><strong>Ahora les paso el micrófono a ustedes:</strong> ¿Les ha tocado lidiar con el optimizador en entornos Siebel pesados? ¿Tienen implementadas otras recetas del COE en sus motores? ¡Los leo en los comentarios para debatir!</p>
]]></content:encoded></item><item><title><![CDATA[23.26 → 26ai: ¿qué cambia y por qué debería importarte como DBA?]]></title><description><![CDATA[Oracle convierte 23ai en Oracle AI Database 26ai aplicando el Release Update 23.26.0. No es un “upgrade” tradicional: se aplica el RU y la instancia pasa a 26ai. Aquí un resumen práctico, qué probar y una mini-checklist para DBAs.

1) ¿Qué pasó (resu...]]></description><link>https://laboticadeldba.com/2326-26ai-que-cambia-y-por-que-deberia-importarte-como-dba</link><guid isPermaLink="true">https://laboticadeldba.com/2326-26ai-que-cambia-y-por-que-deberia-importarte-como-dba</guid><category><![CDATA[Oracle 26ia]]></category><category><![CDATA[rolling RU]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle 23ai]]></category><category><![CDATA[rman]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Thu, 23 Oct 2025 20:40:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761249072529/23cd5962-f7ed-4ad0-b379-29b23af982cb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>Oracle convierte 23ai en <strong>Oracle AI Database 26ai</strong> aplicando el Release Update <strong>23.26.0</strong>. No es un “upgrade” tradicional: se aplica el RU y la instancia pasa a 26ai. Aquí un resumen práctico, qué probar y una mini-checklist para DBAs.</p>
<hr />
<h2 id="heading-1-que-paso-resumen-corto">1) ¿Qué pasó (resumen corto)?</h2>
<p>Oracle publicó el Release Update <strong>23.26.0</strong> que marca la transición de la familia <strong>23ai</strong> hacia la nueva serie <strong>26ai</strong>. Si corres 23ai, aplicar ese RU transforma la instancia en 26ai sin necesidad de un upgrade de base de datos tradicional ni recertificación automática de apps — aun así, <strong>validar siempre en non-prod</strong>.</p>
<hr />
<h2 id="heading-2-por-que-importa-para-los-dbas">2) ¿Por qué importa para los DBAs?</h2>
<p>Porque 26ai consolida mejoras <strong>AI-nativas</strong> (vector search, integración LLM/RAG, APIs y mejoras en observabilidad) y deja el camino listo para workloads de embeddings y búsqueda semántica dentro del motor DB. Para infra y operaciones significa: nuevas métricas que vigilar, posibles ajustes en drivers/clients y comprobaciones de compatibilidad en pipelines que usan AI.</p>
<hr />
<h2 id="heading-3-novedades-practicas-de-impacto-directo">3) Novedades prácticas (de impacto directo)</h2>
<ul>
<li><p><strong>AI Vector Search y capacidades LLM integradas</strong>: funcionalidad pensada para pipelines de embeddings / RAG.</p>
</li>
<li><p><strong>Mejoras en conectividad y drivers</strong> (ej.: opciones reactivas/pipelines en clientes).</p>
</li>
<li><p><strong>Comportamientos y métricas nuevas</strong> que conviene instrumentar (latencia de índice vectorial, uso de memoria para embeddings, etc.).</p>
</li>
<li><p><strong>RU aplicable en rolling para RAC</strong> (como otros RUs), permitiendo minimizar downtime en clusters.</p>
</li>
</ul>
<hr />
<h2 id="heading-4-mini-checklist-tecnica-lista-para-ejecutar-hoy">4) Mini-checklist técnica (lista para ejecutar hoy)</h2>
<ol>
<li><p><strong>Leer Release Notes &amp; Known Issues</strong> del RU 23.26.0 / 26ai. <a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-database/26/nfcoa/oracle-ai-database-26ai-new-features-guide.pdf">https://docs.oracle.com/en/database/oracle/oracle-database/26/nfcoa/oracle-ai-database-26ai-new-features-guide.pdf</a></p>
</li>
<li><p><strong>Clonar non-prod representativo</strong> (datos y workload) y aplicar RU ahí primero.</p>
</li>
<li><p><strong>Backups completos</strong>: RMAN full + datapump export de schemas críticos.</p>
</li>
<li><p><strong>Plan de ventana</strong>: en RAC usar rolling RU; en single-instance planear breve downtime si aplica.</p>
<p> <a target="_blank" href="https://mikedietrichde.com/2025/10/14/oracle-ai-database-26ai-replaces-oracle-database-23ai/?utm_source=chatgpt.com">https://mikedietrichde.com/2025/10/14/oracle-ai-database-26ai-replaces-oracle-database-23ai</a></p>
</li>
<li><p><strong>Validar clientes</strong>: testear python-oracledb / JDBC / <a target="_blank" href="http://ODP.NET">ODP.NET</a> y scripts que usan pipelines/LLM.<a target="_blank" href="https://mikedietrichde.com/2025/10/14/oracle-ai-database-26ai-replaces-oracle-database-23ai/?utm_source=chatgpt.com">https://mikedietrichde.com/2025/10/14/oracle-ai-database-26ai-replaces-oracle-database-23ai/?utm_source=chatgpt.com</a></p>
</li>
<li><p><strong>Pruebas específicas</strong>: OLTP, batch, integraciones RAG/embedding y jobs de ETL.</p>
</li>
<li><p><strong>Monitoreo post-RU</strong>: revisar AWR/ASH, métricas de I/O, PRCP/DRCP y latencias de vector search.</p>
</li>
<li><p><strong>Rollback</strong>: definir estrategia (snapshot, RMAN restore o reinstalación del RU precedente si es aplicable).</p>
</li>
</ol>
<hr />
<h2 id="heading-5-tldr">5) TL;DR</h2>
<p>Aplica el RU <strong>23.26.0</strong> en un entorno controlado; tu instancia 23ai pasará a <strong>Oracle AI Database 26ai</strong>. Es un RU con foco en AI: prueba, respalda y monitorea.</p>
<h3 id="heading-recursos-y-codigo-en-github"><strong>Recursos y código en GitHub</strong></h3>
<p>He publicado todos los recursos del post como una guía técnica RMAN + rolling RU en RAC, todo esto en GitHub de la Botica Del DBA:<br /><a target="_blank" href="https://github.com/laboticadeldba/laboticadeldba-23-26ai">https://github.com/laboticadeldba/laboticadeldba-23-26ai</a></p>
<p><em>La Botica del DBA — Mauricio Muñoz</em></p>
]]></content:encoded></item><item><title><![CDATA[📬 NEWSLETTER | La Botica del DBA
Edición Especial: Oracle@GCP — La fórmula multicloud sin efectos secundarios]]></title><description><![CDATA[👨‍⚕️ Estimad@ colega DBA, arquitect@ o entusiasta cloud:En esta edición te traemos una fórmula que está revolucionando las estrategias multicloud: Oracle@GCP, una alianza estratégica que permite correr bases de datos Oracle directamente desde Google...]]></description><link>https://laboticadeldba.com/newsletter-la-botica-del-dba-edicion-especial-oraclegcp-la-formula-multicloud-sin-efectos-secundarios</link><guid isPermaLink="true">https://laboticadeldba.com/newsletter-la-botica-del-dba-edicion-especial-oraclegcp-la-formula-multicloud-sin-efectos-secundarios</guid><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 28 Jul 2025 12:00:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761252244639/cf73b778-20b2-42b2-942e-3410f57c2916.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>👨‍⚕️ <strong>Estimad@ colega DBA, arquitect@ o entusiasta cloud:</strong><br />En esta edición te traemos una fórmula que está revolucionando las estrategias multicloud: <strong>Oracle@GCP</strong>, una alianza estratégica que permite correr bases de datos Oracle directamente desde Google Cloud, con la infraestructura, soporte y rendimiento nativo de Oracle.<br />Sí, como si tuvieras lo mejor de ambos mundos... ¡y sin reescribir ni una línea de PL/SQL!</p>
<hr />
<p>🌩️ <strong>¿Qué es Oracle@GCP?</strong><br />Una integración profunda entre Oracle y Google que te permite:</p>
<ul>
<li><p>✅ Ejecutar Oracle Database certificada (incluyendo Exadata y Autonomous)</p>
</li>
<li><p>✅ Mantener tu licenciamiento y configuraciones actuales</p>
</li>
<li><p>✅ Integrarte con BigQuery, Vertex AI, GKE y demás servicios GCP</p>
</li>
<li><p>✅ Activar funcionalidades empresariales como RAC, Data Guard y backup automático</p>
</li>
<li><p>✅ Simplificar tu arquitectura multicloud sin perder el control</p>
</li>
</ul>
<hr />
<p>⚙️ <strong>¿Qué tecnologías puedes usar?</strong></p>
<p>🔹 <strong>Oracle Autonomous Database</strong><br />Serverless, autoservicio, seguro y con parcheo automático. Ideal para BI, data marts o entornos de desarrollo rápidos.</p>
<p>🔹 <strong>Oracle Exadata Database Service</strong><br />Potencia OLTP + OLAP con la flexibilidad del pago por uso. Rendimiento sin compromisos.</p>
<p>🔹 <strong>RAC, Data Guard, Multitenant y más</strong><br />Todo lo que ya conoces, totalmente soportado en este nuevo modelo de operación.</p>
<hr />
<p>🏗️ <strong>Casos de uso comunes</strong></p>
<ul>
<li><p>🌐 <strong>Arquitecturas multicloud reales</strong><br />  Corre Oracle sobre Exadata en Oracle@GCP y consume IA/ML en GCP con latencia mínima.</p>
</li>
<li><p>🧬 <strong>Modernización sin reescritura</strong><br />  Migra a GCP manteniendo tu lógica Oracle y estructura de base actual.</p>
</li>
<li><p>🛡️ <strong>Alta disponibilidad y recuperación ante desastres</strong><br />  Implementa Data Guard o ZDLRA con replicación cruzada, combinando on-premises + GCP.</p>
</li>
</ul>
<hr />
<p>🚀 <strong>¿Cómo lo implementas?</strong></p>
<ol>
<li><p>Activa la interconexión Oracle-GCP</p>
</li>
<li><p>Despliega Oracle DB desde la consola GCP</p>
</li>
<li><p>Configura red (VCN, VPN o Interconnect dedicada)</p>
</li>
<li><p>Migra con RMAN, Data Pump, GoldenGate, etc.</p>
</li>
<li><p>Integra con IAM, Cloud Monitoring, Logging y más</p>
</li>
</ol>
<hr />
<p>🔐 <strong>Seguridad y observabilidad integradas</strong></p>
<ul>
<li><p>Cifrado de datos en tránsito y reposo</p>
</li>
<li><p>Backups automáticos y autopatching</p>
</li>
<li><p>Monitoreo con Cloud Monitoring, AWR, OEM y Logging centralizado</p>
</li>
</ul>
<hr />
<p>🎯 <strong>¿Por qué deberías considerarlo?</strong></p>
<p>Porque te permite <strong>modernizar sin sacrificar estabilidad ni rendimiento</strong>.<br />Ideal si:</p>
<p>✔️ Usas Oracle en tus sistemas core<br />✔️ Estás modernizando tu stack en GCP<br />✔️ Quieres una estrategia multicloud sin vendor lock-in</p>
<hr />
<p>🧪 ¿Quieres saber más?</p>
<p>Consulta el sitio oficial de Oracle Database Service for GCP o <strong>escríbenos directamente</strong> Admin@LaboticaDelDBA.com <strong>√</strong>.<br />En <strong>La Botica del DBA</strong> te ayudamos a encontrar la receta adecuada según tus necesidades.</p>
<hr />
<p>💬 ¿Te gustaría que hiciéramos un laboratorio técnico o demo sobre esto? Responde a este correo Admin@LaboticaDelDBA.com con “¡Me interesa Oracle@GCP!” y te contactamos.</p>
<p>Hasta la próxima dosis de tecnología bien recetada,<br />— <em>La Botica del DBA</em></p>
]]></content:encoded></item><item><title><![CDATA[Recuperando Datos Borrados en Oracle con LogMiner: Caso Práctico Paso a Paso]]></title><description><![CDATA[Introducción
¿Borraste accidentalmente datos en una tabla crítica de producción y no tienes un punto de restauración inmediato? ¿No puedes usar Flashback por limitaciones de configuración o licenciamiento? Aquí es donde LogMiner puede convertirse en ...]]></description><link>https://laboticadeldba.com/recuperando-datos-borrados-en-oracle-con-logminer-caso-practico-paso-a-paso</link><guid isPermaLink="true">https://laboticadeldba.com/recuperando-datos-borrados-en-oracle-con-logminer-caso-practico-paso-a-paso</guid><category><![CDATA[LOGMINER]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[data-restore]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 23 Jun 2025 18:11:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750701825626/70af7a55-efc3-4ed2-85ef-234f91e4f07d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-introduccion">Introducción</h2>
<p>¿Borraste accidentalmente datos en una tabla crítica de producción y no tienes un punto de restauración inmediato? ¿No puedes usar Flashback por limitaciones de configuración o licenciamiento? Aquí es donde <strong>LogMiner</strong> puede convertirse en tu aliado silencioso.</p>
<p>En este laboratorio aprenderás cómo utilizar LogMiner para recuperar información eliminada en una base de datos Oracle 19c (preferiblemente en modo <strong>NO CDB</strong>). Este proceso es ideal tanto para entornos de desarrollo como de producción (con las precauciones adecuadas).</p>
<hr />
<h2 id="heading-1-requisitos-del-entorno">1. Requisitos del entorno</h2>
<p>Asegúrate de contar con lo siguiente antes de comenzar:</p>
<ul>
<li><p>Oracle Database 19c instalado (modo <strong>NO CDB</strong> recomendado).</p>
</li>
<li><p>Usuario con privilegios <strong>DBA</strong>.</p>
</li>
<li><p>Logs de Redo (archived o online) accesibles.</p>
</li>
<li><p>Modo <strong>ARCHIVELOG</strong> activado.</p>
</li>
</ul>
<h3 id="heading-verifica-si-archivelog-esta-habilitado">Verifica si <code>ARCHIVELOG</code> está habilitado:</h3>
<pre><code class="lang-sql">ARCHIVE LOG LIST;
</code></pre>
<p>Si no lo está, actívalo:</p>
<pre><code class="lang-sql">SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">ARCHIVELOG</span>;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span>;
</code></pre>
<hr />
<h2 id="heading-2-crear-entorno-de-pruebas">2. Crear entorno de pruebas</h2>
<p>Conéctate como <code>SYS</code> o cualquier usuario con privilegios DBA:</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Crear usuario de prueba</span>
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">USER</span> logminer_test <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> logminer_test;
<span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">CONNECT</span>, <span class="hljs-keyword">RESOURCE</span>, DBA <span class="hljs-keyword">TO</span> logminer_test;
</code></pre>
<h3 id="heading-crear-tabla-y-simular-un-borrado">Crear tabla y simular un borrado:</h3>
<pre><code class="lang-sql"><span class="hljs-comment">-- Conectar como logminer_test</span>
CONN logminer_test/logminer_test

<span class="hljs-comment">-- Crear tabla</span>
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> empleados (
  <span class="hljs-keyword">id</span> <span class="hljs-built_in">NUMBER</span> PRIMARY <span class="hljs-keyword">KEY</span>,
  nombre <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">100</span>)
);

<span class="hljs-comment">-- Insertar registros</span>
<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> empleados <span class="hljs-keyword">VALUES</span> (<span class="hljs-number">1</span>, <span class="hljs-string">'Carlos'</span>);
<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> empleados <span class="hljs-keyword">VALUES</span> (<span class="hljs-number">2</span>, <span class="hljs-string">'María'</span>);
<span class="hljs-keyword">COMMIT</span>;

<span class="hljs-comment">-- Simular borrado accidental</span>
<span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> empleados <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">id</span> = <span class="hljs-number">1</span>;
<span class="hljs-keyword">COMMIT</span>;
</code></pre>
<hr />
<h2 id="heading-3-habilitar-logminer">3. Habilitar LogMiner</h2>
<p>Ahora, desde el usuario SYS o DBA:</p>
<h3 id="heading-ver-logs-disponibles">Ver logs disponibles:</h3>
<pre><code class="lang-sql">COL MEMBER FOR A100
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">GROUP</span><span class="hljs-comment">#, MEMBER FROM V$LOGFILE;</span>

<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">SEQUENCE</span><span class="hljs-comment">#, FIRST_TIME, NEXT_TIME, STATUS </span>
<span class="hljs-keyword">FROM</span> V$ARCHIVED_LOG 
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> <span class="hljs-keyword">SEQUENCE</span><span class="hljs-comment"># DESC;</span>
</code></pre>
<h3 id="heading-agregar-archivo-de-log-ajusta-la-ruta">Agregar archivo de log (ajusta la ruta):</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">BEGIN</span>
  DBMS_LOGMNR.ADD_LOGFILE(
    LOGFILENAME =&gt; <span class="hljs-string">'/u01/app/oracle/oradata/ORCL/redo01.log'</span>,
    OPTIONS =&gt; DBMS_LOGMNR.NEW
  );
<span class="hljs-keyword">END</span>;
/
</code></pre>
<h3 id="heading-iniciar-sesion-de-logminer">Iniciar sesión de LogMiner:</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">BEGIN</span>
  DBMS_LOGMNR.START_LOGMNR(
    OPTIONS =&gt; DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
  );
<span class="hljs-keyword">END</span>;
/
</code></pre>
<hr />
<h2 id="heading-4-consultar-los-cambios">4. Consultar los cambios</h2>
<p>Consulta la vista <code>V$LOGMNR_CONTENTS</code> para inspeccionar lo ocurrido:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> 
  TO_CHAR(<span class="hljs-built_in">TIMESTAMP</span>, <span class="hljs-string">'YYYY-MM-DD HH24:MI:SS'</span>) <span class="hljs-keyword">AS</span> hora,
  OPERATION,
  SQL_REDO,
  SQL_UNDO,
  USERNAME,
  TABLE_NAME
<span class="hljs-keyword">FROM</span> 
  V$LOGMNR_CONTENTS
<span class="hljs-keyword">WHERE</span> 
  TABLE_NAME = <span class="hljs-string">'EMPLEADOS'</span>
  <span class="hljs-keyword">AND</span> USERNAME = <span class="hljs-string">'LOGMINER_TEST'</span>
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> hora;
</code></pre>
<p><strong>Tip:</strong> Deberías ver una fila con operación <code>DELETE</code>, donde el campo <code>SQL_UNDO</code> te indica cómo revertirla.</p>
<hr />
<h2 id="heading-5-restaurar-dato-borrado">5. Restaurar dato borrado</h2>
<p>Toma el <code>SQL_UNDO</code> y ejecútalo para restaurar:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> empleados <span class="hljs-keyword">VALUES</span> (<span class="hljs-number">1</span>, <span class="hljs-string">'Carlos'</span>);
<span class="hljs-keyword">COMMIT</span>;
</code></pre>
<hr />
<h2 id="heading-6-finalizar-sesion-logminer">6. Finalizar sesión LogMiner</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">BEGIN</span>
  DBMS_LOGMNR.END_LOGMNR;
<span class="hljs-keyword">END</span>;
/
</code></pre>
<hr />
<h2 id="heading-comparacion-rapida-con-otras-tecnicas">Comparación rápida con otras técnicas</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Técnica</td><td>Licencia</td><td>Complejidad</td><td>Ideal para</td></tr>
</thead>
<tbody>
<tr>
<td><strong>LogMiner</strong></td><td>Incluida</td><td>Media</td><td>Auditoría, recuperación puntual</td></tr>
<tr>
<td>Flashback Query</td><td>Enterprise</td><td>Baja</td><td>Reversiones rápidas</td></tr>
<tr>
<td>RMAN + Restore Point</td><td>Cualquier</td><td>Alta</td><td>Recuperación de desastres</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-tips-finales-para-produccion">Tips finales para producción</h2>
<ul>
<li><p>Siempre prueba en un entorno no productivo primero.</p>
</li>
<li><p>Automatiza la adición de logs usando scripts basados en <code>V$ARCHIVED_LOG</code>.</p>
</li>
<li><p>Si necesitas auditar constantemente, evalúa crear una tabla de auditoría personalizada basada en los resultados de LogMiner.</p>
</li>
<li><p>No olvides revocar el rol DBA al usuario de pruebas una vez finalizado el ejercicio.</p>
</li>
</ul>
<hr />
<h2 id="heading-nivel-avanzado-para-seguir-explorando">Nivel Avanzado (para seguir explorando)</h2>
<ul>
<li><p>Agregar múltiples archivos de log con <code>DBMS_LOGMNR.ADD_LOGFILE</code>.</p>
</li>
<li><p>Filtrar por SCN o timestamp para acotar los resultados.</p>
</li>
<li><p>Exportar los datos de <code>V$LOGMNR_CONTENTS</code> a una tabla intermedia.</p>
</li>
<li><p>Automatizar la recuperación con un procedimiento PL/SQL.</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p><strong>LogMiner</strong> es una herramienta potente y poco explotada, ideal para recuperación puntual y auditoría detallada. Aunque no reemplaza una estrategia de backup adecuada, puede salvarte en escenarios de pérdida puntual de datos.</p>
<p>¿Te gustaría un artículo sobre cómo otro tipo de <strong>recuperación</strong>? ¡Déjalo en los comentarios o escríbenos a <strong>Admin@LaBoticaDelDBA.com</strong> !</p>
]]></content:encoded></item><item><title><![CDATA[Oracle Database 23ai: Principales novedades]]></title><description><![CDATA[Oracle ha lanzado oficialmente la disponibilidad general de Oracle Database 23ai el 2 de mayo de 2024, como una versión de soporte a largo plazo (Long-Term Support Release)Oracle Database 23ai, una versión que marca un antes y un después en la gestió...]]></description><link>https://laboticadeldba.com/oracle-database-23ai-principales-novedades</link><guid isPermaLink="true">https://laboticadeldba.com/oracle-database-23ai-principales-novedades</guid><category><![CDATA[Oracle 23ai]]></category><category><![CDATA[New Features]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 12 May 2025 17:56:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747072852335/5dbf2bef-174d-4d18-a66a-1abe193861b2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Oracle ha lanzado oficialmente la disponibilidad general de <strong>Oracle Database 23ai</strong> el <strong>2 de mayo de 2024</strong>, como una versión de soporte a largo plazo (Long-Term Support Release)<strong>Oracle Database 23ai</strong>, una versión que marca un antes y un después en la gestión avanzada de datos, gracias a la integración de inteligencia artificial, mejoras de rendimiento y capacidades modernas de administración. Esta nueva iteración está diseñada no solo para manejar grandes volúmenes de datos, sino también para operar de forma más inteligente, eficiente y segura en entornos empresariales y en la nube.</p>
<p>En este artículo de <em>La Botica del DBA</em>, te contamos cuáles son las <strong>nuevas características clave de Oracle Database 23ai</strong> y cómo pueden transformar tu día a día como DBA.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747072620531/780db051-04dc-4474-bbe3-188189149235.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-1-ai-vector-search">🔍 <strong>1. AI Vector Search</strong></h2>
<p>Una de las grandes innovaciones de Oracle 23ai es la <strong>búsqueda vectorial</strong> integrada en la base de datos. Esta funcionalidad permite realizar búsquedas semánticas usando vectores de embedding, fundamentales para integrar modelos de lenguaje (LLMs) y arquitecturas de RAG (Retrieval-Augmented Generation).</p>
<blockquote>
<p>Ideal para aplicaciones que requieren recuperación inteligente de información, como asistentes virtuales, motores de recomendación y análisis de texto avanzado.</p>
</blockquote>
<hr />
<h2 id="heading-2-true-cache">⚡ <strong>2. True Cache</strong></h2>
<p><strong>True Cache</strong> ofrece una capa de caché altamente optimizada que reduce la latencia al mínimo en consultas frecuentes. A diferencia de las soluciones externas, esta cache es completamente coherente con los datos base.</p>
<blockquote>
<p>Beneficio directo: mayor rendimiento para aplicaciones OLTP sin sacrificar consistencia.</p>
</blockquote>
<hr />
<h2 id="heading-3-sharding-mejorado">🌐 <strong>3. Sharding mejorado</strong></h2>
<p>Oracle 23ai refuerza su capacidad de <strong>Sharding</strong>, permitiendo distribuir bases de datos en múltiples nodos con mayor flexibilidad, rendimiento y tolerancia a fallos. Esta funcionalidad es fundamental para entornos que necesitan escalabilidad horizontal real.</p>
<blockquote>
<p>Ahora es más fácil administrar grandes volúmenes de datos repartidos en múltiples regiones o nubes.</p>
</blockquote>
<hr />
<h2 id="heading-4-tablas-blockchain">🔐 <strong>4. Tablas Blockchain</strong></h2>
<p>Las <strong>Blockchain Tables</strong> evolucionan en esta versión con mayor eficiencia y herramientas de auditoría integradas. Son ideales para registros inmutables y trazabilidad completa.</p>
<blockquote>
<p>Útiles en contextos financieros, legales, logísticos o de cumplimiento normativo.</p>
</blockquote>
<hr />
<h2 id="heading-5-migracion-de-datos-con-rman">🛠️ <strong>5. Migración de datos con RMAN</strong></h2>
<p>Ahora es posible utilizar <strong>Oracle RMAN</strong> para realizar <strong>migraciones de datos entre bases de datos activas</strong>, lo que reduce el downtime y simplifica las tareas de consolidación y modernización de entornos.</p>
<hr />
<h2 id="heading-6-soporte-para-wide-tables">🧩 <strong>6. Soporte para Wide Tables</strong></h2>
<p>Oracle 23ai expande el límite de columnas en una tabla, soportando hasta <strong>5,000 columnas</strong> por tabla (anteriormente 1,000). Esto facilita el modelado de datos complejos sin necesidad de estructuras adicionales.</p>
<hr />
<h2 id="heading-7-lock-free-reservations">🚦 <strong>7. Lock-Free Reservations</strong></h2>
<p>Nueva tecnología de administración de concurrencia que permite <strong>reservas de recursos sin bloqueo</strong>, mejorando el rendimiento en cargas altamente concurrentes.</p>
<hr />
<h2 id="heading-8-mejoras-en-arquitectura-y-rendimiento">🧱 <strong>8. Mejoras en arquitectura y rendimiento</strong></h2>
<ul>
<li><p>Optimización en estructuras de memoria y uso del PGA/SGA.</p>
</li>
<li><p>Menor consumo de CPU en operaciones comunes.</p>
</li>
<li><p>Planes de ejecución más inteligentes.</p>
</li>
<li><p>Mejoras nativas para entornos <strong>multitenant</strong> y <strong>PDBs</strong>.</p>
</li>
</ul>
<hr />
<h2 id="heading-9-seguridad-reforzada">🔒 <strong>9. Seguridad reforzada</strong></h2>
<p>Incluye herramientas como:</p>
<ul>
<li><p><strong>SQL Firewall</strong>: para limitar y auditar sentencias permitidas.</p>
</li>
<li><p>Gestión más granular de privilegios.</p>
</li>
<li><p>Integración con herramientas de auditoría modernas y cifrado nativo.</p>
</li>
</ul>
<hr />
<h2 id="heading-preparado-para-la-nube">☁️ <strong>Preparado para la nube</strong></h2>
<p>Oracle Database 23ai está pensado para la nube desde su diseño. Disponible en:</p>
<ul>
<li><p><strong>Oracle Cloud Infrastructure (OCI)</strong></p>
</li>
<li><p><strong>Base Database Service</strong></p>
</li>
<li><p><strong>Autonomous Database</strong> (en próximas integraciones)</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">✅ <strong>Conclusión</strong></h2>
<p>Oracle Database 23ai no es solo una actualización: es un nuevo estándar para bases de datos modernas, inteligentes y listas para la nube. Para los DBAs, representa una oportunidad de adoptar herramientas de última generación y mejorar la eficiencia operativa sin comprometer seguridad ni rendimiento.</p>
<p>Desde <em>La Botica del DBA</em>, te animamos a explorar cada una de estas funcionalidades, incorporarlas en tu práctica diaria y mantenerte actualizado en este nuevo capítulo de la administración de datos.</p>
]]></content:encoded></item><item><title><![CDATA[Tutorial: Instalación de Oracle Grid Infrastructure 21c, RDBMS y Creación de Base de Datos 21c.]]></title><description><![CDATA[Requisitos Previos

Sistema Operativo: Linux 8.

Usuario: Acceso de root o un usuario con privilegios de sudo.

Espacio en Disco: Al menos 20 GB de espacio libre (para Grid, RDBMS y la base de datos).

Memoria RAM: Mínimo 4 GB (recomendado 8 GB o más...]]></description><link>https://laboticadeldba.com/tutorial-instalacion-de-oracle-grid-infrastructure-21c-rdbms-y-creacion-de-base-de-datos-21c</link><guid isPermaLink="true">https://laboticadeldba.com/tutorial-instalacion-de-oracle-grid-infrastructure-21c-rdbms-y-creacion-de-base-de-datos-21c</guid><category><![CDATA[Oracle 21c]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[grid]]></category><category><![CDATA[RDBMS]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[infrastructure]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 12 May 2025 17:41:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747071384210/122f98cf-c9b3-49e3-9a89-f65ecf5193fd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-requisitos-previos"><strong>Requisitos Previos</strong></h3>
<ol>
<li><p><strong>Sistema Operativo</strong>: Linux 8.</p>
</li>
<li><p><strong>Usuario</strong>: Acceso de root o un usuario con privilegios de sudo.</p>
</li>
<li><p><strong>Espacio en Disco</strong>: Al menos 20 GB de espacio libre (para Grid, RDBMS y la base de datos).</p>
</li>
<li><p><strong>Memoria RAM</strong>: Mínimo 4 GB (recomendado 8 GB o más).</p>
</li>
<li><p><strong>Descarga de Software</strong>:</p>
<ul>
<li><p>Oracle Grid Infrastructure 21c desde <a target="_blank" href="https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html">OTN</a>.</p>
</li>
<li><p>Oracle Database 21c desde <a target="_blank" href="https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html">OTN</a>.</p>
</li>
</ul>
</li>
</ol>
<hr />
<h3 id="heading-paso-1-preparar-el-entorno"><strong>Paso 1: Preparar el Entorno</strong></h3>
<ol>
<li><p><strong>Actualizar el Sistema</strong>:</p>
<pre><code class="lang-sql"> sudo yum <span class="hljs-keyword">update</span> -y
</code></pre>
</li>
<li><p><strong>Instalar Paquetes Requeridos</strong>:</p>
<pre><code class="lang-sql"> sudo yum <span class="hljs-keyword">install</span> -y <span class="hljs-keyword">oracle</span>-<span class="hljs-keyword">database</span>-preinstall<span class="hljs-number">-21</span>c
</code></pre>
</li>
<li><p><strong>Configurar Usuario y Grupos</strong>:<br /> Verifica que el usuario <code>oracle</code> y los grupos <code>oinstall</code>, <code>dba</code>, y <code>oper</code> estén creados:</p>
<pre><code class="lang-sql"> id oracle
</code></pre>
</li>
<li><p><strong>Configurar Variables de Entorno</strong>:<br /> Edita el archivo <code>.bash_profile</code> del usuario <code>oracle</code>:</p>
<pre><code class="lang-sql"> su - oracle
 vi ~/.bash_profile
</code></pre>
<p> Agrega las siguientes líneas:</p>
<pre><code class="lang-sql"> export ORACLE_BASE=/opt/oracle
 export ORACLE_HOME=/opt/oracle/product/21c/grid
 export ORACLE_SID=+ASM
 export PATH=$ORACLE_HOME/bin:$PATH
 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
</code></pre>
<p> Guarda y cierra el archivo, luego ejecuta:</p>
<pre><code class="lang-sql"> source ~/.bash_profile
</code></pre>
</li>
</ol>
<hr />
<h3 id="heading-paso-2-instalar-oracle-grid-infrastructure"><strong>Paso 2: Instalar Oracle Grid Infrastructure</strong></h3>
<ol>
<li><p><strong>Descomprimir el Software de Grid</strong>:<br /> Copia el archivo descargado (por ejemplo, <code>LINUX.X64_213000_grid_home.zip</code>) a un directorio temporal:</p>
<pre><code class="lang-sql"> sudo mv LINUX.X64_213000_grid_home.zip /tmp/
 sudo unzip /tmp/LINUX.X64_213000_grid_home.zip -d /opt/oracle/product/21c/grid
 sudo chown -R oracle:oinstall /opt/oracle
</code></pre>
</li>
<li><p><strong>Crear Archivo de Respuestas para Grid</strong>:<br /> Crea un archivo llamado <code>grid_install.rsp</code>:</p>
<pre><code class="lang-sql"> vi /opt/oracle/product/21c/grid/grid_install.rsp
</code></pre>
<p> Agrega el siguiente contenido:</p>
<p> ini</p>
<pre><code class="lang-sql"> oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v21.0.0
 oracle.install.option=HA_CONFIG
 ORACLE_BASE=/opt/oracle
 ORACLE_HOME=/opt/oracle/product/21c/grid
 oracle.install.asm.OSDBA=asmdba
 oracle.install.asm.OSOPER=asmoper
 oracle.install.asm.OSASM=asmadmin
 oracle.install.crs.config.gpnp.scanName=scan-cluster
 oracle.install.crs.config.gpnp.scanPort=1521
 oracle.install.crs.config.ClusterConfiguration=STANDALONE
 oracle.install.crs.config.configureAsmCluster=true
 oracle.install.crs.config.gpnp.configureGNS=false
 oracle.install.crs.config.autoConfigureClusterNodeVIP=false
 oracle.install.asm.SYSASMPassword=Oracle_123
 oracle.install.asm.diskGroup.name=DATA
 oracle.install.asm.diskGroup.redundancy=EXTERNAL
 oracle.install.asm.diskGroup.disks=/dev/sdb1
 oracle.install.asm.diskGroup.diskDiscoveryString=/dev/sdb*
</code></pre>
</li>
<li><p><strong>Ejecutar la Instalación de Grid en Modo Silent</strong>:</p>
<pre><code class="lang-sql"> cd /opt/oracle/product/21c/grid
 ./gridSetup.sh -silent -responseFile /opt/oracle/product/21c/grid/grid_install.rsp
</code></pre>
</li>
<li><p><strong>Ejecutar Scripts de Post-Instalación</strong>:<br /> Al finalizar, ejecuta los scripts como root:</p>
<pre><code class="lang-sql"> sudo /opt/oracle/product/21c/grid/root.sh
</code></pre>
</li>
</ol>
<hr />
<h3 id="heading-paso-3-instalar-oracle-rdbms"><strong>Paso 3: Instalar Oracle RDBMS</strong></h3>
<ol>
<li><p><strong>Descomprimir el Software de RDBMS</strong>:<br /> Copia el archivo descargado (por ejemplo, <code>LINUX.X64_213000_db_home.zip</code>) a un directorio temporal:</p>
<pre><code class="lang-sql"> sudo mv LINUX.X64_213000_db_home.zip /tmp/
 sudo unzip /tmp/LINUX.X64_213000_db_home.zip -d /opt/oracle/product/21c/dbhome_1
 sudo chown -R oracle:oinstall /opt/oracle
</code></pre>
</li>
<li><p><strong>Crear Archivo de Respuestas para RDBMS</strong>:<br /> Crea un archivo llamado <code>db_install.rsp</code>:</p>
<pre><code class="lang-sql"> vi /opt/oracle/product/21c/dbhome_1/db_install.rsp
</code></pre>
<p> Agrega el siguiente contenido:</p>
<pre><code class="lang-sql"> oracle.install.responseFileVersion=/oracle/<span class="hljs-keyword">install</span>/rspfmt_dbinstall_response_schema_v21<span class="hljs-number">.0</span><span class="hljs-number">.0</span>
 oracle.install.option=INSTALL_DB_SWONLY
 ORACLE_HOSTNAME=localhost
 UNIX_GROUP_NAME=oinstall
 INVENTORY_LOCATION=/opt/<span class="hljs-keyword">oracle</span>/oraInventory
 ORACLE_HOME=/opt/<span class="hljs-keyword">oracle</span>/product/<span class="hljs-number">21</span>c/dbhome_1
 ORACLE_BASE=/opt/<span class="hljs-keyword">oracle</span>
 oracle.install.db.InstallEdition=EE
 oracle.install.db.OSDBA_GROUP=dba
 oracle.install.db.OSOPER_GROUP=oper
 oracle.install.db.OSBACKUPDBA_GROUP=dba
 oracle.install.db.OSDGDBA_GROUP=dba
 oracle.install.db.OSKMDBA_GROUP=dba
 oracle.install.db.OSRACDBA_GROUP=dba
 SECURITY_UPDATES_VIA_MYORACLESUPPORT=<span class="hljs-literal">false</span>
 DECLINE_SECURITY_UPDATES=<span class="hljs-literal">true</span>
</code></pre>
</li>
<li><p><strong>Ejecutar la Instalación de RDBMS en Modo Silent</strong>:</p>
<pre><code class="lang-sql"> cd /opt/oracle/product/21c/dbhome_1
 ./runInstaller -silent -responseFile /opt/oracle/product/21c/dbhome_1/db_install.rsp
</code></pre>
</li>
<li><p><strong>Ejecutar Scripts de Post-Instalación</strong>:<br /> Al finalizar, ejecuta los scripts como root:</p>
<pre><code class="lang-sql"> sudo /opt/oracle/oraInventory/orainstRoot.sh
 sudo /opt/oracle/product/21c/dbhome_1/root.sh
</code></pre>
</li>
</ol>
<hr />
<h3 id="heading-paso-4-crear-la-base-de-datos-con-asm"><strong>Paso 4: Crear la Base de Datos con ASM</strong></h3>
<ol>
<li><p><strong>Crear Archivo de Respuestas para DBCA</strong>:<br /> Crea un archivo llamado <code>dbca.rsp</code>:</p>
<pre><code class="lang-sql"> vi /opt/oracle/product/21c/dbhome_1/dbca.rsp
</code></pre>
<p> Agrega el siguiente contenido:</p>
<pre><code class="lang-sql"> responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v21.0.0
 gdbName=orcl
 sid=orcl
 databaseConfigType=SI
 storageType=ASM
 diskGroupName=DATA
 recoveryGroupName=RECO
 characterSet=AL32UTF8
 nationalCharacterSet=AL16UTF16
</code></pre>
</li>
<li><p><strong>Ejecutar DBCA en Modo Silent</strong>:</p>
<pre><code class="lang-sql"> dbca -silent -createDatabase -responseFile /opt/oracle/product/21c/dbhome_1/dbca.rsp
</code></pre>
</li>
</ol>
<hr />
<h3 id="heading-paso-5-verificar-la-instalacion"><strong>Paso 5: Verificar la Instalación</strong></h3>
<ol>
<li><p><strong>Conectar a la Base de Datos</strong>:</p>
<pre><code class="lang-sql"> sqlplus / as sysdba
</code></pre>
</li>
<li><p><strong>Verificar el Almacenamiento ASM</strong>:</p>
<pre><code class="lang-sql"> <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">name</span>, total_mb, free_mb <span class="hljs-keyword">FROM</span> v$asm_diskgroup;
</code></pre>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[🔐 Tutorial: Bloqueo de Usuarios Genéricos por S.O. al Esquema BOTICARIO en BOTICA_DB]]></title><description><![CDATA[🎯 Objetivo
Este tutorial documenta cómo implementar una política de seguridad en Oracle que bloquea conexiones al esquema BOTICARIO basándose en el nombre del usuario del sistema operativo (OS_USER).
Incluye:

Tablas de control y auditoría

Trigger ...]]></description><link>https://laboticadeldba.com/tutorial-bloqueo-de-usuarios-genericos-por-so-al-esquema-boticario-en-boticadb</link><guid isPermaLink="true">https://laboticadeldba.com/tutorial-bloqueo-de-usuarios-genericos-por-so-al-esquema-boticario-en-boticadb</guid><category><![CDATA[Oracle Database]]></category><category><![CDATA[PL/SQL]]></category><category><![CDATA[oracle pl/sql]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Wed, 07 May 2025 19:10:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746644808691/cd25e91e-7923-47db-9049-d536a46210be.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-objetivo">🎯 Objetivo</h2>
<p>Este tutorial documenta cómo implementar una política de seguridad en Oracle que <strong>bloquea conexiones al esquema BOTICARIO</strong> basándose en el nombre del usuario del sistema operativo (<code>OS_USER</code>).</p>
<p>Incluye:</p>
<ul>
<li><p>Tablas de control y auditoría</p>
</li>
<li><p>Trigger de conexión</p>
</li>
<li><p>Procedimientos administrativos</p>
</li>
<li><p>Paquete PL/SQL centralizado para gestión</p>
</li>
</ul>
<blockquote>
<p>💡 Ideal para entornos donde se requiere <strong>seguridad granular y trazabilidad de accesos no autorizados</strong>.</p>
</blockquote>
<hr />
<h2 id="heading-1-preparacion-del-entorno">1️⃣ Preparación del Entorno</h2>
<h3 id="heading-crear-el-esquema-de-seguridad">👤 Crear el esquema de seguridad</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">USER</span> SEGURIDAD <span class="hljs-keyword">IDENTIFIED</span> <span class="hljs-keyword">BY</span> tu_contraseña_segura;
<span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">CONNECT</span>, <span class="hljs-keyword">RESOURCE</span> <span class="hljs-keyword">TO</span> SEGURIDAD;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">USER</span> SEGURIDAD <span class="hljs-keyword">QUOTA</span> <span class="hljs-keyword">UNLIMITED</span> <span class="hljs-keyword">ON</span> <span class="hljs-keyword">USERS</span>;
</code></pre>
<hr />
<h2 id="heading-2-crear-tabla-de-usuarios-bloqueados">2️⃣ Crear tabla de usuarios bloqueados</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO (
  OS_USERNAME <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>) PRIMARY <span class="hljs-keyword">KEY</span>
)
<span class="hljs-keyword">TABLESPACE</span> <span class="hljs-keyword">USERS</span>;
</code></pre>
<hr />
<h2 id="heading-3-crear-tabla-de-auditoria-de-accesos">3️⃣ Crear tabla de auditoría de accesos</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS (
  OS_USERNAME <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>),
  USERNAME    <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>),
  FECHA       <span class="hljs-built_in">DATE</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">SYSDATE</span>
)
<span class="hljs-keyword">TABLESPACE</span> <span class="hljs-keyword">USERS</span>;
</code></pre>
<hr />
<h2 id="heading-4-otorgar-permisos-al-trigger">4️⃣ Otorgar permisos al trigger</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">ON</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO <span class="hljs-keyword">TO</span> SISTEMA;
</code></pre>
<hr />
<h2 id="heading-5-crear-trigger-de-logon-a-nivel-de-base-de-datos">5️⃣ Crear trigger de LOGON a nivel de base de datos</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">TRIGGER</span> SISTEMA.TRG_BLOQUEO_USUARIOS_BOTICARIO
<span class="hljs-keyword">AFTER</span> <span class="hljs-keyword">LOGON</span> <span class="hljs-keyword">ON</span> <span class="hljs-keyword">DATABASE</span>
<span class="hljs-keyword">DECLARE</span>
  v_osuser   <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>);
  v_username VARCHAR2(30);
  v_count    NUMBER := 0;
<span class="hljs-keyword">BEGIN</span>
  v_osuser   := SYS_CONTEXT(<span class="hljs-string">'USERENV'</span>, <span class="hljs-string">'OS_USER'</span>);
  v_username := SYS_CONTEXT('USERENV', 'SESSION_USER');

  IF UPPER(v_username) = 'BOTICARIO' THEN
    <span class="hljs-keyword">BEGIN</span>
      <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">INTO</span> v_count
      <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
      <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">LOWER</span>(OS_USERNAME) = <span class="hljs-keyword">LOWER</span>(v_osuser);
    EXCEPTION
      WHEN OTHERS THEN NULL;
    <span class="hljs-keyword">END</span>;

    IF v_count &gt; 0 THEN
      <span class="hljs-keyword">BEGIN</span>
        <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS (OS_USERNAME, USERNAME)
        <span class="hljs-keyword">VALUES</span> (v_osuser, v_username);
        <span class="hljs-keyword">COMMIT</span>;
      EXCEPTION
        WHEN OTHERS THEN NULL;
      <span class="hljs-keyword">END</span>;

      RAISE_APPLICATION_ERROR(-20001, 'Acceso denegado para usuario con esquema BOTICARIO');
    <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
  <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
<span class="hljs-keyword">END</span>;
/
</code></pre>
<hr />
<h2 id="heading-6-insertar-usuarios-del-so-a-bloquear">6️⃣ Insertar usuarios del S.O. a bloquear</h2>
<h3 id="heading-insercion-directa">✅ Inserción directa</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO (OS_USERNAME)
<span class="hljs-keyword">VALUES</span> (<span class="hljs-string">'DOCTORCHAPATIN'</span>);
<span class="hljs-keyword">COMMIT</span>;
</code></pre>
<h3 id="heading-insercion-condicional">🛡️ Inserción condicional</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">DECLARE</span>
    v_count PLS_INTEGER;
<span class="hljs-keyword">BEGIN</span>
    <span class="hljs-keyword">FOR</span> usr <span class="hljs-keyword">IN</span> (
        <span class="hljs-keyword">SELECT</span> <span class="hljs-string">'DOCTORCHAPATIN'</span> <span class="hljs-keyword">AS</span> username <span class="hljs-keyword">FROM</span> DUAL 
    ) <span class="hljs-keyword">LOOP</span>
        <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">INTO</span> v_count
        <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
        <span class="hljs-keyword">WHERE</span> OS_USERNAME = usr.username;

        IF v_count = 0 THEN
            <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO (OS_USERNAME)
            <span class="hljs-keyword">VALUES</span> (usr.username);
        <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
    <span class="hljs-keyword">END</span> <span class="hljs-keyword">LOOP</span>;
<span class="hljs-keyword">END</span>;
/
</code></pre>
<hr />
<h2 id="heading-7-eliminar-usuarios-bloqueados">7️⃣ Eliminar usuarios bloqueados</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
<span class="hljs-keyword">WHERE</span> OS_USERNAME = <span class="hljs-string">'DOCTORCHAPATIN'</span>;
<span class="hljs-keyword">COMMIT</span>;
</code></pre>
<hr />
<h2 id="heading-8-limpiar-tabla-de-auditoria">8️⃣ Limpiar tabla de auditoría</h2>
<h3 id="heading-opcion-1-borrado-con-conservacion-de-espacio">Opción 1: Borrado con conservación de espacio</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS;
<span class="hljs-keyword">COMMIT</span>;
</code></pre>
<h3 id="heading-opcion-2-truncado-mas-rapido">Opción 2: Truncado (más rápido)</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">TRUNCATE</span> <span class="hljs-keyword">TABLE</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS;
</code></pre>
<hr />
<h2 id="heading-9-consultar-registros">9️⃣ Consultar registros</h2>
<h3 id="heading-usuarios-bloqueados">Usuarios bloqueados</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> OS_USERNAME;
</code></pre>
<h3 id="heading-auditoria-de-accesos-denegados">Auditoría de accesos denegados</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> FECHA <span class="hljs-keyword">DESC</span>;
</code></pre>
<hr />
<h2 id="heading-rollback-completo-reversion">🔁 Rollback completo (Reversión)</h2>
<pre><code class="lang-sql"><span class="hljs-comment">-- Eliminar trigger</span>
<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TRIGGER</span> SISTEMA.TRG_BLOQUEO_USUARIOS_BOTICARIO;

<span class="hljs-comment">-- Eliminar tablas</span>
<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> SEGURIDAD.LOG_ACCESOS_BLOQUEADOS <span class="hljs-keyword">PURGE</span>;
<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO <span class="hljs-keyword">PURGE</span>;

<span class="hljs-comment">-- Eliminar usuario</span>
<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">USER</span> SEGURIDAD <span class="hljs-keyword">CASCADE</span>;
</code></pre>
<hr />
<h2 id="heading-bonus-paquete-plsql-para-gestion-de-usuarios">🎁 BONUS: Paquete PL/SQL para Gestión de Usuarios</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">PACKAGE</span> SEGURIDAD.PKG_GESTION_BLOQUEOS <span class="hljs-keyword">AS</span>
  <span class="hljs-keyword">PROCEDURE</span> AGREGAR_USUARIO(p_os_user <span class="hljs-built_in">VARCHAR2</span>);
  PROCEDURE ELIMINAR_USUARIO(p_os_user VARCHAR2);
  FUNCTION ESTA_BLOQUEADO(p_os_user VARCHAR2) RETURN BOOLEAN;
<span class="hljs-keyword">END</span>;
/

<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">PACKAGE</span> <span class="hljs-keyword">BODY</span> SEGURIDAD.PKG_GESTION_BLOQUEOS <span class="hljs-keyword">AS</span>

  <span class="hljs-keyword">PROCEDURE</span> AGREGAR_USUARIO(p_os_user <span class="hljs-built_in">VARCHAR2</span>) <span class="hljs-keyword">IS</span>
    v_count <span class="hljs-built_in">NUMBER</span>;
  <span class="hljs-keyword">BEGIN</span>
    <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">INTO</span> v_count
    <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
    <span class="hljs-keyword">WHERE</span> OS_USERNAME = <span class="hljs-keyword">UPPER</span>(p_os_user);

    IF v_count = 0 THEN
      <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO (OS_USERNAME)
      <span class="hljs-keyword">VALUES</span> (<span class="hljs-keyword">UPPER</span>(p_os_user));
      <span class="hljs-keyword">COMMIT</span>;
    <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;
  <span class="hljs-keyword">END</span>;

  PROCEDURE ELIMINAR_USUARIO(p_os_user VARCHAR2) IS
  <span class="hljs-keyword">BEGIN</span>
    <span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
    <span class="hljs-keyword">WHERE</span> OS_USERNAME = <span class="hljs-keyword">UPPER</span>(p_os_user);
    <span class="hljs-keyword">COMMIT</span>;
  <span class="hljs-keyword">END</span>;

  FUNCTION ESTA_BLOQUEADO(p_os_user VARCHAR2) RETURN BOOLEAN IS
    v_count NUMBER;
  <span class="hljs-keyword">BEGIN</span>
    <span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">INTO</span> v_count
    <span class="hljs-keyword">FROM</span> SEGURIDAD.USUARIOS_BLOQUEADOS_BOTICARIO
    <span class="hljs-keyword">WHERE</span> OS_USERNAME = <span class="hljs-keyword">UPPER</span>(p_os_user);
    RETURN v_count &gt; 0;
  <span class="hljs-keyword">END</span>;

<span class="hljs-keyword">END</span>;
/
</code></pre>
<blockquote>
<p>✅ Con este paquete puedes hacer llamadas como:</p>
</blockquote>
<pre><code class="lang-sql">EXEC SEGURIDAD.PKG_GESTION_BLOQUEOS.AGREGAR_USUARIO('USUARIOX');
</code></pre>
<hr />
<h2 id="heading-notas-finales">⚠️ Notas Finales</h2>
<ul>
<li><p>El trigger impide el acceso a cualquier sesión que intente conectarse como BOTICARIO si el <code>OS_USER</code> está registrado como bloqueado.</p>
</li>
<li><p>Todo intento denegado es <strong>auditable</strong>, quedando trazado en <code>LOG_ACCESOS_BLOQUEADOS</code>.</p>
</li>
<li><p>La solución es <strong>reversible y extensible</strong>: puedes integrarla con alertas, jobs automáticos, etc.</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">🧠 Conclusión</h2>
<p>Este procedimiento permite a administradores Oracle mantener <strong>control granular, auditable y automatizable</strong> sobre accesos al esquema BOTICARIO. Una medida esencial en entornos donde la trazabilidad y el cumplimiento de políticas de seguridad son clave.</p>
<hr />
<p>📡 <strong>¿Te gustó esta receta de monitoreo técnico?</strong><br />Explora más artículos, diagnósticos y herramientas en <a target="_blank" href="https://laboticadeldba.com">https://laboticadeldba.com</a>, el espacio donde los colegas DBAs encuentran materia alquímica para hacer <strong>oro con sus entornos Oracle</strong> y resguardar su seguridad.</p>
<p>🧪 <strong>Comparte este artículo con tus colegas</strong> y no dejes tu infraestructura sin receta.<br />En <strong>La Botica del DBA</strong> te ofrecemos los mejores elixires para el <strong>rendimiento, la seguridad y la gobernabilidad de tus datos</strong>, preparados con experiencia, precisión y pasión por la tecnología.</p>
<p>💊 Porque todo buen sistema merece una buena dosis de <strong>monitoreo inteligente, automatización efectiva y control preventivo</strong>.</p>
<p>🔍 Desde un trigger bien afinado hasta un tuning quirúrgico, aquí destilamos soluciones reales para retos reales.<br /><strong>Síguenos, experimenta y comparte</strong> — y que nunca falte botica en tu administración de bases de datos diaria.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Zero Downtime Migration (ZDM) de Oracle: ¿Cero Downtime de verdad?]]></title><description><![CDATA[🔬 Caso de Estudio: Migración desde On-Premise a Oracle Cloud Infrastructure (OCI)
Publicado en La Botica del DBA
Oracle promete "Zero Downtime" al migrar a la nube. Pero como DBA, uno tiene el deber de hacerse la pregunta obligada: ¿ese "cero" es un...]]></description><link>https://laboticadeldba.com/zero-downtime-migration-zdm-de-oracle-cero-downtime-de-verdad</link><guid isPermaLink="true">https://laboticadeldba.com/zero-downtime-migration-zdm-de-oracle-cero-downtime-de-verdad</guid><category><![CDATA[zero downtime migration]]></category><category><![CDATA[Zero Downtime]]></category><category><![CDATA[zdm]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[On Premise]]></category><category><![CDATA[#OCI #OracleCloud #CloudComputing #DataManagement #BigData #CloudStorage #Database #Analytics #AIAutomation #DataEngineering #MachineLearning #DataIntegration #OCIFoundations #CloudData #OracleDatabase #TechLearning]]></category><category><![CDATA[OCI]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 28 Apr 2025 17:16:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745860478617/7cff4325-b61b-4eb8-a6d2-cd0e7910e140.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-caso-de-estudio-migracion-desde-on-premise-a-oracle-cloud-infrastructure-oci">🔬 Caso de Estudio: Migración desde On-Premise a Oracle Cloud Infrastructure (OCI)</h2>
<p><em>Publicado en La Botica del DBA</em></p>
<p>Oracle promete "Zero Downtime" al migrar a la nube. Pero como DBA, uno tiene el deber de hacerse la pregunta obligada: <strong>¿ese "cero" es un cero de verdad o es marketing?</strong> Aquí vamos a diseccionar la herramienta <strong>Oracle Zero Downtime Migration (ZDM)</strong> con ejemplos, contexto y verdades técnicas que te ayudarán a decidir cómo y cuándo usarla.</p>
<hr />
<h2 id="heading-que-es-oracle-zdm">🧠 ¿Qué es Oracle ZDM?</h2>
<p><strong>ZDM</strong> es una herramienta CLI desarrollada por Oracle para facilitar la <strong>migración automatizada</strong> de bases de datos desde entornos <strong>On-Premise a OCI</strong> (o incluso entre regiones OCI). Está diseñada para reducir el downtime a mínimos usando:</p>
<ul>
<li><p><strong>Oracle GoldenGate</strong> (replicación lógica continua).</p>
</li>
<li><p><strong>Oracle Data Guard</strong> (standby físicos activos).</p>
</li>
<li><p><strong>Oracle Data Pump</strong> (en modo offline, si el downtime es aceptable).</p>
</li>
</ul>
<hr />
<h2 id="heading-metodos-de-migracion-soportados">⚙️ Métodos de migración soportados</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Método</td><td>Tiempo de Caída Aproximado</td><td>GoldenGate</td><td>Data Guard</td><td>Data Pump</td></tr>
</thead>
<tbody>
<tr>
<td>Logical Online</td><td>Segundos/minutos</td><td>✅</td><td>❌</td><td>❌</td></tr>
<tr>
<td>Physical Online</td><td>Minutos</td><td>❌</td><td>✅</td><td>❌</td></tr>
<tr>
<td>Logical Offline</td><td>Horas (según volumen)</td><td>❌</td><td>❌</td><td>✅</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-claves-para-lograr-un-zero-downtime-real">💡 Claves para lograr un "Zero Downtime Real"</h2>
<ul>
<li><p>✅ Usar <strong>GoldenGate</strong> para replicar en tiempo real desde origen a destino.</p>
</li>
<li><p>✅ Realizar validaciones previas con ZDM (<code>zdmcli migrate database -mode ANALYZE</code>).</p>
</li>
<li><p>✅ Configurar red segura y de baja latencia entre origen y OCI (VPN o FastConnect).</p>
</li>
<li><p>✅ Planificar el <em>cutover</em> en una ventana de mantenimiento controlada.</p>
</li>
</ul>
<hr />
<h2 id="heading-te-gusto-esta-receta-tecnica">📡 ¿Te gustó esta receta técnica?</h2>
<p>Explora más artículos, diagnósticos y herramientas en <a target="_blank" href="https://laboticadeldba.com">https://laboticadeldba.com</a>, el espacio donde los colegas DBAs encuentran materia alquímica para hacer oro con sus entornos Oracle.</p>
<p>🧪 Comparte este artículo con tus colegas y no dejes tu infraestructura sin receta.</p>
<p>En <strong>La Botica del DBA</strong> te ofrecemos los mejores elixires para el rendimiento, preparados con experiencia, precisión y pasión por la tecnología.</p>
<p>📬 ¿Tienes preguntas o quieres compartir tu experiencia con ZDM? Escribe a: <strong>Admin@LaBoticaDelDBA.com</strong></p>
<p>¡Hasta la próxima fórmula mágica!</p>
]]></content:encoded></item><item><title><![CDATA[⚗️Guía para el Monitoreo de Oracle en Linux con nmon]]></title><description><![CDATA[🧠 ¿Qué es nmon?
nmon (Nigel's Monitor) es una herramienta de monitoreo de rendimiento para sistemas Linux y AIX. Proporciona métricas detalladas en tiempo real sobre el uso de CPU, memoria, discos, red y procesos, siendo especialmente útil para admi...]]></description><link>https://laboticadeldba.com/guia-para-el-monitoreo-de-oracle-en-linux-con-nmon</link><guid isPermaLink="true">https://laboticadeldba.com/guia-para-el-monitoreo-de-oracle-en-linux-con-nmon</guid><category><![CDATA[AIX]]></category><category><![CDATA[Nigel's Monitor]]></category><category><![CDATA[nmonchart]]></category><category><![CDATA[vmstat]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Linux]]></category><category><![CDATA[Linux]]></category><category><![CDATA[awr]]></category><category><![CDATA[statspack]]></category><category><![CDATA[Performance Optimization]]></category><category><![CDATA[nmon]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Tue, 22 Apr 2025 16:09:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745338143261/2ffe103c-a111-4111-98ab-a19ffae6cdc5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-que-es-nmon">🧠 ¿Qué es <code>nmon</code>?</h2>
<p><code>nmon</code> (Nigel's Monitor) es una herramienta de monitoreo de rendimiento para sistemas Linux y AIX. Proporciona métricas detalladas en tiempo real sobre el uso de CPU, memoria, discos, red y procesos, siendo especialmente útil para administradores de bases de datos y sistemas que gestionan entornos Oracle.</p>
<hr />
<h2 id="heading-instalacion-de-nmon-en-oracle-linux">🧪 Instalación de <code>nmon</code> en Oracle Linux</h2>
<h3 id="heading-oracle-linux-7-y-8">Oracle Linux 7 y 8:</h3>
<pre><code class="lang-bash">sudo yum install nmon -y
</code></pre>
<h3 id="heading-oracle-linux-9">Oracle Linux 9:</h3>
<pre><code class="lang-bash">sudo dnf install nmon -y
</code></pre>
<h3 id="heading-alternativa-si-no-esta-en-los-repositorios">Alternativa (si no está en los repositorios):</h3>
<p>Descargar desde 👉 <a target="_blank" href="https://sourceforge.net/projects/nmon/">https://sourceforge.net/projects/nmon/</a></p>
<h2 id="heading-uso-de-nmon-para-monitoreo-de-oracle">🖥️ Uso de <code>nmon</code> para Monitoreo de Oracle</h2>
<p>Una vez instalado, <code>nmon</code> permite monitorear en tiempo real diversos aspectos del sistema que impactan en el rendimiento de una base de datos Oracle.</p>
<h3 id="heading-monitoreo-de-cpu-y-memoria">Monitoreo de CPU y Memoria:</h3>
<ul>
<li><p><code>c</code>: Uso de CPU por núcleo.</p>
</li>
<li><p><code>m</code>: Consumo de memoria RAM y swap.</p>
</li>
</ul>
<h3 id="heading-monitoreo-de-discos">Monitoreo de Discos:</h3>
<ul>
<li><code>d</code>: Lectura/escritura de discos, esencial para detectar cuellos de botella en I/O de Oracle.</li>
</ul>
<h3 id="heading-monitoreo-de-red">Monitoreo de Red:</h3>
<ul>
<li><code>n</code>: Uso de interfaces de red, útil en Oracle RAC o DG.</li>
</ul>
<h3 id="heading-procesos-y-kernel">Procesos y Kernel:</h3>
<ul>
<li><p><code>t</code>: Top de procesos por consumo.</p>
</li>
<li><p><code>k</code>: Estadísticas del kernel.</p>
</li>
</ul>
<hr />
<h2 id="heading-captura-y-analisis-de-datos-con-nmon">💾 Captura y Análisis de Datos con <code>nmon</code></h2>
<p><code>nmon</code> también puede ejecutarse en modo de captura para registrar el comportamiento del sistema:</p>
<pre><code class="lang-bash">nmon -f -s 30 -c 120
</code></pre>
<p>Esto genera un archivo <code>.nmon</code> con datos tomados cada 30 segundos durante una hora.</p>
<h3 id="heading-analisis-con-nmonchart-modo-grafico">Análisis con <code>nmonchart</code> (modo gráfico):</h3>
<ol>
<li><p>Descarga: <a target="_blank" href="https://sourceforge.net/projects/nmon/">https://sourceforge.net/projects/nmon/</a></p>
</li>
<li><p>Ejecuta:</p>
</li>
</ol>
<pre><code class="lang-bash">./nmonchart archivo.nmon
</code></pre>
<p>Esto genera un informe HTML con gráficos interactivos y visuales para análisis detallado.</p>
<hr />
<h2 id="heading-caso-real-diagnostico-de-rendimiento-oracle-con-nmon">🔬 Caso Real: Diagnóstico de Rendimiento Oracle con <code>nmon</code></h2>
<p>En un entorno con Oracle RAC, se presentó lentitud generalizada. Gracias a <code>nmon</code> se identificó:</p>
<ul>
<li><p>Alta contención de CPU en ciertos núcleos.</p>
</li>
<li><p>Procesos de Oracle (<code>ora_dbw0</code>, <code>ora_lgwr</code>) con alto consumo.</p>
</li>
<li><p>Alto I/O en discos ASM compartidos.</p>
</li>
</ul>
<p>Combinando esta información con un reporte AWR de Oracle, se confirmó contención de redo logs. La solución fue aumentar la cantidad de redo log groups.</p>
<hr />
<h2 id="heading-conclusion">🧰 Conclusión</h2>
<ul>
<li><p><code>nmon</code> es una herramienta ligera, poderosa y no intrusiva.</p>
</li>
<li><p>Ideal para DBAs que necesitan visibilidad completa del sistema operativo.</p>
</li>
<li><p>Complementa herramientas como <code>AWR</code>, <code>Statspack</code>, <code>top</code>, <code>vmstat</code>, etc.</p>
</li>
</ul>
<hr />
<p>📡 <strong>¿Te gustó esta receta técnica?</strong><br />Explora más artículos, diagnósticos y herramientas en <a target="_blank" href="https://laboticadeldba.com">https://laboticadeldba.com</a>, el espacio donde los colegas DBAs encuentran materia alquímica para hacer oro con sus entornos Oracle.</p>
<p>🧪 <strong>Comparte este artículo con tus colegas y no dejes tu infraestructura sin receta.</strong><br />En <strong>La Botica del DBA</strong> te ofrecemos los mejores elixires para el rendimiento, preparados con experiencia, precisión y pasión por la tecnología.</p>
<p>💊 <em>Porque todo buen sistema merece una buena dosis de monitoreo inteligente.</em></p>
]]></content:encoded></item><item><title><![CDATA[🧪 RMAN al Rescate: Guía completa de Backup y Recovery en Oracle 12c y 19c]]></title><description><![CDATA[🧪 La Botica del DBA – Edición Especial

"No hay nada más valioso que un backup… hasta que necesitas restaurarlo."— Todo DBA alguna vez.


🧠 ¿Por qué este artículo?Porque como buen boticario del dato, debes tener a mano tus fórmulas magistrales. Aqu...]]></description><link>https://laboticadeldba.com/rman-al-rescate-guia-completa-de-backup-y-recovery-en-oracle-12c-y-19c</link><guid isPermaLink="true">https://laboticadeldba.com/rman-al-rescate-guia-completa-de-backup-y-recovery-en-oracle-12c-y-19c</guid><category><![CDATA[backup and recovery]]></category><category><![CDATA[rman]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Database]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 14 Apr 2025 04:00:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744223454494/6201b908-7475-4011-83b4-5a3391a8dbbd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-la-botica-del-dba-edicion-especial">🧪 La Botica del DBA – Edición Especial</h2>
<blockquote>
<p><em>"No hay nada más valioso que un backup… hasta que necesitas restaurarlo."</em><br />— Todo DBA alguna vez.</p>
</blockquote>
<hr />
<p>🧠 <strong>¿Por qué este artículo?</strong><br />Porque como buen boticario del dato, debes tener a mano tus fórmulas magistrales. Aquí te comparto un <strong>recetario práctico</strong> para dominar Oracle RMAN en escenarios reales, desde respaldos simples hasta recuperación de catástrofes, clonación de bases y restauración puntual de tablas.</p>
<hr />
<h2 id="heading-preparando-la-botica-configuracion-base-de-rman">🛠️ Preparando la botica: configuración base de RMAN</h2>
<pre><code class="lang-sql">CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/app/oracle/fast_recovery_area/%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
</code></pre>
<hr />
<h2 id="heading-formulas-magistrales-para-backups">💾 Fórmulas magistrales para backups</h2>
<h3 id="heading-backup-completo">🔸 Backup completo</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">BACKUP</span> <span class="hljs-keyword">DATABASE</span> PLUS <span class="hljs-keyword">ARCHIVELOG</span>;
</code></pre>
<h3 id="heading-backup-incremental">🔸 Backup incremental</h3>
<p><strong>Nivel 0 (completo):</strong></p>
<pre><code class="lang-sql"><span class="hljs-keyword">BACKUP</span> INCREMENTAL <span class="hljs-keyword">LEVEL</span> <span class="hljs-number">0</span> <span class="hljs-keyword">DATABASE</span> PLUS <span class="hljs-keyword">ARCHIVELOG</span>;
</code></pre>
<p><strong>Nivel 1 (diferencial):</strong></p>
<pre><code class="lang-sql"><span class="hljs-keyword">BACKUP</span> INCREMENTAL <span class="hljs-keyword">LEVEL</span> <span class="hljs-number">1</span> <span class="hljs-keyword">DATABASE</span> PLUS <span class="hljs-keyword">ARCHIVELOG</span>;
</code></pre>
<h3 id="heading-backup-de-tablespaces-especificos">🔸 Backup de tablespaces específicos</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">BACKUP</span> <span class="hljs-keyword">TABLESPACE</span> <span class="hljs-keyword">users</span>, example;
</code></pre>
<hr />
<h2 id="heading-procedimientos-de-restauracion">💥 Procedimientos de restauración</h2>
<h3 id="heading-recuperacion-completa">🔄 Recuperación completa</h3>
<pre><code class="lang-sql">SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
<span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATABASE</span>;
RECOVER DATABASE;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span>;
</code></pre>
<h3 id="heading-restaurar-tablespaces">📦 Restaurar tablespaces</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">TABLESPACE</span> <span class="hljs-keyword">users</span>, example;
RECOVER TABLESPACE users, example;
</code></pre>
<h3 id="heading-recuperar-datafiles-danados">🔍 Recuperar datafiles dañados</h3>
<ol>
<li>Identifica:</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">FILE</span><span class="hljs-comment">#, STATUS, ERROR, CHANGE#, TIME FROM V$RECOVER_FILE;</span>
</code></pre>
<ol start="2">
<li>Restaura y recupera:</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATAFILE</span> <span class="hljs-string">'/ruta/archivo.dbf'</span>;
RECOVER DATAFILE '/ruta/archivo.dbf';
</code></pre>
<hr />
<h2 id="heading-casos-especiales-y-avanzados">⚙️ Casos especiales y avanzados</h2>
<h3 id="heading-restaurar-controlfile-perdido">🧠 Restaurar controlfile perdido</h3>
<pre><code class="lang-sql">STARTUP NOMOUNT;
<span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">CONTROLFILE</span> <span class="hljs-keyword">FROM</span> AUTOBACKUP;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">MOUNT</span>;
<span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATABASE</span>;
RECOVER DATABASE;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span> <span class="hljs-keyword">RESETLOGS</span>;
</code></pre>
<h3 id="heading-perdida-total-de-redo-logs">🔁 Pérdida total de redo logs</h3>
<pre><code class="lang-sql">SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span> <span class="hljs-keyword">RESETLOGS</span>;
</code></pre>
<h3 id="heading-restaurar-archived-logs">📂 Restaurar archived logs</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">ARCHIVELOG</span> <span class="hljs-keyword">ALL</span>;
</code></pre>
<hr />
<h2 id="heading-point-in-time-recovery-pitr">⏳ Point-in-Time Recovery (PITR)</h2>
<pre><code class="lang-sql">SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RUN {
  <span class="hljs-keyword">SET</span> <span class="hljs-keyword">UNTIL</span> <span class="hljs-built_in">TIME</span> <span class="hljs-string">"TO_DATE('2023-05-15 14:00:00', 'YYYY-MM-DD HH24:MI:SS')"</span>;
  <span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATABASE</span>;
  RECOVER DATABASE;
}
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span> <span class="hljs-keyword">RESETLOGS</span>;
</code></pre>
<hr />
<h2 id="heading-recuperacion-de-una-tabla-eliminada">🧬 Recuperación de una tabla eliminada</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> users_temp <span class="hljs-keyword">AS</span> 
  <span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">users</span> <span class="hljs-keyword">AS</span> <span class="hljs-keyword">OF</span> <span class="hljs-built_in">TIMESTAMP</span> (SYSTIMESTAMP - <span class="hljs-built_in">INTERVAL</span> <span class="hljs-string">'1'</span> <span class="hljs-keyword">DAY</span>);

<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">users</span> <span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> users_temp;
<span class="hljs-keyword">COMMIT</span>;
<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> users_temp;
</code></pre>
<hr />
<h2 id="heading-verificacion-y-mantenimiento-de-backups">🔎 Verificación y mantenimiento de backups</h2>
<pre><code class="lang-sql">CROSSCHECK <span class="hljs-keyword">BACKUP</span>;
LIST <span class="hljs-keyword">BACKUP</span>;
<span class="hljs-keyword">DELETE</span> OBSOLETE;
VALIDATE BACKUPSET &lt;backup_set_key&gt;;
</code></pre>
<hr />
<h2 id="heading-restauracion-de-archivos-segmentados-o-overflow">📂 Restauración de archivos segmentados o overflow</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATAFILE</span> &lt;file_number&gt;;
RECOVER DATAFILE &lt;file_number&gt;;

<span class="hljs-comment">-- o</span>

<span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">DATAFILE</span> <span class="hljs-string">'/path/to/overflow_file.dbf'</span>;
RECOVER DATAFILE '/path/to/overflow_file.dbf';
</code></pre>
<hr />
<h2 id="heading-tablespaces-de-solo-lectura">🚫 Tablespaces de solo lectura</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">BACKUP</span> <span class="hljs-keyword">TABLESPACE</span> read_only_tbs;
<span class="hljs-keyword">RESTORE</span> <span class="hljs-keyword">TABLESPACE</span> read_only_tbs;
RECOVER TABLESPACE read_only_tbs;
</code></pre>
<hr />
<h2 id="heading-clonacion-con-rman">🧪 Clonación con RMAN</h2>
<pre><code class="lang-sql">DUPLICATE TARGET DATABASE TO clone_db
  FROM ACTIVE DATABASE
  SPFILE
  <span class="hljs-keyword">SET</span> DB_NAME=<span class="hljs-string">'clone_db'</span>
  <span class="hljs-keyword">SET</span> DB_UNIQUE_NAME=<span class="hljs-string">'clone_db'</span>
  NOFILENAMECHECK;
</code></pre>
<hr />
<h2 id="heading-conclusion-del-boticario">🧾 Conclusión del boticario</h2>
<p>Tener tus fórmulas listas no solo te salva de errores, te da paz.<br />Estos scripts han sido <strong>probados en entornos reales</strong> y están listos para que los adaptes a tu laboratorio o producción.<br />Recuérdalo siempre: <strong>el DBA preparado es el DBA con buenas recetas y un buen boticario.</strong></p>
<hr />
<h2 id="heading-te-gustaria-mas-contenido-practico-asi">📢 ¿Te gustaría más contenido práctico así?</h2>
<p>a nuestra newsletter semanal en <a target="_blank" href="https://laboticadeldba.com">LaBoticaDelDBA.com</a> y recibe dosis semanales de pasillas , recetas y elixires para DBAs.</p>
]]></content:encoded></item><item><title><![CDATA[🔬 Oracle AHF 25.1 y 25.3: Qué hay de nuevo y cómo hacer upgrade sin downtime]]></title><description><![CDATA["En la salud de tu infraestructura está la paz de tu producción."— La Botica del DBA


🧠 ¿Qué es Oracle AHF y por qué deberías tenerlo al día?
Oracle Autonomous Health Framework (AHF) es una suite vital para cualquier DBA moderno. Se trata del conju...]]></description><link>https://laboticadeldba.com/oracle-ahf-251-y-253-que-hay-de-nuevo-y-como-hacer-upgrade-sin-downtime</link><guid isPermaLink="true">https://laboticadeldba.com/oracle-ahf-251-y-253-que-hay-de-nuevo-y-como-hacer-upgrade-sin-downtime</guid><category><![CDATA[Upgrade AHF ]]></category><category><![CDATA[ahf]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[infrastructure]]></category><category><![CDATA[upgrade]]></category><category><![CDATA[Oracle Linux]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Wed, 09 Apr 2025 17:15:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744218795889/df161701-d987-4716-a949-e797b074a7c7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p><em>"En la salud de tu infraestructura está la paz de tu producción."</em><br />— La Botica del DBA</p>
</blockquote>
<hr />
<h2 id="heading-que-es-oracle-ahf-y-por-que-deberias-tenerlo-al-dia">🧠 ¿Qué es Oracle AHF y por qué deberías tenerlo al día?</h2>
<p>Oracle <strong>Autonomous Health Framework (AHF)</strong> es una suite vital para cualquier DBA moderno. Se trata del conjunto de herramientas que automatiza el diagnóstico, monitoreo, trazabilidad y verificación del estado de nuestros servidores Oracle, ya sea en RAC, Standalone, Exadata u OCI.</p>
<p>AHF permite:</p>
<ul>
<li><p>Diagnósticos automáticos cuando ocurre una falla</p>
</li>
<li><p>Recolección inteligente de datos con análisis preconfigurados</p>
</li>
<li><p>Verificación del cumplimiento de buenas prácticas (orachk)</p>
</li>
<li><p>Insights históricos y en tiempo real</p>
</li>
<li><p>Análisis de performance e integridad del sistema operativo, clúster y ASM</p>
</li>
</ul>
<hr />
<h2 id="heading-que-trae-de-nuevo-la-version-251">🆕 ¿Qué trae de nuevo la versión 25.1?</h2>
<p>Liberada en febrero de 2024, esta versión introdujo mejoras especialmente útiles para entornos modernos como Oracle Linux 9, destacando:</p>
<ul>
<li><p>🔧 <strong>Nuevo sistema de configuración de upgrades automáticos</strong> (vía <code>ahfctl setupgrade</code>)</p>
</li>
<li><p>🧩 <strong>Soporte de cgroups v2</strong> en Oracle Linux 9 para limitar consumo de recursos</p>
</li>
<li><p>⚙️ Corrección de errores en sistemas multipath y redes redundantes</p>
</li>
</ul>
<hr />
<h2 id="heading-y-la-253-version-estable-mas-reciente-a-abril-2025">🚀 ¿Y la 25.3? (versión estable más reciente a abril 2025)</h2>
<p>Liberada en <strong>marzo de 2025</strong>, AHF 25.3 mejora aún más la capacidad de análisis y trazabilidad:</p>
<ul>
<li><p>📊 Visualización del estado de ASM por nodo en AHF Insights</p>
</li>
<li><p>📌 Muestra <strong>qué evento exacto disparó una colección automática</strong></p>
</li>
<li><p>⚠️ Advertencias al usar comandos obsoletos</p>
</li>
<li><p>🔁 Análisis diferencial para eventos críticos de bajo uso de memoria</p>
</li>
<li><p>🕒 Recolección mínima de diagnósticos establecida en 15 minutos</p>
</li>
</ul>
<p>✅ Disponible para Linux, AIX, Solaris, Windows y más.</p>
<p>📚 Referencia: <a target="_blank" href="https://support.oracle.com/epmos/faces/DocumentDisplay?id=2550798.1">Doc ID 2550798.1 – AHF Downloads y Release Notes</a></p>
<hr />
<h2 id="heading-mini-taller-upgrade-de-ahf-sin-downtime-de-2411-a-251-o-253">🛠️ Mini taller: Upgrade de AHF sin downtime (de 24.11 a 25.1 o 25.3)</h2>
<h3 id="heading-escenario">Escenario:</h3>
<ul>
<li><p>Servidores Oracle Linux en RAC</p>
</li>
<li><p>Versión actual de AHF: <strong>24.11</strong></p>
</li>
<li><p>Upgrade objetivo: <strong>25.1 (o directamente 25.3)</strong></p>
</li>
<li><p>Tiempo estimado: ⏱️ <strong>2 horas</strong></p>
</li>
<li><p>Impacto: ✅ <strong>Sin interrupción de servicios</strong></p>
</li>
</ul>
<hr />
<h3 id="heading-paso-1-verificar-la-version-actual">🔍 Paso 1: Verificar la versión actual</h3>
<pre><code class="lang-sql">tfactl print version
</code></pre>
<p>📌 Ejemplo de salida:</p>
<pre><code class="lang-sql">TFA Version : 24.11.0.0.0
</code></pre>
<hr />
<h3 id="heading-paso-2-preparar-staging-y-copiar-zip">📦 Paso 2: Preparar staging y copiar ZIP</h3>
<ul>
<li><p>Descarga el ZIP desde Oracle Support (<a target="_blank" href="https://support.oracle.com/epmos/faces/DocumentDisplay?id=2550798.1">enlace directo</a>)</p>
</li>
<li><p>Copia el ZIP a los servidores, por ejemplo: <code>/chemist/DIR_AHF/ahf_25.1.0_Linux.zip</code></p>
</li>
</ul>
<hr />
<h3 id="heading-paso-3-configurar-el-entorno-de-upgrade">🧰 Paso 3: Configurar el entorno de upgrade</h3>
<p>Ejecutar como <code>root</code>:</p>
<pre><code class="lang-sql">ahfctl setupgrade -all
</code></pre>
<p>Y responde:</p>
<pre><code class="lang-sql">Introduzca el indicador de autoupgrade &lt;on/off&gt;: off
Introduzca la ubicación de almacenamiento en área temporal del software: /chemist/DIR_AHF
Introduzca la frecuencia de upgrade: 30
</code></pre>
<p>✅ Verifica con:</p>
<pre><code class="lang-sql">ahfctl getupgrade -all
</code></pre>
<hr />
<h3 id="heading-paso-4-ejecutar-el-upgrade">🔄 Paso 4: Ejecutar el upgrade</h3>
<p>También como <code>root</code>:</p>
<pre><code class="lang-sql">ahfctl upgrade
</code></pre>
<p>📌 Repetir en <strong>ambos nodos</strong>, si estás en Oracle RAC.</p>
<hr />
<h3 id="heading-paso-5-validar-nueva-version">🧪 Paso 5: Validar nueva versión</h3>
<pre><code class="lang-sql">tfactl print version
</code></pre>
<p>🔎 Salida esperada:</p>
<pre><code class="lang-sql">TFA Version : 25.1.0.0.0
</code></pre>
<p>O si instalaste 25.3:</p>
<pre><code class="lang-sql">TFA Version : 25.3.0.0.0
</code></pre>
<hr />
<h2 id="heading-caso-real-upgrade-de-ahf-a-253-en-oracle-rac-exadata">🧪 Caso real: Upgrade de AHF a 25.3 en Oracle RAC Exadata</h2>
<p>Durante un laboratorio realizado en servidores de la botica, se ejecutó el upgrade de AHF desde la versión <strong>25.2.1.0.0</strong> a <strong>25.3.0.0.0</strong> con los siguientes resultados:</p>
<pre><code class="lang-sql">Host                        | TFA Version   | Upgrade Status
<span class="hljs-comment">----------------------------+---------------+----------------</span>
exaociboticario-boticaaa1   | 25.3.0.0.0    | UPGRADED
exaociboticario-boticabb2   | 25.3.0.0.0    | UPGRADED
</code></pre>
<p>💡 <em>Observación destacada</em>: AHF identificó automáticamente el paquete ZIP en <code>/expdp/REPO_AHF</code>, validó la firma, detuvo y reinició los servicios sin afectar las bases de datos, y dejó los logs de instalación en:</p>
<pre><code class="lang-sql">/u01/oracle.ahf/data/&lt;hostname&gt;/diag/ahf/
</code></pre>
<p>📂 Esto también confirmó que <strong>no se añadieron nuevos directorios a TFA</strong>, lo que garantiza una actualización limpia y sin reconfiguraciones.</p>
<p>✅ Resultado final: ambos nodos quedaron <strong>homogéneos</strong>, operativos y con la versión 25.3 lista para producción.</p>
<hr />
<h2 id="heading-internals-de-ahf-el-rol-de-tfa-y-su-magia-silenciosa">🧬 Internals de AHF: El rol de TFA y su magia silenciosa</h2>
<p>Aunque muchos conocen el AHF por herramientas como <code>orachk</code>, <code>oswbb</code> o <code>ahfctl</code>, el corazón operativo de esta suite es <strong>TFA (Trace File Analyzer)</strong>. Y lo encontrarás instalado, silencioso y vigilante, en:</p>
<pre><code class="lang-sql">/opt/oracle.ahf/tfa/
</code></pre>
<h3 id="heading-que-hace-tfa">🔎 ¿Qué hace TFA?</h3>
<p>TFA se encarga de:</p>
<ul>
<li><p>📦 <strong>Recolectar y comprimir archivos de trazas, logs, core dumps y más</strong></p>
</li>
<li><p>🔍 <strong>Detectar eventos críticos y disparar análisis automáticos</strong></p>
</li>
<li><p>⏱️ <strong>Generar colecciones de diagnóstico por rango horario o evento</strong></p>
</li>
<li><p>📘 <strong>Documentar todo en paquetes listos para enviar a Oracle Support</strong></p>
</li>
</ul>
<h3 id="heading-estructura-destacada-dentro-de-optoracleahftfa">🗂️ Estructura destacada dentro de <code>/opt/oracle.ahf/tfa</code></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Carpeta</td><td>Función</td></tr>
</thead>
<tbody>
<tr>
<td><code>bin/</code></td><td>Ejecutables, como <code>tfactl</code></td></tr>
<tr>
<td><code>log/</code></td><td>Logs de ejecución del propio TFA</td></tr>
<tr>
<td><code>data/</code></td><td>Colecciones históricas</td></tr>
<tr>
<td><code>supporttools/</code></td><td>Scripts avanzados de soporte</td></tr>
<tr>
<td><code>resources/</code></td><td>Configuraciones internas y plugins</td></tr>
</tbody>
</table>
</div><h3 id="heading-comandos-esenciales-con-tfactl">⚙️ Comandos esenciales con <code>tfactl</code></h3>
<p>📥 Recolectar todo lo de las últimas 2 horas para análisis de rendimiento:</p>
<pre><code class="lang-sql">tfactl diagcollect -last 2h -srdc dbperf
</code></pre>
<p>🧪 Analizar la base de datos y mostrar hallazgos clave:</p>
<pre><code class="lang-sql">tfactl <span class="hljs-keyword">analyze</span> -<span class="hljs-keyword">database</span> &lt;<span class="hljs-keyword">SID</span>&gt;
</code></pre>
<p>🔧 Ver estado del framework y nodos:</p>
<pre><code class="lang-sql">tfactl status
</code></pre>
<p>🌐 Mostrar la versión actual:</p>
<pre><code class="lang-sql">tfactl print version
</code></pre>
<h3 id="heading-bonus-interfaz-interactiva-con-tfactl-menu">💡 Bonus: Interfaz interactiva con <code>tfactl menu</code></h3>
<p>👌 Ideal para DBAs que prefieren menús sobre comandos:</p>
<pre><code class="lang-sql">tfactl menu
</code></pre>
<p>🎨 Presenta un menú de texto donde puedes elegir:</p>
<ol>
<li><p>System Analysis</p>
</li>
<li><p>Collections</p>
</li>
<li><p>Administration</p>
</li>
</ol>
<p>Permite hacer recolecciones y diagnósticos de forma guiada. Muy útil en auditorías, soporte remoto y tareas de rutina.</p>
<hr />
<h2 id="heading-cierre-al-estilo-de-la-botica-del-dba">💎 Cierre al estilo de La Botica del DBA</h2>
<p>Actualizar AHF es como renovar los frascos de tu botica: los principios activos siguen ahí, pero ahora con mejor empaque, nueva formulación y diagnóstico más rápido para los síntomas de tu sistema.</p>
<p>Este tipo de mantenimiento preventivo <strong>no solo reduce el tiempo de reacción ante incidentes</strong>, sino que te da tranquilidad operativa… esa que cuando todo está bien, simplemente no suena el teléfono.</p>
<p>🔗 <strong>¿Te gustó este taller?</strong><br />Suscríbete a nuestra newsletter técnica en <a target="_blank" href="https://laboticadeldba.com">laboticadeldba.com</a> o escribeme directamente a la casila de correo: <strong>Admin@LaBoticaDelDBA.Com</strong><br />📬 Publicamos cada semana casos reales, scripts útiles y upgrades que salvan madrugadas.</p>
]]></content:encoded></item><item><title><![CDATA[🕑 Tutorial: Revisión de Cambio de Hora en Sistemas Oracle y Linux (Chile)]]></title><description><![CDATA[Introducción
En Chile, el cambio de hora se realiza dos veces al año, alternando entre:

Horario de verano: UTC-3 (desde septiembre)

Horario de invierno: UTC-4 (desde abril)


Este tutorial está dirigido a administradores de bases de datos y sistema...]]></description><link>https://laboticadeldba.com/tutorial-revision-de-cambio-de-hora-en-sistemas-oracle-y-linux-chile</link><guid isPermaLink="true">https://laboticadeldba.com/tutorial-revision-de-cambio-de-hora-en-sistemas-oracle-y-linux-chile</guid><category><![CDATA[timezone]]></category><category><![CDATA[Oracle Linux]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[bash script]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 07 Apr 2025 19:43:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744054687299/a86fcb82-b075-47dd-a9f2-411e1c599566.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduccion">Introducción</h2>
<p>En Chile, el cambio de hora se realiza dos veces al año, alternando entre:</p>
<ul>
<li><p><strong>Horario de verano:</strong> UTC-3 (desde septiembre)</p>
</li>
<li><p><strong>Horario de invierno:</strong> UTC-4 (desde abril)</p>
</li>
</ul>
<p>Este tutorial está dirigido a administradores de bases de datos y sistemas que utilizan:</p>
<ul>
<li><p><strong>Oracle Database:</strong> 12c, 19c, 21c y 23c</p>
</li>
<li><p><strong>Sistemas Operativos:</strong> Oracle Linux 7.9 y 8</p>
</li>
</ul>
<p>Aquí aprenderás a <strong>verificar</strong>, <strong>ajustar</strong> y <strong>automatizar</strong> el cambio de hora, evitando problemas de sincronización en tus sistemas críticos.</p>
<hr />
<h2 id="heading-paso-1-verificar-zona-horaria-en-oracle-database">🔍 Paso 1: Verificar Zona Horaria en Oracle Database</h2>
<h3 id="heading-11-verificacion-de-zona-horaria-actual">1.1 Verificación de zona horaria actual</h3>
<pre><code class="lang-sql">sqlCopiarEditarSELECT DBTIMEZONE FROM DUAL;
</code></pre>
<h3 id="heading-12-cambiar-zona-horaria-si-aplica">1.2 Cambiar zona horaria (si aplica)</h3>
<pre><code class="lang-sql">sqlCopiarEditarALTER DATABASE <span class="hljs-keyword">SET</span> <span class="hljs-keyword">TIME_ZONE</span> = <span class="hljs-string">'America/Santiago'</span>;
</code></pre>
<blockquote>
<p>⚠️ <strong>Este cambio requiere reiniciar la base de datos.</strong></p>
</blockquote>
<hr />
<h2 id="heading-paso-2-configuracion-de-zona-horaria-en-oracle-linux">🖥️ Paso 2: Configuración de Zona Horaria en Oracle Linux</h2>
<h3 id="heading-21-verificar-configuracion-actual">2.1 Verificar configuración actual</h3>
<pre><code class="lang-sql">timedatectl
</code></pre>
<h3 id="heading-22-cambiar-zona-horaria">2.2 Cambiar zona horaria</h3>
<pre><code class="lang-sql">sudo timedatectl <span class="hljs-keyword">set</span>-timezone America/Santiago
</code></pre>
<hr />
<h2 id="heading-paso-3-automatizacion-del-cambio-de-hora">🔁 Paso 3: Automatización del Cambio de Hora</h2>
<h3 id="heading-31-usar-cron-para-ajustar-automaticamente-en-las-fechas-oficiales">3.1 Usar <code>cron</code> para ajustar automáticamente en las fechas oficiales</h3>
<blockquote>
<p>Asegúrate de revisar las fechas oficiales del cambio de hora cada año en <a target="_blank" href="https://www.horaoficial.cl/">horaoficial.cl</a>.</p>
</blockquote>
<p>Ejemplo de entradas en <code>crontab</code> (modo root):</p>
<pre><code class="lang-sql"><span class="hljs-comment"># Horario de verano (primer sábado de septiembre a las 03:00 AM)</span>
0 3 1-7 9 6 timedatectl <span class="hljs-keyword">set</span>-timezone America/Santiago

<span class="hljs-comment"># Horario de invierno (primer sábado de abril a las 03:00 AM)</span>
<span class="hljs-number">0</span> <span class="hljs-number">3</span> <span class="hljs-number">1</span><span class="hljs-number">-7</span> <span class="hljs-number">4</span> <span class="hljs-number">6</span> timedatectl <span class="hljs-keyword">set</span>-timezone America/Santiago
</code></pre>
<hr />
<h2 id="heading-funciona-este-cron-para-2026-2027-2028-2029-y-2030">📅 ¿Funciona este <code>cron</code> para 2026, 2027, 2028, 2029 y 2030?</h2>
<h3 id="heading-recordemos-la-logica">Recordemos la lógica:</h3>
<pre><code class="lang-sql">bashCopiarEditar<span class="hljs-comment"># Horario de verano: primer sábado de septiembre (días 1 a 7 de septiembre, si es sábado)</span>
0 3 1-7 9 6 timedatectl <span class="hljs-keyword">set</span>-timezone America/Santiago

<span class="hljs-comment"># Horario de invierno: primer sábado de abril (días 1 a 7 de abril, si es sábado)</span>
<span class="hljs-number">0</span> <span class="hljs-number">3</span> <span class="hljs-number">1</span><span class="hljs-number">-7</span> <span class="hljs-number">4</span> <span class="hljs-number">6</span> timedatectl <span class="hljs-keyword">set</span>-timezone America/Santiago
</code></pre>
<ul>
<li><p>El número <code>6</code> al final = sábado</p>
</li>
<li><p><code>1-7</code> = primeros 7 días del mes</p>
</li>
<li><p><code>9</code> = septiembre, <code>4</code> = abril</p>
</li>
<li><p>Hora = 03:00 AM</p>
</li>
</ul>
<hr />
<h3 id="heading-validacion-practica-por-ano-primer-sabado-del-mes">🔍 Validación práctica por año (primer sábado del mes):</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Año</td><td>Abril</td><td>Septiembre</td></tr>
</thead>
<tbody>
<tr>
<td>2026</td><td>Sábado 4</td><td>Sábado 5</td></tr>
<tr>
<td>2027</td><td>Sábado 3</td><td>Sábado 4</td></tr>
<tr>
<td>2028</td><td>Sábado 1</td><td>Sábado 2</td></tr>
<tr>
<td>2029</td><td>Sábado 7</td><td>Sábado 1</td></tr>
<tr>
<td>2030</td><td>Sábado 6</td><td>Sábado 7</td></tr>
</tbody>
</table>
</div><p>✅ <strong>En todos los años del 2026 al 2030</strong>, <strong>el primer sábado del mes cae entre el día 1 y el 7</strong>, <strong>así que el cron propuesto funcionará perfectamente</strong>.</p>
<h3 id="heading-recomendacion-extra-de-la-botica-del-dba">🧠 Recomendación extra de La Botica del DBA:</h3>
<ul>
<li><p>Aun así, <strong>revisar anualmente</strong> el sitio <a target="_blank" href="http://horaoficial.cl">horaoficial.cl</a> <a target="_blank" href="https://www.horaoficial.cl/">es buena práctica</a>, porque <strong>los gobiernos pueden c</strong><a target="_blank" href="https://www.horaoficial.cl/"><strong>ambiar la polí</strong></a><strong>tica de horarios</strong> (como ya ha pasado en Chile antes).</p>
</li>
<li><p>Puedes dejar un <code>recordatorio recurrente</code> en tu calendario para revisar esto a fines de marzo y agosto <a target="_blank" href="https://www.horaoficial.cl/">de cada año.</a></p>
</li>
</ul>
<h2 id="heading-paso-4-validacion-del-cambio">✅ Paso 4: Validación del Cambio</h2>
<h3 id="heading-41-en-oracle-database">4.1 En Oracle Database</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">DBTIMEZONE</span> <span class="hljs-keyword">FROM</span> DUAL;
</code></pre>
<h3 id="heading-42-en-oracle-linux">4.2 En Oracle Linux</h3>
<pre><code class="lang-sql">timedatectl
</code></pre>
<hr />
<h2 id="heading-paso-5-envio-de-alertas-por-correo-opcional">📧 Paso 5: Envío de Alertas por Correo (Opcional)</h2>
<p>Puedes configurar <strong>correos automáticos antes y después del cambio de hora</strong> para confirmar que los sistemas han sido ajustados correctamente.</p>
<h3 id="heading-51-query-de-control-antes-y-despues-del-cambio">5.1 Query de control antes y después del cambio:</h3>
<pre><code class="lang-sql"><span class="hljs-comment">-- Fecha actual del sistema</span>
<span class="hljs-keyword">SELECT</span> TO_CHAR(<span class="hljs-keyword">SYSDATE</span>, <span class="hljs-string">'dd/mm/yyyy HH24:MI:SS'</span>) <span class="hljs-keyword">FROM</span> dual;

<span class="hljs-comment">-- Nombre de la instancia</span>
<span class="hljs-keyword">SELECT</span> instance_name <span class="hljs-keyword">FROM</span> v$<span class="hljs-keyword">instance</span>;
</code></pre>
<h3 id="heading-52-enviar-correo-con-mailx">5.2 Enviar correo con <code>mailx</code></h3>
<p>Ejemplo de script de envío:</p>
<pre><code class="lang-sql"><span class="hljs-comment">#!/bin/bash</span>
ASUNTO="Cambio de Hora SRBOTICAP - $(date '+%d/%m/%Y %H:%M')"
MENSAJE="Se ha realizado/verificado el cambio de hora en el servidor $(hostname). Fecha actual: $(date)"
echo "$MENSAJE" | mailx -r SRBOTICAP@laboticadeldba.com -s "$ASUNTO" admin@laboticadeldba.com
</code></pre>
<blockquote>
<p>💡 Puedes programar este script como <code>cronjob</code> minutos después del cambio de hora, o ejecutarlo manualmente como parte del procedimiento.</p>
</blockquote>
<hr />
<h2 id="heading-recursos-adicionales">📚 Recursos Adicionales</h2>
<ul>
<li><p><a target="_blank" href="https://docs.oracle.com/en/">Oracle Database Time Zone Support</a></p>
</li>
<li><p><a target="_blank" href="https://docs.oracle.com/en/operating-systems/">Oracle Linux System Administrator Guide</a></p>
</li>
<li><p><a target="_blank" href="https://www.horaoficial.cl/">Hora Oficial de Chile</a></p>
</li>
</ul>
<hr />
<h2 id="heading-bonus-comprobacion-en-sistemas-distribuidos">🧪 Bonus: Comprobación en Sistemas Distribuidos</h2>
<p>Si estás en un entorno <strong>Oracle RAC</strong> o tienes múltiples servidores, asegúrate de <strong>validar el cambio en todos los nodos</strong> para evitar inconsistencias de tiempo en los logs, trace files o sincronización de procesos.</p>
<hr />
<h2 id="heading-conclusion">🧭 Conclusión</h2>
<p>El cambio de hora en Chile puede parecer trivial, pero una configuración incorrecta puede causar:</p>
<ul>
<li><p>Fallas en sincronización de jobs</p>
</li>
<li><p>Inconsistencias en registros de auditoría</p>
</li>
<li><p>Problemas con backups y replicación</p>
</li>
</ul>
<p>Este tutorial busca ayudarte a tener tus sistemas preparados y evitar estos problemas con pasos simples pero efectivos.</p>
<p><strong>¿Lo probaste? ¿Tienes dudas?</strong><br />Comenta aquí abajo o escríbeme directamente: <a target="_blank" href="mailto:admin@laboticadeldba.com"><strong>admin@laboticadeldba.com</strong></a></p>
<hr />
<p>📬 <em>Suscríbete a La Botica del DBA para más recetas técnicas, hacks y tips.</em></p>
]]></content:encoded></item><item><title><![CDATA[🌐Verificaciones Oracle Data Guard en RAC 19c: Real-Time Apply sin sorpresas.]]></title><description><![CDATA[Esta guía paso a paso está diseñada para que puedas validar de manera segura y efectiva el estado de tu entorno Data Guard, especialmente tras reinicios, parcheos o eventos de failover. Incluye comandos clave, interpretación de resultados, y acción c...]]></description><link>https://laboticadeldba.com/verificaciones-oracle-data-guard-en-rac-19c-real-time-apply-sin-sorpresas</link><guid isPermaLink="true">https://laboticadeldba.com/verificaciones-oracle-data-guard-en-rac-19c-real-time-apply-sin-sorpresas</guid><category><![CDATA[Real Time Apply]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[dataguard]]></category><category><![CDATA[#oracle-rac]]></category><category><![CDATA[oracle 19c]]></category><category><![CDATA[Oracle Database 19c]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Sun, 06 Apr 2025 18:53:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1743964680133/bf125166-a94f-4c90-a84f-66908d8815c8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Esta guía paso a paso está diseñada para que puedas validar de manera segura y efectiva el estado de tu entorno Data Guard, especialmente tras reinicios, parcheos o eventos de failover. Incluye comandos clave, interpretación de resultados, y acción correctiva para asegurar que tu standby esté siempre listo para proteger tu entorno crítico.</p>
<h2 id="heading-1-verificacion-de-sincronizacion-primaria-standby">🔍 1. Verificación de sincronización primaria - standby</h2>
<pre><code class="lang-sql"><span class="hljs-comment">-- En base primaria:</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">thread</span><span class="hljs-comment">#, MAX(sequence#) "Last Sequence"</span>
<span class="hljs-keyword">FROM</span> v$archived_log
<span class="hljs-keyword">WHERE</span> applied = <span class="hljs-string">'NO'</span>
<span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> <span class="hljs-keyword">thread</span><span class="hljs-comment">#;</span>

<span class="hljs-comment">-- Alternativa:</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">thread</span><span class="hljs-comment">#, sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;</span>
</code></pre>
<pre><code class="lang-sql"><span class="hljs-comment">-- Usando script (Dataguard synchronization), te dejo todo lo necesario en los bonus.</span>
Thread Last Sequence Received Last Sequence Applied Difference
      1                  24239                 24239          0
      2                  25528                 25528          0
</code></pre>
<p>✅ <strong>Sincronización perfecta</strong> si el "Difference" es 0 para todos los threads.</p>
<hr />
<h2 id="heading-2-verificar-estado-del-destino-data-guard-en-la-base-primaria">📊 2. Verificar estado del destino Data Guard en la base primaria</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">SET</span> <span class="hljs-keyword">LINES</span> <span class="hljs-number">200</span>
<span class="hljs-keyword">COL</span> DESTINATION <span class="hljs-keyword">FORMAT</span> A40
<span class="hljs-keyword">COL</span> <span class="hljs-keyword">STATUS</span> <span class="hljs-keyword">FORMAT</span> A10
<span class="hljs-keyword">COL</span> RECOVERY_MODE <span class="hljs-keyword">FORMAT</span> A25

<span class="hljs-keyword">SELECT</span> dest_id, destination, <span class="hljs-keyword">status</span>, recovery_mode
<span class="hljs-keyword">FROM</span> v$archive_dest_status
<span class="hljs-keyword">WHERE</span> dest_id = <span class="hljs-number">2</span>;
</code></pre>
<p><strong>Resultado esperado:</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>DEST_ID</td><td>DESTINATION</td><td>STATUS</td><td>RECOVERY_MODE</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>botica19c_oci</td><td>VALID</td><td>MANAGED REAL TIME APPLY</td></tr>
</tbody>
</table>
</div><p>✅ Esto confirma que <strong>la base primaria está enviando logs en tiempo real</strong> a la standby.</p>
<hr />
<h2 id="heading-3-estado-general-de-todos-los-destinos">📃 3. Estado general de todos los destinos</h2>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> destination, <span class="hljs-keyword">status</span>, <span class="hljs-keyword">type</span>, recovery_mode
<span class="hljs-keyword">FROM</span> v$archive_dest_status
<span class="hljs-keyword">WHERE</span> recovery_mode <span class="hljs-keyword">IS</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>;
</code></pre>
<p>✅ Confirmar que solo <code>botica19c_oci</code> está activo como destino <code>PHYSICAL</code> y en modo <code>REAL TIME APPLY</code>. Los demás pueden estar <code>INACTIVE</code>.</p>
<hr />
<h2 id="heading-4-verificacion-de-la-base-standby-botica19coci">🌐 4. Verificación de la base standby (botica19c_oci)</h2>
<pre><code class="lang-sql"><span class="hljs-comment">-- En standby:</span>
<span class="hljs-keyword">SELECT</span> database_role, open_mode, protection_mode <span class="hljs-keyword">FROM</span> v$<span class="hljs-keyword">database</span>;
</code></pre>
<p><strong>Resultado esperado:</strong></p>
<pre><code class="lang-sql">PHYSICAL STANDBY | MOUNTED | MAXIMUM PERFORMANCE
</code></pre>
<p>✅ La base está en modo standby montado (no abierta), lista para recibir y aplicar logs.</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Ver proceso MRP:</span>
<span class="hljs-keyword">SELECT</span> process, <span class="hljs-keyword">status</span> <span class="hljs-keyword">FROM</span> v$managed_standby <span class="hljs-keyword">WHERE</span> process = <span class="hljs-string">'MRP0'</span>;
</code></pre>
<p><strong>Resultado esperado:</strong></p>
<pre><code class="lang-sql">PROCESS | STATUS
<span class="hljs-comment">--------|--------</span>
MRP0    | APPLYING_LOG
</code></pre>
<p>✅ <code>MRP0</code> activo = aplicación en tiempo real funcionando.</p>
<hr />
<h2 id="heading-checklist-rapida">⚡ Checklist Rápida</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>✅ Verificación</td><td>Estado Esperado</td></tr>
</thead>
<tbody>
<tr>
<td><code>MRP0</code> corriendo en standby</td><td><code>APPLYING_LOG</code></td></tr>
<tr>
<td>Base standby en <code>MOUNTED</code></td><td><code>PHYSICAL STANDBY</code> y <code>MOUNTED</code></td></tr>
<tr>
<td>Destino <code>LOG_ARCHIVE_DEST_2</code> en primaria</td><td><code>VALID</code>, <code>REAL TIME APPLY</code></td></tr>
<tr>
<td>Dataguard synchronization/ secuencia aplicada = recibida</td><td><code>Difference = 0</code></td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-5-verificacion-del-estado-de-recursos-en-oracle-grid-infrastructure-crs-con-srvctl-y-crsctl">🛠️ 5. Verificación del estado de recursos en Oracle Grid Infrastructure (CRS) con <code>srvctl</code> y <code>crsctl</code></h2>
<p>Desde el usuario <code>grid</code>, puedes validar que los recursos de base de datos estén correctamente registrados, online y con el home correcto:</p>
<pre><code class="lang-sql">crsctl stat res -w "TYPE = ora.database.type" -t
</code></pre>
<p><strong>Ejemplo de salida esperada:</strong></p>
<pre><code class="lang-sql">ora.botiquin_oci.db
    1 ONLINE  ONLINE exabotica-area51 Open,HOME=/u02/app/oracle/product/12.2.0/dbhome_5,STABLE
    2 ONLINE  ONLINE exabotica-area52 Open,HOME=/u02/app/oracle/product/12.2.0/dbhome_5,STABLE

ora.botica19c_oci.db
    1 ONLINE  ONLINE exabotica-area51 Open,HOME=/u02/app/oracle/product/19.0.0.0/dbhome_1,STABLE
    2 ONLINE  ONLINE exabotica-area52 Open,HOME=/u02/app/oracle/product/19.0.0.0/dbhome_1,STABLE
</code></pre>
<p>✅ Verificá que el estado esté <code>ONLINE</code>, el home correcto (<code>dbhome_X</code>) y que cada nodo esté reportando el estado como <code>STABLE</code>.</p>
<p>También puedes validar la base con <code>srvctl</code>:</p>
<pre><code class="lang-sql">srvctl status database -d botica19c_oci
srvctl config database -d botica19c_oci
</code></pre>
<hr />
<h2 id="heading-checklist-rapida-1">⚡ Checklist Rápida</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>✅ Verificación</td><td>Estado Esperado</td></tr>
</thead>
<tbody>
<tr>
<td><code>MRP0</code> corriendo en standby</td><td><code>APPLYING_LOG</code></td></tr>
<tr>
<td>Base standby en <code>MOUNTED</code></td><td><code>PHYSICAL STANDBY</code> y <code>MOUNTED</code></td></tr>
<tr>
<td>Destino <code>LOG_ARCHIVE_DEST_2</code> en primaria</td><td><code>VALID</code>, <code>REAL TIME APPLY</code></td></tr>
<tr>
<td><code>DG</code>synchronization / secuencia aplicada = recibida</td><td><code>Difference = 0</code></td></tr>
<tr>
<td><code>crsctl stat res -t</code> en estado <code>ONLINE</code></td><td>Recursos online, sin errores</td></tr>
</tbody>
</table>
</div><h2 id="heading-comando-para-reiniciar-mrp-si-se-detiene">🔧 Comando para reiniciar <code>MRP</code> (si se detiene)</h2>
<pre><code class="lang-sql"><span class="hljs-comment">-- En standby:</span>
<span class="hljs-keyword">START</span> MRP;
<span class="hljs-comment">-- o:</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">USING</span> <span class="hljs-keyword">CURRENT</span> <span class="hljs-keyword">LOGFILE</span> <span class="hljs-keyword">DISCONNECT</span>
</code></pre>
<h1 id="heading-bonus">BONUS:</h1>
<h2 id="heading-script-sh-para-automatizar-validaciones-basicas">💻 Script <code>.sh</code> para automatizar validaciones básicas:</h2>
<p>Dado que parte de las verificaciones pertenecen al contexto del usuario <code>grid</code> (infraestructura) y otras al usuario <code>oracle</code> (base de datos), se recomienda separar los scripts o coordinar su ejecución desde un entorno con privilegios compartidos.</p>
<h3 id="heading-script-para-usuario-oracle-validaciones-data-guard">✅ Script para usuario <code>oracle</code> (validaciones Data Guard)</h3>
<pre><code class="lang-sql"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-comment"># check_dataguard_oracle.sh</span>

ORACLE_SID=BOTICA19C1
. /home/oracle/.bash_profile

echo "Verificando MRP0 en standby..."
sqlplus -s / as sysdba &lt;&lt;EOF
<span class="hljs-keyword">SET</span> PAGESIZE <span class="hljs-number">0</span> FEEDBACK <span class="hljs-keyword">OFF</span> <span class="hljs-keyword">VERIFY</span> <span class="hljs-keyword">OFF</span> <span class="hljs-keyword">HEADING</span> <span class="hljs-keyword">OFF</span> ECHO <span class="hljs-keyword">OFF</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-string">'MRP0 status: '</span> || <span class="hljs-keyword">status</span> <span class="hljs-keyword">FROM</span> v\$managed_standby <span class="hljs-keyword">WHERE</span> process = <span class="hljs-string">'MRP0'</span>;
EOF

echo -e "\nVerificando destino de standby (dest_id=2)..."
sqlplus -s / as sysdba &lt;&lt;EOF
<span class="hljs-keyword">SET</span> <span class="hljs-keyword">LINES</span> <span class="hljs-number">200</span>
<span class="hljs-keyword">COL</span> destination <span class="hljs-keyword">FOR</span> A30
<span class="hljs-keyword">COL</span> recovery_mode <span class="hljs-keyword">FOR</span> A30
<span class="hljs-keyword">SELECT</span> destination, <span class="hljs-keyword">status</span>, recovery_mode <span class="hljs-keyword">FROM</span> v\$archive_dest_status <span class="hljs-keyword">WHERE</span> dest_id = <span class="hljs-number">2</span>;
EOF
</code></pre>
<h3 id="heading-script-para-usuario-grid-estado-crs">✅ Script para usuario <code>grid</code> (estado CRS)</h3>
<pre><code class="lang-sql"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-comment"># check_grid_crsctl.sh</span>

. /home/grid/.bash_profile

echo "Estado de bases de datos en Clusterware:"
crsctl stat res -w "TYPE = ora.database.type" -t | grep -Ei 'botica|gis'
</code></pre>
<p>✅ Estos scripts pueden integrarse en procesos automatizados por separado, o llamarse desde un orquestador común si hay acceso entre cuentas (ej: <code>sudo</code>, <code>cron</code> centralizado, herramientas de observabilidad).</p>
<blockquote>
<p>📥 <strong>Descargá los scripts completos de verificación desde GitHub</strong></p>
<p><a target="_blank" href="https://github.com/laboticadeldba/REPOSITORIO/tree/main/dg_checker_scripts">🧪 Ir al repositorio »</a></p>
</blockquote>
<h2 id="heading-si-esta-guia-te-sirvio-para-dejar-tu-data-guard-en-modo-zen-y-tus-instancias-bien-sincronizadas-mision-cumplida">💊 Si esta guía te sirvió para dejar tu Data Guard en modo zen y tus instancias bien sincronizadas, ¡misión cumplida!</h2>
<p>🚀 Si te gustó el contenido, compartelo con tu equipo, guardalo en tu caja de primeros auxilios y no te olvides de suscribirte al boletín de <strong>La Botica del DBA</strong> desde:</p>
<p>🔗 <a target="_blank" href="https://www.laboticadeldba.com">www.laboticadeldba.com</a></p>
<p>Ahí seguimos publicando tips, guías, scripts y anécdotas del día a día del DBA — sin vueltas, directo al grano.</p>
<p>📮 ¿Tienes una duda, una historia técnica o quieres colaborar con el blog?<br />Escribime a <strong>admin@laboticadeldba.com</strong></p>
<p>Nos vemos en la próxima dosis técnica 😉<br />— <em>El Boticario del DBA</em></p>
]]></content:encoded></item><item><title><![CDATA[Fundamentos de Sincronización en Oracle Data Guard]]></title><description><![CDATA[Oracle Data Guard garantiza alta disponibilidad mediante una base standby que replica los cambios desde la primaria. En entornos como Oracle RAC, Exadata o nubes (OCI), esta replicación puede verse afectada por red, transporte de redo logs o errores ...]]></description><link>https://laboticadeldba.com/fundamentos-de-sincronizacion-en-oracle-data-guard</link><guid isPermaLink="true">https://laboticadeldba.com/fundamentos-de-sincronizacion-en-oracle-data-guard</guid><category><![CDATA[Data Guard Broker]]></category><category><![CDATA[dgmgrl]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[dataguard]]></category><category><![CDATA[Bash]]></category><category><![CDATA[bash script]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Thu, 03 Apr 2025 18:11:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1743703316487/b4957a27-9e1e-41cc-a0f7-064cb3587039.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Oracle Data Guard garantiza alta disponibilidad mediante una base standby que replica los cambios desde la primaria. En entornos como Oracle RAC, Exadata o nubes (OCI), esta replicación puede verse afectada por red, transporte de redo logs o errores de configuración.</p>
<p>Verifica siempre:</p>
<ul>
<li><p>Que los <code>db_unique_name</code> estén bien configurados</p>
</li>
<li><p>Que los archivos <code>tnsnames.ora</code> y <code>listener.ora</code> estén definidos</p>
</li>
<li><p>Que los destinos <code>LOG_ARCHIVE_DEST_n</code> estén activos y sin errores</p>
</li>
</ul>
<hr />
<h2 id="heading-comandos-clave-por-version">🧪 Comandos Clave por Versión</h2>
<h3 id="heading-oracle-11g-no-multitenant-sin-cdbpdb">🔹 Oracle 11g (NO multitenant, sin CDB/PDB)</h3>
<p>SQL&gt; recover managed standby database cancel;<br />Media recovery complete.<br />SQL&gt; alter database open read only;  </p>
<p>Database altered.  </p>
<p>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;<br />ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Abrir en modo solo lectura (para validaciones)</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">OPEN</span> <span class="hljs-keyword">READ</span> <span class="hljs-keyword">ONLY</span>;

<span class="hljs-comment">-- Cancelar recuperación gestionada (mantenimiento)</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">CANCEL</span>;

<span class="hljs-comment">-- Reanudar recuperación</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">DISCONNECT</span>;
</code></pre>
<h3 id="heading-oracle-12c-soporta-cdbpdb-broker-funcional">🔹 Oracle 12c (Soporta CDB/PDB, Broker funcional)</h3>
<pre><code class="lang-sql"><span class="hljs-comment">-- Arrancar instancia en modo MOUNT (standby)</span>
STARTUP MOUNT;

<span class="hljs-comment">-- Activar recuperación gestionada</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">DISCONNECT</span>;
</code></pre>
<h3 id="heading-oracle-19c-21c-23ai-real-time-apply-y-broker-completo">🔹 Oracle 19c, 21c, 23ai (Real-Time Apply y Broker completo)</h3>
<pre><code class="lang-sql"><span class="hljs-comment">-- Real-Time Apply recomendado</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">USING</span> <span class="hljs-keyword">CURRENT</span> <span class="hljs-keyword">LOGFILE</span> <span class="hljs-keyword">DISCONNECT</span>;

<span class="hljs-comment">-- Modo normal también válido</span>
<span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">RECOVER</span> <span class="hljs-keyword">MANAGED</span> <span class="hljs-keyword">STANDBY</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">DISCONNECT</span>;
</code></pre>
<hr />
<h2 id="heading-validaciones-con-sql">🔍 Validaciones con SQL</h2>
<h3 id="heading-script-estadodataguardsql">📌 Script estado_dataguard.sql</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SET</span> <span class="hljs-keyword">LINES</span> <span class="hljs-number">200</span>
<span class="hljs-keyword">COL</span> dest_name <span class="hljs-keyword">FOR</span> A20
<span class="hljs-keyword">COL</span> destination <span class="hljs-keyword">FOR</span> A50
<span class="hljs-keyword">COL</span> <span class="hljs-keyword">error</span> <span class="hljs-keyword">FOR</span> A15
<span class="hljs-keyword">COL</span> db_unique_name <span class="hljs-keyword">FOR</span> A15
<span class="hljs-keyword">COL</span> <span class="hljs-keyword">name</span> <span class="hljs-keyword">FOR</span> A100

<span class="hljs-keyword">SELECT</span> dest_id, dest_name, target, name_space, destination, <span class="hljs-keyword">status</span>, <span class="hljs-keyword">error</span>, db_unique_name
<span class="hljs-keyword">FROM</span> v$archive_dest
<span class="hljs-keyword">WHERE</span> destination <span class="hljs-keyword">IS</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>;

<span class="hljs-keyword">SELECT</span> dest_id, dest_name, <span class="hljs-keyword">status</span>, <span class="hljs-keyword">type</span>, srl, recovery_mode
<span class="hljs-keyword">FROM</span> v$archive_dest_status
<span class="hljs-keyword">WHERE</span> dest_id = <span class="hljs-number">2</span>;

EXIT;
</code></pre>
<h3 id="heading-script-dgsyncsql">📌 Script dg_sync.sql</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SET</span> LINE <span class="hljs-number">180</span>
<span class="hljs-keyword">SET</span> PAGES <span class="hljs-number">30</span>

<span class="hljs-keyword">COLUMN</span> LOGON_TIME <span class="hljs-keyword">FORMAT</span> A20
<span class="hljs-keyword">COLUMN</span> USERNAME <span class="hljs-keyword">FORMAT</span> A15
<span class="hljs-keyword">COLUMN</span> OSUSER <span class="hljs-keyword">FORMAT</span> A20

<span class="hljs-keyword">SELECT</span>
    ARCH.THREAD<span class="hljs-comment"># "Thread",</span>
    ARCH.SEQUENCE<span class="hljs-comment"># "Last Sequence Received",</span>
    APPL.SEQUENCE<span class="hljs-comment"># "Last Sequence Applied",</span>
    (ARCH.SEQUENCE<span class="hljs-comment"># - APPL.SEQUENCE#) "Difference"</span>
<span class="hljs-keyword">FROM</span>
    (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, SEQUENCE#</span>
     <span class="hljs-keyword">FROM</span> V$ARCHIVED_LOG
     <span class="hljs-keyword">WHERE</span> (<span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, FIRST_TIME) IN</span>
           (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,</span>
    (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, SEQUENCE#</span>
     <span class="hljs-keyword">FROM</span> V$LOG_HISTORY
     <span class="hljs-keyword">WHERE</span> (<span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, FIRST_TIME) IN</span>
           (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">THREAD</span><span class="hljs-comment">#, MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL</span>
<span class="hljs-keyword">WHERE</span>
    ARCH.THREAD<span class="hljs-comment"># = APPL.THREAD#</span>
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> <span class="hljs-number">1</span>;

EXIT;
</code></pre>
<hr />
<h2 id="heading-script-bash-desde-primaria-syncdgboticash">🛠️ Script Bash desde Primaria: <code>sync_dg_botica.sh</code></h2>
<pre><code class="lang-sql"><span class="hljs-comment">#!/bin/bash</span>
. /home/oracle/BOTICADB.env

sqlplus -s / as sysdba &lt;&lt;EOF
<span class="hljs-keyword">SET</span> PAGESIZE <span class="hljs-number">50</span>
<span class="hljs-keyword">SET</span> LINESIZE <span class="hljs-number">180</span>
<span class="hljs-keyword">PROMPT</span> === Estado de sincronización <span class="hljs-keyword">Data</span> <span class="hljs-keyword">Guard</span> ===
@/home/<span class="hljs-keyword">oracle</span>/scripts/dg_sync.sql
EOF
</code></pre>
<p>Puedes programarlo en <code>cron</code> o integrarlo con Zabbix/Nagios.</p>
<hr />
<h2 id="heading-data-guard-broker-dgmgrl-desde-oracle-12c">Data Guard Broker (DGMGRL) — desde Oracle 12c+</h2>
<h3 id="heading-paso-1-habilitar-broker">⚙️ Paso 1: Habilitar Broker</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SYSTEM</span> <span class="hljs-keyword">SET</span> DG_BROKER_START=<span class="hljs-literal">true</span> <span class="hljs-keyword">SCOPE</span>=<span class="hljs-keyword">BOTH</span>;
</code></pre>
<h3 id="heading-paso-2-crear-configuracion">🔗 Paso 2: Crear Configuración</h3>
<pre><code class="lang-sql">dgmgrl sys/password@primaria

<span class="hljs-keyword">CREATE</span> CONFIGURATION <span class="hljs-string">'DGCFG_BOTICA'</span> <span class="hljs-keyword">AS</span>
  PRIMARY <span class="hljs-keyword">DATABASE</span> <span class="hljs-keyword">IS</span> PRIMARIA_DB
  <span class="hljs-keyword">CONNECT</span> IDENTIFIER <span class="hljs-keyword">IS</span> primaria;

ADD DATABASE STANDBY_DB AS
  CONNECT IDENTIFIER IS standby
  MAINTAINED AS PHYSICAL;

ENABLE CONFIGURATION;
</code></pre>
<h3 id="heading-validaciones">🔍 Validaciones</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">SHOW</span> CONFIGURATION;
<span class="hljs-keyword">SHOW</span> <span class="hljs-keyword">DATABASE</span> VERBOSE PRIMARIA_DB;
<span class="hljs-keyword">SHOW</span> <span class="hljs-keyword">DATABASE</span> VERBOSE STANDBY_DB;
</code></pre>
<h3 id="heading-switchover">⟲ Switchover</h3>
<pre><code class="lang-sql">dgmgrl
CONNECT /
SWITCHOVER TO 'STANDBY_DB';
</code></pre>
<h3 id="heading-failover-desastre">Failover (desastre)</h3>
<pre><code class="lang-sql">FAILOVER TO 'STANDBY_DB' IMMEDIATE;
</code></pre>
<hr />
<h2 id="heading-reinicio-automatico-con-systemd">🔄 Reinicio Automático con <code>systemd</code></h2>
<p>Archivo: <code>/etc/systemd/system/syncdg-botica.service</code></p>
<pre><code class="lang-sql">[Unit]
Description=Revisión automática de sincronización Oracle Data Guard

[Service]
User=oracle
ExecStart=/home/oracle/scripts/sync_dg_botica.sh
Restart=on-failure

[<span class="hljs-keyword">Install</span>]
WantedBy=multi-user.target
</code></pre>
<p>Activar:</p>
<pre><code class="lang-sql">sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable syncdg-botica.service
sudo systemctl <span class="hljs-keyword">start</span> syncdg-botica.service
</code></pre>
<hr />
<h2 id="heading-tips-de-la-botica">🧠 Tips de la Botica</h2>
<ul>
<li><p>Usa <code>VALIDATE DATABASE VERBOSE</code> solo en versiones 12c+.</p>
</li>
<li><p>Documenta cada <code>switchover</code> y <code>failover</code> cuidadosamente.</p>
</li>
<li><p>Nunca dejes el <code>observer</code> sin monitorear (FSFO).</p>
</li>
<li><p>En OCI, aprovecha FastConnect o Private Endpoints para baja latencia.</p>
</li>
</ul>
<hr />
<p>📧 admin@laboticadeldba.com — ¡Consulta casos específicos de HA, rendimiento o DR!</p>
<hr />
<p>¿Tienes un caso específico o un entorno complejo que quieres revisar? Escríbeme en los comentarios o comunicate directo la casilla de correos <strong>Admin@LaBoticaDelDBA.com</strong> ¡En la botica siempre hay un elixir de soluciones para cada casuística, problema de rendimiento o alta disponibilidad!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo Configurar Sendmail en Oracle Linux para Envío de Correos Automatizados]]></title><description><![CDATA[En muchos entornos Oracle es esencial que nuestros servidores puedan enviar correos automatizados, ya sea para alertas, respaldos, logs u otras tareas administrativas. En este tutorial aprenderás a configurar Sendmail paso a paso en Oracle Linux, con...]]></description><link>https://laboticadeldba.com/como-configurar-sendmail-en-oracle-linux-para-envio-de-correos-automatizados</link><guid isPermaLink="true">https://laboticadeldba.com/como-configurar-sendmail-en-oracle-linux-para-envio-de-correos-automatizados</guid><category><![CDATA[Oracle Linux]]></category><category><![CDATA[sendmail]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[dba]]></category><category><![CDATA[monitoring]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 31 Mar 2025 23:05:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1743462142668/9b26d5a4-761f-4f09-a364-5c6c5f97d534.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En muchos entornos Oracle es esencial que nuestros servidores puedan <strong>enviar correos automatizados</strong>, ya sea para <strong>alertas, respaldos, logs</strong> u otras tareas administrativas. En este tutorial aprenderás a configurar <strong>Sendmail</strong> paso a paso en <strong>Oracle Linux</strong>, conectándolo a un servidor SMTP externo para enviar correos de forma confiable.</p>
<hr />
<h2 id="heading-pre-requisitos">🧪 Pre-requisitos</h2>
<ul>
<li><p>Acceso <code>root</code> o privilegios de superusuario.</p>
</li>
<li><p>Conexión a internet para instalar paquetes.</p>
</li>
<li><p>Datos del servidor SMTP al que se conectará (host y dirección IP).</p>
</li>
<li><p>Utilizaremos como ejemplo el dominio: <a target="_blank" href="http://laboticadeldba.com"><code>laboticadeldba.com</code></a>.</p>
</li>
</ul>
<hr />
<h2 id="heading-1-instalacion-de-sendmail-y-sendmail-cf">🔧 1. Instalación de Sendmail y sendmail-cf</h2>
<p>Asegúrate de tener <code>sendmail</code> y su herramienta de configuración avanzada:</p>
<pre><code class="lang-bash">yum install sendmail -y
yum install sendmail-cf.noarch -y
</code></pre>
<p>¿No sabes si está disponible? Búscalo:</p>
<pre><code class="lang-bash">yum search sendmail
</code></pre>
<hr />
<h2 id="heading-2-configurar-el-servidor-smtp-smart-host">🛠️ 2. Configurar el servidor SMTP (Smart Host)</h2>
<p>Editamos el archivo <code>/etc/mail/sendmail.mc</code>:</p>
<pre><code class="lang-bash">vi /etc/mail/sendmail.mc
</code></pre>
<p>Agrega esta línea:</p>
<pre><code class="lang-bash">define(`SMART_HOST<span class="hljs-string">', `smtp.laboticadeldba.com'</span>)dnl
</code></pre>
<p>Luego genera el archivo de configuración final:</p>
<pre><code class="lang-bash">/etc/mail/sendmail.mc &gt; /etc/mail/sendmail.cf
</code></pre>
<hr />
<h2 id="heading-3-configurar-el-archivo-etchosts">🧭 3. Configurar el archivo /etc/hosts</h2>
<p>Edita el archivo para que el sistema resuelva correctamente nombres IP/DNS:</p>
<pre><code class="lang-bash">vi /etc/hosts
</code></pre>
<p>Ejemplo:</p>
<pre><code class="lang-bash">192.168.100.10   smtp.laboticadeldba.com smtp
192.168.100.20   SRBOTICAP.laboticadeldba.com SRBOTICAP
</code></pre>
<hr />
<h2 id="heading-4-iniciar-el-servicio-sendmail">▶️ 4. Iniciar el servicio Sendmail</h2>
<p>Levanta el servicio:</p>
<pre><code class="lang-bash">systemctl start sendmail.service
</code></pre>
<p>Para que se active al iniciar el servidor:</p>
<pre><code class="lang-bash">systemctl <span class="hljs-built_in">enable</span> sendmail.service
</code></pre>
<hr />
<h2 id="heading-5-prueba-de-envio-de-correo">📬 5. Prueba de envío de correo</h2>
<p>Instala <code>mailx</code> si no lo tienes:</p>
<pre><code class="lang-bash">yum install mailx -y
</code></pre>
<p>Y luego ejecuta:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">"PRUEBA CORREO SRBOTICAP <span class="hljs-subst">$(date)</span>"</span> | mailx -r SRBOTICAP@laboticadeldba.com -s <span class="hljs-string">"Prueba Correo SRBOTICAP"</span> admin@laboticadeldba.com
</code></pre>
<hr />
<h2 id="heading-6-revision-de-logs">🧾 6. Revisión de logs</h2>
<p>Para validar el envío o revisar errores:</p>
<pre><code class="lang-bash">tail -f /var/<span class="hljs-built_in">log</span>/maillog
tail -f /var/<span class="hljs-built_in">log</span>/messages
</code></pre>
<hr />
<h2 id="heading-7-detener-sendmail-opcional">⏹️ 7. Detener Sendmail (opcional)</h2>
<p>Si necesitas apagar el servicio:</p>
<pre><code class="lang-bash">systemctl stop sendmail.service
</code></pre>
<hr />
<h2 id="heading-conclusion">🧠 Conclusión</h2>
<p>La configuración de <code>sendmail</code> puede parecer arcaica, pero sigue siendo una herramienta <strong>robusta, confiable y versátil</strong> en ambientes empresariales. Esta integración es especialmente útil en entornos <strong>Oracle RAC, servidores de respaldo, o scripts de monitoreo</strong>, donde notificar por correo ante errores o eventos es una necesidad crítica.</p>
<hr />
<p><strong>¿Lo probaste? ¿Tienes dudas?</strong><br />Comenta aquí abajo o escríbeme directamente: admin@laboticadeldba.com</p>
<hr />
<p>📬 <em>Suscríbete a La Botica del DBA para más recetas técnicas, hacks y tips</em></p>
]]></content:encoded></item><item><title><![CDATA[Evolución de Oracle Spatial: Avances Clave de la Versión 19c a 23c]]></title><description><![CDATA[🧪 Introducción boticaria
En nuestra botica, cada componente tiene su lugar, como en una antigua farmacia donde cada frasco contiene su fórmula precisa. En el mundo de Oracle Spatial, las herramientas evolucionan y se perfeccionan con cada versión.
S...]]></description><link>https://laboticadeldba.com/evolucion-de-oracle-spatial-avances-clave-de-la-version-19c-a-23c</link><guid isPermaLink="true">https://laboticadeldba.com/evolucion-de-oracle-spatial-avances-clave-de-la-version-19c-a-23c</guid><category><![CDATA[oracle 23c]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[spatial database]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Tue, 25 Mar 2025 12:00:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744220424799/d68b9d28-d77b-4c32-9027-1bbbad6e0ff6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduccion-boticaria">🧪 Introducción boticaria</h2>
<p>En nuestra botica, cada componente tiene su lugar, como en una antigua farmacia donde cada frasco contiene su fórmula precisa. En el mundo de Oracle Spatial, las herramientas evolucionan y se perfeccionan con cada versión.</p>
<p>Si en la versión 19c ya compartimos una receta esencial sobre cómo mantener viva la <code>shape_lib</code> tras el parcheo, hoy volvemos al laboratorio con una nueva entrega para la comunidad DBA: <strong>Oracle Database 23c</strong>, y su poderosa evolución en capacidades geoespaciales.</p>
<p>Prepárate para descubrir qué hay de nuevo, cómo se compara con la 19c y por qué esta versión representa una renovación total para quienes trabajamos con datos espaciales.</p>
<hr />
<h2 id="heading-oracle-spatial-and-graph-evolucion-de-19c-a-23c">🌍 Oracle Spatial and Graph: evolución de 19c a 23c</h2>
<p><strong>Oracle Spatial and Graph</strong> ha sido una extensión fundamental en Oracle Database, permitiendo a desarrolladores, analistas GIS y DBAs gestionar y analizar datos espaciales. Mientras que en <strong>19c</strong> ya contábamos con funcionalidades sólidas, la versión <strong>23c</strong> —conocida como 23ai— amplía las fronteras con herramientas optimizadas, mayor integración con IA y una experiencia de desarrollo más fluida.</p>
<hr />
<h2 id="heading-novedades-destacadas-en-oracle-23c">🧠 Novedades destacadas en Oracle 23c</h2>
<h4 id="heading-1-integracion-con-sqlpgq-property-graph-queries">✅ 1. Integración con SQL/PGQ (Property Graph Queries)</h4>
<p>Se incorpora el soporte al estándar ISO SQL/PGQ, lo que permite ejecutar consultas de grafos directamente en SQL con sintaxis simple, facilitando el análisis de redes complejas en datos empresariales.</p>
<h4 id="heading-2-graph-server-and-client-v24">✅ 2. Graph Server and Client v24</h4>
<p>Una nueva arquitectura más flexible para el procesamiento de grafos, con rendimiento optimizado para grandes volúmenes de datos y compatibilidad con Apache TinkerPop.</p>
<h4 id="heading-3-ia-espacial-e-integracion-con-machine-learning">✅ 3. IA espacial e integración con Machine Learning</h4>
<p>Oracle 23c se integra nativamente con herramientas de aprendizaje automático, facilitando el análisis de patrones espaciales y la creación de modelos predictivos directamente sobre los datos geoespaciales.</p>
<h4 id="heading-4-oracle-spatial-studio-mejorado">✅ 4. Oracle Spatial Studio mejorado</h4>
<p>Mejoras de rendimiento, interfaz más amigable y mayor soporte para datos 3D y operaciones topológicas complejas, tanto on-premise como en Oracle Cloud.</p>
<h4 id="heading-5-visualizacion-geoespacial-avanzada">✅ 5. Visualización geoespacial avanzada</h4>
<p>Mayor soporte para teselas vectoriales, mallas hexagonales H3 y vistas 3D optimizadas para ciudades inteligentes y gemelos digitales.</p>
<hr />
<h2 id="heading-que-se-mantiene-y-que-mejora-respecto-a-19c">🧪 ¿Qué se mantiene y qué mejora respecto a 19c?</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Característica</td><td>Oracle 19c</td><td>Oracle 23c (23ai)</td></tr>
</thead>
<tbody>
<tr>
<td><code>shape_lib</code> y <code>extproc</code></td><td>Manual, requiere validación post-parcheo</td><td>Mismo proceso, pero con mejores prácticas sugeridas</td></tr>
<tr>
<td>Visualización 2D/3D</td><td>Sólida, pero limitada a herramientas externas</td><td>Integrada en Spatial Studio mejorado</td></tr>
<tr>
<td>Análisis de grafos</td><td>Disponible con configuración avanzada</td><td>Soporte SQL/PGQ nativo</td></tr>
<tr>
<td>Integración con IA</td><td>Requiere integración externa</td><td>Disponible de forma nativa en DBMS</td></tr>
<tr>
<td>Spatial Studio</td><td>Funcional, pero menos visual</td><td>Interfaz renovada, más ágil y poderosa</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-recomendaciones-boticarias-para-migrar-de-19c-a-23c">🔧 Recomendaciones boticarias para migrar de 19c a 23c</h2>
<ul>
<li><p><strong>Prepará tus PDBs y configuraciones externas</strong> (como <code>extproc.ora</code>, <code>listener.ora</code>, y librerías externas como <code>shape_lib</code>).</p>
</li>
<li><p><strong>Validá compatibilidades</strong>: herramientas GIS como ArcGIS y QGIS ya están adaptándose a 23c.</p>
</li>
<li><p><strong>Documentá las funciones espaciales en uso</strong> antes de migrar: <code>SDO_GEOM</code>, <code>SDO_BUFFER</code>, etc.</p>
</li>
<li><p><strong>Probá Spatial Studio 23c en Oracle Cloud</strong>, incluso con datasets de prueba, antes de hacer el salto en producción.</p>
</li>
</ul>
<hr />
<h2 id="heading-fuentes-y-referencias-boticarias">📚 Fuentes y referencias boticarias</h2>
<p>Estas son las fuentes que consultamos para traerte esta receta completa:</p>
<ul>
<li><p><a target="_blank" href="https://www.oracle.com/database/spatial-database/">📘 Oracle Spatial and Graph Overview – Oracle.com</a></p>
</li>
<li><p><a target="_blank" href="https://blogs.oracle.com/database/post/whats-new-in-oracle-spatial-for-oracle-database-23c">📘 What's new in Oracle Spatial for 23c – Oracle Blogs</a></p>
</li>
<li><p><a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/oracle-database-23ai-new-features-guide.pdf">📘 Oracle Database 23ai New Features Guide (PDF)</a></p>
</li>
<li><p><a target="_blank" href="https://docs.oracle.com/en/database/oracle/spatial-studio/23.1/index.html">📘 Oracle Spatial Studio – Oracle Help Center</a></p>
</li>
</ul>
<p>Y si aún estás en 19c o resolviendo temas con <code>shape_lib</code>, te dejamos nuestra entrega anterior como referencia completa: 👉 Newsletter técnico sobre shape_lib en Oracle 19c</p>
<hr />
<h2 id="heading-conclusion-boticaria">🧪 Conclusión boticaria</h2>
<p>En la versión 23c de Oracle Database, junto con La Botica Del DBA la spatial database se vuelve más inteligente, más visual, más conectada. No solo recetamos soluciones: ahora prescribimos plataformas completas de análisis geoespacial e integración predictiva.</p>
<p>Como DBA, te toca ser boticario, pero también cartógrafo, urbanista digital y científico de datos. Y con Oracle 23c, la botica se expande.</p>
<p>💬 ¿Ya probaste 23c con tus datos espaciales? ¿Migraste tu <code>shape_lib</code> o comenzaste a usar Spatial Studio?<br />🧴 Escribenos a la casilla <strong>admin@laboticadeldba.com</strong> o déjanos tus comentarios para más recetas, con eso me seria de mucho valor para crear nuevas recetas y las compartimos aquí en La Botica Del DBA, muchas gracias por llegar hasta aquí.</p>
<p>Aquí recetamos soluciones, no excusas.</p>
]]></content:encoded></item><item><title><![CDATA[🔬 shape_lib en Oracle 19c: cómo sobrevivir al parcheo sin perder tu geometría]]></title><description><![CDATA[Por La Botica del DBA | Oracle

🧪 Introducción boticaria
En la botica del DBA, cada componente tiene su lugar, como en una antigua farmacia donde cada frasco tiene su fórmula precisa. En el mundo de Oracle Spatial, shape_lib es ese ingrediente activ...]]></description><link>https://laboticadeldba.com/shapelib-en-oracle-19c-como-sobrevivir-al-parcheo-sin-perder-tu-geometria</link><guid isPermaLink="true">https://laboticadeldba.com/shapelib-en-oracle-19c-como-sobrevivir-al-parcheo-sin-perder-tu-geometria</guid><category><![CDATA[shape_lib]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[clusters]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 24 Mar 2025 03:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744220670928/f5038e64-fa4d-44da-9586-213dc6512671.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Por <strong>La Botica del DBA</strong> | Oracle</p>
<hr />
<h2 id="heading-introduccion-boticaria">🧪 Introducción boticaria</h2>
<p>En la botica del DBA, cada componente tiene su lugar, como en una antigua farmacia donde cada frasco tiene su fórmula precisa. En el mundo de Oracle Spatial, <code>shape_lib</code> es ese ingrediente activo que, si se pierde tras un parcheo, puede hacer que tu entorno GIS se vuelva disfuncional.</p>
<p>Este no es un simple parche. Estamos hablando de <strong>Oracle RAC 19c sobre OCI</strong>, con <strong>bases multitenant (CDB/PDB)</strong>, <strong>Fleet Patching</strong>, y <strong>external procedures</strong>. Cuando el sistema se parchea, y tus funciones espaciales desaparecen... no necesitás suerte: <strong>necesitás bisturí técnico y diagnóstico boticario</strong>.</p>
<hr />
<h2 id="heading-que-es-una-spatial-database">🌍 ¿Qué es una Spatial Database?</h2>
<p>En la botica del DBA también almacenamos mapas, coordenadas, geometrías y redes. Una <strong>Spatial Database</strong> no es más que una base de datos que sabe de territorio, caminos y posiciones: <strong>almacena, consulta y analiza datos espaciales y geoespaciales.</strong></p>
<p>En el mundo Oracle, esta capacidad cobra vida gracias a <a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/spatl/index.html"><strong>Oracle Spatial and Graph</strong></a>, una extensión nativa de Oracle Database, plenamente soportada en la versión <strong>19c</strong>, que convierte tu base en un verdadero <strong>sistema de información geográfica (GIS)</strong> empresarial.</p>
<h3 id="heading-que-permite-hacer-oracle-spatial-and-graph">🧠 ¿Qué permite hacer Oracle Spatial and Graph?</h3>
<p>Esta potente extensión habilita a <strong>desarrolladores, analistas GIS y DBAs expertos</strong> a realizar tareas de análisis espacial avanzado, integrando servicios basados en ubicación, visualización cartográfica e incluso <strong>IA geoespacial</strong>.</p>
<h3 id="heading-funciones-destacadas-en-oracle-19c"><strong>🧪 Funciones destacadas en Oracle 19c:</strong></h3>
<ul>
<li><p><strong>📐 Almacenamiento y consulta 2D/3D</strong><br />  Soporte para geometrías complejas (puntos, líneas, polígonos, modelos urbanos y gemelos digitales).</p>
</li>
<li><p><strong>🗺️ Visualización cartográfica avanzada</strong><br />  Mapas interactivos, teselas vectoriales y uso del índice geoespacial jerárquico H3.</p>
</li>
<li><p><strong>🧭 Geocodificación y enrutamiento</strong><br />  Obtención de coordenadas desde direcciones, cálculo de rutas óptimas y análisis de redes físicas y lógicas.</p>
</li>
<li><p><strong>🤖 Inteligencia Artificial Espacial</strong><br />  Integración de aprendizaje automático sobre datos geoespaciales para patrones y predicciones.</p>
</li>
<li><p><strong>🧰 Oracle Spatial Studio</strong><br />  Herramienta de autoservicio para generar mapas y análisis sin necesidad de escribir código.</p>
</li>
</ul>
<p><strong>🔗 Enlaces de referencia:</strong></p>
<ul>
<li><p><a target="_blank" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/spatl/index.html">📚 Oracle Spatial and Graph - Developer's Guide 19c (Oracle Docs)</a></p>
</li>
<li><p><a target="_blank" href="https://en.wikipedia.org/wiki/Oracle_Spatial_and_Graph">🌐 Wikipedia: Oracle Spatial and Graph</a></p>
</li>
<li><p><a target="_blank" href="https://www.oracle.com/database/technologies/spatialandgraph.html">🔬 Oracle: Spatial and Graph Overview</a></p>
</li>
</ul>
<hr />
<h2 id="heading-que-es-shapelib">🧠 ¿Qué es <code>shape_lib</code>?</h2>
<p><code>shape_lib</code> es una <strong>librería externa (</strong><code>.so</code><strong>)</strong> que Oracle utiliza mediante el proceso <code>extproc</code> para ejecutar funciones espaciales avanzadas (por ejemplo: <code>SDO_GEOM.SDO_AREA</code>). Herramientas como <strong>ArcGIS</strong> o <strong>MapInfo</strong> dependen de ella.</p>
<p>Para funcionar, necesita una receta precisa en tres frascos clave:</p>
<ul>
<li><p><code>extproc.ora</code> → archivo de configuración para procesos externos</p>
</li>
<li><p><code>listener.ora</code> y <code>tnsnames.ora</code> → rutas y servicios bien definidos</p>
</li>
<li><p>Declaración en la base → vía <code>CREATE LIBRARY</code></p>
</li>
</ul>
<hr />
<h2 id="heading-el-problema-post-parcheo-shapelib-desaparece">🧨 El problema post-parcheo: ¡shape_lib desaparece!</h2>
<p>Después de aplicar un parche (ya sea con <strong>Fleet</strong> o manualmente), en un entorno RAC sobre OCI, observamos:</p>
<ul>
<li><p>Se sobrescribe <code>extproc.ora</code>, y se pierde:</p>
<pre><code class="lang-plaintext">  SET EXTPROC_DLLS=ANY
</code></pre>
</li>
<li><p>Las funciones espaciales en el esquema <code>SDE</code> dejan de funcionar.</p>
</li>
<li><p><code>DBA_LIBRARIES</code> ya no muestra la referencia a <code>shape_lib</code>.</p>
</li>
</ul>
<hr />
<h2 id="heading-tratamiento-boticario-paso-a-paso">🔧 Tratamiento boticario paso a paso</h2>
<h4 id="heading-1-restaurar-extprocora">✅ 1. Restaurar <code>extproc.ora</code></h4>
<p>Editá el archivo en todos los nodos RAC:</p>
<pre><code class="lang-plaintext">/u01/app/19.x.x.x/grid/hs/admin/extproc.ora
</code></pre>
<p>Asegurate de que contenga:</p>
<pre><code class="lang-plaintext">SET EXTPROC_DLLS=ANY
</code></pre>
<blockquote>
<p>⚠️ <em>Recuerda aplicarlo en todos los nodos: ej.</em> <code>nodobotica-bbaa1</code> <em>y</em> <code>nodobotica-aabb2</code><em>.</em></p>
</blockquote>
<h4 id="heading-2-validar-y-recrear-la-libreria">✅ 2. Validar y (re)crear la librería</h4>
<p>Desde la PDB (ej: <code>BOTICAD19</code>) ejecutá:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SESSION</span> <span class="hljs-keyword">SET</span> <span class="hljs-keyword">CONTAINER</span> = BOTICAD19;

<span class="hljs-keyword">SELECT</span> library_name, file_spec
<span class="hljs-keyword">FROM</span> dba_libraries
<span class="hljs-keyword">WHERE</span> file_spec <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'%shape_lib%'</span>;
</code></pre>
<p>Si no aparece:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">LIBRARY</span> shape_lib <span class="hljs-keyword">AS</span> <span class="hljs-string">'/u01/app/oracle/shape_lib.so'</span>;
<span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">EXECUTE</span> <span class="hljs-keyword">ON</span> shape_lib <span class="hljs-keyword">TO</span> SDE;
</code></pre>
<h4 id="heading-3-reiniciar-instancias-para-recargar-extproc">✅ 3. Reiniciar instancias para recargar extproc</h4>
<p>Podés hacerlo manualmente o con Clusterware:</p>
<pre><code class="lang-sql">srvctl <span class="hljs-keyword">stop</span> <span class="hljs-keyword">database</span> -d botica19c_oci -f
srvctl <span class="hljs-keyword">start</span> <span class="hljs-keyword">database</span> -d botica19c_oci
</code></pre>
<hr />
<h3 id="heading-validaciones-post-receta">🧪 Validaciones post-receta</h3>
<p>Desde el usuario <code>SDE</code> o <code>SYS</code>:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> SDO_GEOM.SDO_AREA(shape, <span class="hljs-number">0.05</span>)
<span class="hljs-keyword">FROM</span> sde.&lt;tu_tabla_espacial&gt;
<span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">ROWNUM</span> = <span class="hljs-number">1</span>;
</code></pre>
<p>Si ves errores como:</p>
<ul>
<li><p><code>ORA-28575: unable to open RPC connection to external procedure agent</code></p>
</li>
<li><p><code>ORA-06520</code> o <code>ORA-06522</code><br />  \=&gt; Algo sigue fallando en <code>extproc.ora</code>, el listener o el path del <code>.s.o</code>.</p>
</li>
</ul>
<hr />
<h3 id="heading-checklist-de-la-botica">📋 Checklist de la botica</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Elemento</td><td>Validación rápida</td></tr>
</thead>
<tbody>
<tr>
<td><code>extproc.ora</code></td><td>Tiene <code>SET EXTPROC_DLLS=ANY</code></td></tr>
<tr>
<td>Librería en <code>DBA_LIBRARIES</code></td><td>Existe en la PDB correspondiente</td></tr>
<tr>
<td>Permisos</td><td><code>GRANT EXECUTE</code> aplicado a <code>SDE</code></td></tr>
<tr>
<td>Servicios</td><td><code>srvctl status service -d botica19c_oci</code></td></tr>
<tr>
<td>Funciones espaciales</td><td>Ejecutan correctamente (<code>SDO_GEOM</code>)</td></tr>
</tbody>
</table>
</div><hr />
<h3 id="heading-bonus-sql-para-diagnostico">🧪 Bonus SQL para diagnóstico</h3>
<pre><code class="lang-sql"><span class="hljs-comment">-- ¿Dónde estoy?</span>
<span class="hljs-keyword">SHOW</span> CON_NAME;

<span class="hljs-comment">-- Ver librerías externas activas</span>
<span class="hljs-keyword">SELECT</span> library_name, file_spec
<span class="hljs-keyword">FROM</span> dba_libraries
<span class="hljs-keyword">WHERE</span> file_spec <span class="hljs-keyword">IS</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>;

<span class="hljs-comment">-- Estado de instancias</span>
<span class="hljs-keyword">SELECT</span> instance_name, <span class="hljs-keyword">status</span> <span class="hljs-keyword">FROM</span> v$<span class="hljs-keyword">instance</span>;

<span class="hljs-comment">-- PDBs abiertas</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">name</span>, open_mode <span class="hljs-keyword">FROM</span> v$pdbs;

<span class="hljs-comment">-- Validar función espacial</span>
<span class="hljs-keyword">SELECT</span> SDO_GEOM.SDO_AREA(shape, <span class="hljs-number">0.05</span>)
<span class="hljs-keyword">FROM</span> sde.&lt;tu_tabla_espacial&gt;
<span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">ROWNUM</span> = <span class="hljs-number">1</span>;
</code></pre>
<hr />
<h3 id="heading-conclusion-boticaria">🧪 Conclusión boticaria</h3>
<p><strong>En la botica del DBA</strong>, una sola línea omitida puede apagar todo un sistema geoespacial. Pero con bisturí técnico, <code>srvctl</code>, y el diagnóstico adecuado, <strong>la geometría vuelve a respirar</strong>.</p>
<p>Si enfrentaste un caso similar, o si tienes tu propia fórmula secreta post-parcheo, te invitamos a compartirla con la comunidad.</p>
<p>💬 Escribeme en <a target="_blank" href="mailto:admin@laboticadeldba.com">admin@laboticadeldba.com</a><br />🧴 <em>Aquí recetamos soluciones, no excusas.</em></p>
]]></content:encoded></item><item><title><![CDATA[🩻 Análisis Postmortem con AWR: El caso de la AUD$ desbordada]]></title><description><![CDATA[🧠 Introducción
En ocasiones, las bases de datos nos hablan… pero no siempre estamos escuchando.
Esta vez, los síntomas eran difusos: lentitud intermitente, sesiones en espera, y una sensación general de que “algo no estaba bien”. Fue solo al revisar...]]></description><link>https://laboticadeldba.com/analisis-postmortem-con-awr-el-caso-de-la-aud-desbordada</link><guid isPermaLink="true">https://laboticadeldba.com/analisis-postmortem-con-awr-el-caso-de-la-aud-desbordada</guid><category><![CDATA[rendimiento]]></category><category><![CDATA[auditoría]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[dba]]></category><category><![CDATA[awr]]></category><category><![CDATA[troubleshooting]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Sun, 23 Mar 2025 22:33:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744220914099/634f89b6-4317-4965-bc67-6400024e9a66.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-introduccion">🧠 Introducción</h2>
<p>En ocasiones, las bases de datos nos hablan… pero no siempre estamos escuchando.</p>
<p>Esta vez, los síntomas eran difusos: lentitud intermitente, sesiones en espera, y una sensación general de que “algo no estaba bien”. Fue solo al revisar los reportes AWR cuando la verdad se reveló con claridad clínica: <strong>una tabla</strong> <code>AUD$</code> desbordada, sin particionar y con auditoría activada sin control estaba consumiendo más recursos de los que imaginábamos.</p>
<p>Lo que parecía una simple configuración por defecto terminó generando esperas graves como <code>buffer busy waits</code> y <code>gc buffer busy acquire</code>, afectando al sistema completo.</p>
<p>En esta edición de la botica, te comparto un caso real que nos recordó por qué incluso las tablas del sistema merecen nuestra atención. Y como siempre, te llevas la receta: pasos claros para diagnosticar, corregir y prevenir este tipo de situaciones.</p>
<p>Porque en La Botica del DBA, cada historia trae una lección… y cada lección, su remedio.</p>
<hr />
<h2 id="heading-sintomas-revelados-por-awr">🔍 Síntomas revelados por AWR</h2>
<p>Estos fueron los eventos de espera más dominantes:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Evento</td><td>% del DB Time</td></tr>
</thead>
<tbody>
<tr>
<td>buffer busy waits</td><td>58.1%</td></tr>
<tr>
<td>gc buffer busy acquire</td><td>31.6%</td></tr>
<tr>
<td>enq: HW</td><td>7.6%</td></tr>
</tbody>
</table>
</div><p>La base estaba saturada por contención de buffers y problemas de concurrencia. Algo grave estaba ocurriendo detrás de escena.</p>
<hr />
<h2 id="heading-hallazgo-de-laboratorio-aud-sin-control">🧬 Hallazgo de laboratorio: AUD$ sin control</h2>
<p>El AWR señalaba consistentemente una tabla: <code>SYS.AUD$</code>. Al analizar más a fondo, vemos que:</p>
<ul>
<li><p>Auditoría activada de forma amplia (nivel sentencia y objeto).</p>
</li>
<li><p>Inserciones continuas y concurrentes por parte de la aplicación.</p>
</li>
<li><p>Tabla <strong>no particionada</strong>.</p>
</li>
<li><p>Sin políticas de retención ni purga.</p>
</li>
<li><p>Sin optimización para entornos OLTP intensivos.</p>
</li>
</ul>
<p>Esto generaba cuellos de botella por contención de bloques, latches y saturación de espacio libre en segmentos.</p>
<hr />
<h2 id="heading-receta-para-evitar-otro-colapso">🧯 Receta para evitar otro colapso</h2>
<blockquote>
<p>Si tienes auditoría activa en producción, <strong>esto te interesa</strong>:</p>
</blockquote>
<ul>
<li><p>✅ <strong>Particionar</strong> <code>AUD$</code> por día, mes o rango.</p>
</li>
<li><p>✅ Usar <code>DBMS_AUDIT_MGMT</code> para manejar retención y purga automática.</p>
</li>
<li><p>✅ Limitar el nivel de auditoría solo a lo necesario.</p>
</li>
<li><p>✅ Mover <code>AUD$</code> a su propia tablespace si aplica.</p>
</li>
<li><p>✅ Considerar migrar a <strong>auditoría unificada</strong> (<code>Unified Auditing</code>) en versiones modernas.</p>
</li>
</ul>
<hr />
<h2 id="heading-botiquin-del-dba">📦 Botiquín del DBA</h2>
<p>Aquí algunos comandos de apoyo que puedes tener a mano:</p>
<pre><code class="lang-sql"><span class="hljs-comment">-- Ver cantidad de registros en AUD$</span>
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">COUNT</span>(*) <span class="hljs-keyword">FROM</span> SYS.AUD$;

<span class="hljs-comment">-- Consultar estadísticas de la tabla</span>
<span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> DBA_TAB_STATISTICS <span class="hljs-keyword">WHERE</span> TABLE_NAME = <span class="hljs-string">'AUD$'</span>;

<span class="hljs-comment">-- Inicializar gestión de auditoría</span>
<span class="hljs-keyword">BEGIN</span>
  DBMS_AUDIT_MGMT.INIT_CLEANUP(
    AUDIT_TRAIL_TYPE =&gt; DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
    DEFAULT_CLEANUP_INTERVAL =&gt; <span class="hljs-number">24</span> );
<span class="hljs-keyword">END</span>;
/

<span class="hljs-comment">-- Crear job automático de purga</span>
<span class="hljs-keyword">BEGIN</span>
  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
    AUDIT_TRAIL_TYPE =&gt; DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
    AUDIT_TRAIL_PURGE_INTERVAL =&gt; <span class="hljs-number">24</span>,
    AUDIT_TRAIL_PURGE_NAME =&gt; <span class="hljs-string">'Purge_AUD$'</span>,
    USE_LAST_ARCH_TIMESTAMP =&gt; <span class="hljs-literal">TRUE</span> );
<span class="hljs-keyword">END</span>;
/
</code></pre>
<h2 id="heading-reflexion-final">🧠 Reflexión final</h2>
<p>El análisis postmortem no es para culpar al muerto, sino para aprender y mejorar. El AWR nos mostró la evidencia, pero la causa raíz estaba en una mala configuración de auditoría, algo silencioso pero letal para el rendimiento.</p>
<h3 id="heading-te-gusto-esta-receta">💌 ¿Te gustó esta receta?</h3>
<p>Suscríbete a nuestro boletín y recibe cada semana/mes a mes un caso real, una solución y/o un tip de rendimiento directo de la botica.</p>
<p>🔗 www.laboticadeldba.com</p>
<p>📩 admin@laboticadeldba.com</p>
<p>Hasta la próxima consulta, colega DBA. — El Boticario del DBA 🧙⚗️</p>
]]></content:encoded></item><item><title><![CDATA[Cómo Mejorar el Rendimiento Degradado en Oracle RAC: Análisis de Memoria y Eventos de Espera.]]></title><description><![CDATA[ORA-4031, TNS-12637

🔬 Diagnóstico clínico: Lentitud severa, errores intermitentes y un RAC al borde del colapso
En esta edición de La Botica del DBA, te comparto un caso real que involucró un entorno de producción crítico, alojado en Oracle Cloud I...]]></description><link>https://laboticadeldba.com/como-mejorar-el-rendimiento-degradado-en-oracle-rac-analisis-de-memoria-y-eventos-de-espera</link><guid isPermaLink="true">https://laboticadeldba.com/como-mejorar-el-rendimiento-degradado-en-oracle-rac-analisis-de-memoria-y-eventos-de-espera</guid><category><![CDATA[ORA-4031]]></category><category><![CDATA[TNS-12637]]></category><category><![CDATA[HugePages]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[oraclerac]]></category><category><![CDATA[#oracle-rac]]></category><category><![CDATA[awr]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Sun, 23 Mar 2025 22:03:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744221141912/9eded9f0-9956-494c-adae-c34e4e2e5325.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>ORA-4031, TNS-12637</p>
<hr />
<h2 id="heading-diagnostico-clinico-lentitud-severa-errores-intermitentes-y-un-rac-al-borde-del-colapso">🔬 Diagnóstico clínico: Lentitud severa, errores intermitentes y un RAC al borde del colapso</h2>
<p>En esta edición de La Botica del DBA, te comparto un caso real que involucró un entorno de producción crítico, alojado en Oracle Cloud Infrastructure (OCI), sobre infraestructura Exadata. El síntoma inicial era claro: lentitud progresiva, sesiones en espera, y errores intermitentes de conexión (<code>TNS-12637</code>) en múltiples instancias del clúster.</p>
<p>El problema escaló hasta transformarse en una <strong>degradación severa del rendimiento</strong>.</p>
<hr />
<h2 id="heading-primera-observacion-concurrencia-secuencias-y-contencion">🔬 Primera observación: concurrencia, secuencias y contención</h2>
<p>Uno de los focos del problema estaba relacionado con la secuencia <code>ID_REG_RECETARIO.NEXTVAL</code>. Con una configuración inicial de <code>CACHE=10</code> y más de <strong>26,000 ejecuciones</strong>, el diccionario de datos se actualizaba constantemente, generando:</p>
<ul>
<li><p><code>row cache lock</code></p>
</li>
<li><p><code>buffer busy waits</code></p>
</li>
<li><p><code>enq: TX - index contention</code></p>
</li>
</ul>
<p>Una sola instancia podía sostener la carga, pero al levantar la segunda del clúster, la presión de concurrencia creaba un efecto dominó.</p>
<h3 id="heading-tratamiento-aplicado">🧴 <strong>Tratamiento aplicado</strong>:</h3>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SEQUENCE</span> BOTICARIO.ID_REG_RECETARIO <span class="hljs-keyword">CACHE</span> <span class="hljs-number">1000</span>;
</code></pre>
<p>Este simple cambio <strong>redujo de 1300 a solo 23 las escrituras en el diccionario de datos</strong> por cada 26K valores generados.</p>
<hr />
<h3 id="heading-segunda-observacion-hugepages-mal-dosificadas-ora-4031">🧠 Segunda observación: HugePages mal dosificadas = ORA-4031</h3>
<p>El siguiente síntoma fue el famoso y temido <code>ORA-4031</code>, con trazas que reportaban fallas al asignar memoria en los heaps de lectura/escritura de In-Memory Column Store (IMC). Las métricas mostraban una configuración deficiente de <a target="_blank" href="http://vm.nr"><code>vm.nr</code></a><code>_hugepages</code>.</p>
<p>📌 El entorno requería más de <strong>104K HugePages</strong>, pero el sistema operaba con mucho menos, generando:</p>
<ul>
<li><p>Fragmentación de memoria</p>
</li>
<li><p>Presión durante el startup simultáneo de instancias</p>
</li>
<li><p>Fallos esporádicos de conectividad</p>
</li>
</ul>
<p>🧪 Diagnóstico confirmado:</p>
<pre><code class="lang-sql">grep Hugepagesize /proc/meminfo
<span class="hljs-comment"># Resultado: 2048 kB</span>
</code></pre>
<p>🧾 Herramienta recomendada:</p>
<pre><code class="lang-sql">hugepages_settings.sh (Doc ID 401749.1)
</code></pre>
<p>💊 <strong>Tratamiento sugerido</strong>:</p>
<ul>
<li><p>Calcular <a target="_blank" href="http://vm.nr"><code>vm.nr</code></a><code>_hugepages</code> adecuadamente</p>
</li>
<li><p>Aplicar el cambio en una ventana de mantenimiento programada con reinicio</p>
</li>
</ul>
<hr />
<h3 id="heading-analisis-postmortem-awr">🩻 Análisis postmortem (AWR)</h3>
<p>El análisis de los reportes AWR confirmó una sobrecarga significativa en la tabla <strong>AUD$</strong>, reflejada en esperas críticas que impactaban el rendimiento global del clúster:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Evento de Espera</td><td>% del DB Time</td></tr>
</thead>
<tbody>
<tr>
<td><code>buffer busy waits</code></td><td>58.1%</td></tr>
<tr>
<td><code>gc buffer busy acquire</code></td><td>31.6%</td></tr>
<tr>
<td><code>enq: HW - contention</code></td><td>7.6%</td></tr>
</tbody>
</table>
</div><h3 id="heading-observacion-de-laboratorio">🔬 <strong>Observación de laboratorio:</strong></h3>
<p>La causa principal fue una operación de <strong>inserción masiva y continua sobre la tabla AUD$</strong>, en un entorno donde:</p>
<ul>
<li><p>La auditoría no estaba <strong>particionada</strong></p>
</li>
<li><p>No se aplicaban técnicas de <strong>retención ni purga automatizada</strong></p>
</li>
<li><p>El diseño no estaba optimizado para <strong>alto volumen de concurrencia</strong></p>
</li>
</ul>
<p>🔍 Este patrón es más común de lo que parece y puede llevar a síntomas graves de contención en entornos RAC.</p>
<p>📖 <strong>¿Te interesa profundizar en este caso específico?</strong><br />Consulta el artículo detallado:<br />➡️ <a target="_blank" href="https://laboticadeldba.com/analisis-postmortem-con-awr-el-caso-de-la-aud-desbordada">Análisis p</a><a target="_blank" href="https://laboticadeldba.com/analisis-postmortem-con-awr-el-caso-de-la-aud-desbordada">ostmortem con AWR: el caso de la AUD$ desbordada</a></p>
<hr />
<h3 id="heading-prescripcion-final">💊 Prescripción final:</h3>
<p>Pequeñas dosis de ajuste, gran alivio.</p>
<p>Este caso nos recuerda que los problemas de rendimiento en Oracle RAC no siempre vienen de grandes bugs. A veces, <strong>una secuencia sin cachear o una mala configuración de memoria</strong> puede detener un entorno entero.</p>
<h3 id="heading-recomendaciones-de-la-botica-del-dba">💊 Recomendaciones de La Botica Del DBA:</h3>
<ol>
<li><p><strong>Cachea tus secuencias</strong> — especialmente si son muy invocadas</p>
</li>
<li><p><strong>Calcula y configura adecuadamente HugePages</strong></p>
</li>
<li><p><strong>Monitorea AWR y los Top Events de forma proactiva</strong></p>
</li>
<li><p><strong>Evita que</strong> <code>AUD$</code> se convierta en un cuello de botella</p>
</li>
<li><p><strong>Haz pruebas de carga con múltiples instancias activas</strong></p>
</li>
</ol>
<hr />
<h3 id="heading-quieres-mas-recetas-oracle-como-esta">📫 ¿Quieres más recetas Oracle como esta?</h3>
<p>Suscríbete a <strong>La Botica del DBA</strong> para recibir más casos reales, scripts útiles y aprendizajes prácticos desde el quirófano de producción.<br />📥 Escríbeme a: admin@laboticadeldba.com</p>
]]></content:encoded></item><item><title><![CDATA[Tutorial para DBAs: Uso de crsctl para Configurar SPFILE en ASM (Versiones 11g-19c)]]></title><description><![CDATA[Introducción:
Como DBAs de Oracle, sabemos que el SPFILE es parte del corazón de nuestra base de datos Oracle y en la botica cuidamos la salud de las BBDD y para ello almacenar los parámetros de inicialización, y su correcta gestión es vital. En ento...]]></description><link>https://laboticadeldba.com/tutorial-para-dbas-uso-de-crsctl-para-configurar-spfile-en-asm-versiones-11g-19c</link><guid isPermaLink="true">https://laboticadeldba.com/tutorial-para-dbas-uso-de-crsctl-para-configurar-spfile-en-asm-versiones-11g-19c</guid><category><![CDATA[spfile]]></category><category><![CDATA[srvctl ]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[asm]]></category><dc:creator><![CDATA[Mauricio Muñoz Palma]]></dc:creator><pubDate>Mon, 17 Mar 2025 08:00:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744221378645/e35caa8f-4812-4bba-aab0-876bb4fac296.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Introducción:</strong></p>
<p>Como DBAs de Oracle, sabemos que el SPFILE es parte del corazón de nuestra base de datos Oracle y en la botica cuidamos la salud de las BBDD y para ello almacenar los parámetros de inicialización, y su correcta gestión es vital. En entornos ASM, modificar el SPFILE requiere un entendimiento profundo de crsctl y ASMCMD. En este artículo, te guiaré a través del proceso.</p>
<h1 id="heading-revisando-el-spfile-actual-en-asm"><strong>Revisando el SPFILE Actual en ASM:</strong></h1>
<p>Antes de realizar cualquier modificación, es fundamental conocer el SPFILE actual en uso. Aquí te muestro cómo hacerlo:</p>
<ol>
<li><h3 id="heading-usando-crsctl"><strong>Usando crsctl:</strong></h3>
<pre><code class="lang-sql"> [grid@laboratoriodelabotica ~]$ crsctl stat res ora.boticadb.db –p
</code></pre>
<p> Este comando muestra los atributos del recurso de la base de datos, incluyendo la ubicación del SPFILE.</p>
</li>
<li><h3 id="heading-copiando-el-spfile-a-un-archivo-temporal"><strong>Copiando el SPFILE a un Archivo Temporal:</strong></h3>
<pre><code class="lang-sql"> ASMCMD&gt; cp +DISKGROUPMIRROR/BOTICADBA/PARAMETERFILE/spfile.270.1032718459 /tmp/sptemp.ora
</code></pre>
<p> Copiamos el SPFILE a un archivo temporal para su edición.</p>
</li>
<li><h3 id="heading-verificando-el-estado-de-los-recursos"><strong>Verificando el Estado de los Recursos:</strong></h3>
<pre><code class="lang-sql"> crsctl stat res –t
</code></pre>
<p> Este comando muestra el estado de todos los recursos del cluster.</p>
</li>
<li><h3 id="heading-confirmando-la-ubicacion-del-spfile-con-sql"><strong>Confirmando la Ubicación del SPFILE con SQL:</strong></h3>
<pre><code class="lang-sql"> SQL&gt; <span class="hljs-keyword">show</span> parameter <span class="hljs-keyword">spfile</span>
</code></pre>
<p> Este comando confirma la ubicación del SPFILE que la base de datos está utilizando.</p>
</li>
</ol>
<h2 id="heading-modificando-el-spfile"><strong>Modificando el SPFILE:</strong></h2>
<ol>
<li><p><strong>Editando el Archivo Temporal:</strong></p>
<p> Edita el archivo <code>/tmp/sptemp.ora</code> con los cambios (solo si es necesario)</p>
</li>
<li><p><strong>Reemplazando el SPFILE en ASM:</strong></p>
<p> Aquí es donde la sintaxis de ASMCMD se vuelve crucial. Dependiendo de la versión de Oracle, los comandos pueden variar ligeramente:</p>
</li>
</ol>
<h3 id="heading-oracle-11g12c"><strong>Oracle 11g/12c:</strong></h3>
<ul>
<li><pre><code class="lang-sql">  ASMCMD&gt; rm +DISKGROUPMIRROR/BOTICADBA/PARAMETERFILE/spfile.270.1032718459
  ASMCMD&gt; cp /tmp/sptemp.ora +DISKGROUPMIRROR/BOTICADBA/PARAMETERFILE/spfile.new
</code></pre>
</li>
</ul>
<ol>
<li><h3 id="heading-actualizando-el-recurso-de-la-base-de-datos"><strong>Actualizando el Recurso de la Base de Datos:</strong></h3>
<pre><code class="lang-sql"> crsctl modify res ora.boticadb.db -attr "PARAMETER_FILE=+DISKGROUPMIRROR/BOTICADBA/PARAMETERFILE/spfile.new"
</code></pre>
<p> Actualizamos el recurso de la base de datos para que utilice el nuevo SPFILE.</p>
</li>
</ol>
<h2 id="heading-reiniciando-la-base-de-datos"><strong>Reiniciando la Base de Datos:</strong></h2>
<ol>
<li><p><strong>Deteniendo la Base de Datos:</strong></p>
<pre><code class="lang-sql"> [oracle@laboratoriodelabotica ~]$ srvctl <span class="hljs-keyword">stop</span> <span class="hljs-keyword">database</span> -d boticadb
</code></pre>
</li>
<li><p><strong>Iniciando la Base de Datos:</strong></p>
<pre><code class="lang-sql"> [oracle@laboratoriodelabotica ~]$ srvctl <span class="hljs-keyword">start</span> <span class="hljs-keyword">database</span> -d boticadb
</code></pre>
</li>
<li><p><strong>Verificando el Nuevo SPFILE:</strong></p>
<pre><code class="lang-sql"> SQL&gt; <span class="hljs-keyword">show</span> parameter <span class="hljs-keyword">spfile</span>
</code></pre>
<p> Verificamos que la base de datos esté utilizando el nuevo SPFILE.</p>
</li>
</ol>
<p><strong>Verificando la Configuración del Cluster con</strong> <code>crsctl check config</code>:</p>
<p>Después de modificar el SPFILE y reiniciar la base de datos, es crucial verificar la configuración del cluster para asegurar que todo funcione correctamente.</p>
<ol>
<li><p><strong>Ejecutando</strong> <code>crsctl check config</code>:</p>
<pre><code class="lang-sql"> [grid@laboratoriodelabotica ~]$ crsctl <span class="hljs-keyword">check</span> config
</code></pre>
<p> Este comando verifica la integridad de la configuración del cluster, incluyendo la red, el almacenamiento y los recursos.</p>
</li>
<li><p><strong>Interpretando los Resultados:</strong></p>
<ul>
<li><p><strong>Salida Exitosa:</strong></p>
<p>  Si la configuración es correcta, el comando no mostrará errores.</p>
</li>
<li><p><strong>Errores Comunes y Soluciones:</strong></p>
<ul>
<li><p><strong>Error:</strong> <code>CRS-4639: Could not contact Oracle High Availability Services</code>:</p>
<p>  Este error indica un problema con los servicios de alta disponibilidad.</p>
<ul>
<li><p><strong>Solución:</strong> Verifica que los servicios CRS estén en ejecución:</p>
<pre><code class="lang-sql">  [root@laboratoriodelabotica ~]<span class="hljs-comment"># crsctl start crs</span>
</code></pre>
</li>
</ul>
</li>
<li><p><strong>Error:</strong> <code>CRS-4535: Cannot communicate with Cluster Synchronization Services daemon</code>:</p>
<p>  Este error indica un problema con el daemon CSS.</p>
<ul>
<li><p><strong>Solución:</strong> Verifica el estado de CSS y reinicia el cluster si es necesario:</p>
<pre><code class="lang-sql">  [root@laboratoriodelabotica ~]<span class="hljs-comment"># crsctl check css</span>
  [root@laboratoriodelabotica ~]<span class="hljs-comment"># crsctl stop crs -f</span>
  [root@laboratoriodelabotica ~]<span class="hljs-comment"># crsctl start crs</span>
</code></pre>
</li>
</ul>
</li>
<li><p><strong>Error:</strong> <code>CRS-4000: Command check failed, or completed with errors</code>:</p>
<p>  Este error genérico indica que la verificación falló. Revisa los logs de CRS para obtener más detalles:</p>
<ul>
<li><p><code>/u01/app/grid/diag/crs/boticadb1/crs/trace/ocssd.log</code></p>
</li>
<li><p><code>/u01/app/grid/diag/crs/boticadb2/crs/trace/crsd.log</code></p>
</li>
<li><p><strong>Solución:</strong> Los logs te darán pistas sobre la causa del error. Sigue las recomendaciones de Oracle Support para resolver problemas específicos.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="heading-consejos"><strong>Consejos:</strong></h2>
<h3 id="heading-sintaxis-asmcmd-completa"><strong>Sintaxis ASMCMD Completa:</strong></h3>
<ul>
<li><ul>
<li><p><code>ASMCMD&gt; cp [opciones] origen destino</code>: Copia archivos entre ASM y el sistema de archivos local.</p>
<ul>
<li><p><code>ASMCMD&gt; rm [opciones] nombre_archivo</code>: Elimina archivos de ASM.</p>
</li>
<li><p><code>ASMCMD&gt; ls [opciones] [ruta]</code>: Lista el contenido de un directorio ASM.</p>
</li>
<li><p><code>ASMCMD&gt; mkdir [opciones] nombre_directorio</code>: Crea un directorio en ASM.</p>
</li>
<li><p><code>ASMCMD&gt; pwd</code>: Muestra el directorio actual en ASM.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="heading-diferencias-de-version"><strong>Diferencias de Versión:</strong></h3>
<ul>
<li><ul>
<li><p>Siempre consulta la documentación específica de tu versión de Oracle para conocer las últimas actualizaciones y cambios en ASMCMD.</p>
<ul>
<li>Presta especial atención a las opciones de los comandos, ya que pueden variar entre versiones.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="heading-ejemplos-especificos-de-parametros-del-spfile"><strong>Ejemplos Específicos de Parámetros del SPFILE:</strong></h3>
<ul>
<li><ul>
<li><p>Modificando <code>memory_target</code>:</p>
<p>    SQL</p>
<pre><code class="lang-sql">    <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SYSTEM</span> <span class="hljs-keyword">SET</span> memory_target=<span class="hljs-number">8</span>G <span class="hljs-keyword">SCOPE</span>=<span class="hljs-keyword">SPFILE</span>;
</code></pre>
<ul>
<li><p>Modificando <code>processes</code>:</p>
<p>  SQL</p>
<pre><code class="lang-sql">  <span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">SYSTEM</span> <span class="hljs-keyword">SET</span> processes=<span class="hljs-number">500</span> <span class="hljs-keyword">SCOPE</span>=<span class="hljs-keyword">SPFILE</span>;
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="heading-verificando-la-integridad-del-spfile"><strong>Verificando la Integridad del SPFILE:</strong></h3>
<ul>
<li><ul>
<li><p>Después de modificar el SPFILE, verifica que no esté corrupto:</p>
<pre><code class="lang-sql">    SQL&gt; <span class="hljs-keyword">CREATE</span> PFILE=<span class="hljs-string">'/tmp/verify.ora'</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">SPFILE</span>=<span class="hljs-string">'+DISKGROUPMIRROR/BOTICADBA/PARAMETERFILE/spfile.new'</span>;
</code></pre>
<p>    Si el comando se ejecuta sin errores, el SPFILE es válido.</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-conclusion"><strong>Conclusión:</strong></h3>
<p>Modificar el SPFILE en ASM puede parecer complejo, pero con un conocimiento sólido de crsctl y ASMCMD, y siguiendo las mejores prácticas, podemos realizar esta tarea de manera eficiente y segura.</p>
<p>En <a target="_blank" href="http://laboticadeldba.com">laboticadeldba.com</a>, te queremos acompañar en el cuidado y dedicación por las bases de Datos Oracle, espero este articulo ayude a mejorar la salud de tus bases de datos en compromiso con la excelencia y la calidad de tus entornos Oracle.</p>
]]></content:encoded></item></channel></rss>