<?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[Cluster Of Hearts]]></title><description><![CDATA[Cluster Of Hearts]]></description><link>https://clusterofhearts.com</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 17:16:46 GMT</lastBuildDate><atom:link href="https://clusterofhearts.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Statspack - Toma de contacto]]></title><description><![CDATA[Hola mundo! Bienvenidos a una tarde más de estudio de performance de Oracle SQL, hoy os traigo una pequeña actividad que hice hace unas semanas, para el Master de Optimización de SQL del reconocido DB]]></description><link>https://clusterofhearts.com/statspack-toma-de-contacto</link><guid isPermaLink="true">https://clusterofhearts.com/statspack-toma-de-contacto</guid><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Tue, 25 Aug 2026 15:19:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/ed630f4c-3824-4b91-bf9c-54e19d138a3d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hola mundo! Bienvenidos a una tarde más de estudio de performance de Oracle SQL, hoy os traigo una pequeña actividad que hice hace unas semanas, para el Master de Optimización de SQL del reconocido DBA Javier Morales, que estoy cursando actualmente (os dejo el enlace para que no os perdais la edición del año que viene: <a href="https://academia.cafedatabase.com/course/master-optimizacion-sql-en-oracle">Master Optimización SQL en Oracle</a>).</p>
<p>Al estudiar las herramientas de monitorización y análisis de rendimiento disponibles en Oracle, una de las que merece especial atención es <strong>Statspack</strong>. Esta herramienta permite recopilar estadísticas de rendimiento y generar informes detallados sobre el comportamiento de la base de datos durante un periodo de tiempo determinado y al <strong>no requerir licencias adicionales,</strong> puede utilizarse en <strong>Standard Edition</strong>, lo que la convierte en una alternativa especialmente útil para el análisis de rendimiento en entornos donde herramientas como AWR no están disponibles.</p>
<p>La tarea consistía redactar un pequeño diagnóstico analizando los varios fragmentos de un informe Stackpack, asi sin más, sin contexto, a ciegas, solo tú vs métricas. Por tanto, no es un informe completo ni una auditoria pero nos va a servir para una primera toma de contacto con Stackpack para ver qué significan algunas de sus métricas y que conclusiones podemos deducir de ellas.</p>
<p>Estos informes nos proporcionan la información sobre un periodo en el tiempo, pero el trabajo de análisis y diagnóstico corresponde al DBA. Asique vamos con ello, pero antes, recuerda:</p>
<blockquote>
<p><em>"Paso a paso y los problemas de uno en uno"</em> .</p>
</blockquote>
<hr />
<h2><strong>Análisis de Stackpack</strong></h2>
<h3><strong>1. Información básica</strong></h3>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/2b75a689-76ea-4dfa-8fbc-b2f2f6be6f42.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p>6 horas de ejecución</p>
</li>
<li><p>Elapsed: 360 mins</p>
</li>
<li><p>DB time: 27.96 min → la BD trabajó 27.96 min de las 6 h reales →0.1 av de actives sessions ( 0.077)</p>
</li>
<li><p><strong>Primera conclusión:</strong> no ha tenido mucha caga, la base de datos no está estresada.</p>
</li>
</ul>
<hr />
<h3><strong>2. Top 5 timed events</strong></h3>
<p>Primero una breve definición de lo que estamos analizando:</p>
<ul>
<li><p>CPU time: tiempo que oracle pasó ejecutando activamente código en la cpu, representa el tiempo de trabajo real:</p>
<ul>
<li><p>Ejecución de sentencias SQL, JOINS....</p>
</li>
<li><p>Parseo</p>
</li>
<li><p>Ejecuciones de PL/SQL</p>
</li>
<li><p>Cálculo de planes</p>
</li>
</ul>
</li>
<li><p>log file sync: evento de espera, tras hacer un commit:</p>
<ul>
<li><p>Escribe los redo logs</p>
</li>
<li><p>Espera confirmacion fisica del disco</p>
</li>
<li><p>Devuelve control al user</p>
</li>
<li><p>La sesión está esperando a que el LGWR termine de escribir los redo</p>
</li>
</ul>
</li>
<li><p>direct path read: oracle está leyendo bloques desde disco a la PGA directamente, sin pasar por buffer cache.</p>
<ul>
<li><a href="https://clusterofhearts.hashnode.dev/scattered-vs-sequential">Ampliar conocimiento</a></li>
</ul>
</li>
<li><p>db file sequencial read: lectura secuencial de bloques individuales( normalmente implica acceso por índice). Un valor alto puede implicar:</p>
<ul>
<li><p>Nested loops excesivos, índices malo, I/O lento</p>
</li>
<li><p>SQL ejecutándose millones de veces</p>
</li>
<li><p>Importante mirar → Average wait</p>
</li>
<li><p>Tiempos:</p>
<ul>
<li><p>0-2 ms : excelente</p>
</li>
<li><p>3-8 ms: normal</p>
</li>
<li><p>10-20 ms: sospechoso</p>
</li>
<li><p>&gt;20: storage lento</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Disk file operations I/O: oracle espera operaciones físicas sobre archivos, no necesariamente lecturas de tablas. Muy común en RMAN, autoextend, tempfile creciendo, ASM/filesystem lento. Puede involucrar:</p>
<ul>
<li><p>Apertura/cierre de datafiles</p>
</li>
<li><p>Resize de archivos</p>
</li>
<li><p>File metadata</p>
</li>
<li><p>Tempfiles</p>
</li>
</ul>
</li>
</ul>
<p><strong>Resumen:</strong></p>
<ul>
<li><p>CPU alta → problemas lógicos (SQL)</p>
</li>
<li><p>Sequencial read alto → problema de acceso a datos</p>
</li>
<li><p>Direct path read alto → queries grandes /full scans</p>
</li>
<li><p>Log files sync alto → problemas de commit/ redo</p>
</li>
<li><p>Disk file operation i/o → problema infra/storage</p>
</li>
</ul>
<p><strong>Ahora interpretamos los parámetros que acompañan a los eventos</strong></p>
<ul>
<li><p>Waits: cantidad de veces que oracle tuve que esperar ese evento</p>
</li>
<li><p>Time(S)<strong>: t</strong>otal tiempo acumulado esperando ese evento ( tiempo total perdido)</p>
</li>
<li><p>Avgs wait(ms) : tiempo promedio que oracle tardó en cada spera ( es decir, si el recurso responde rápido o lento)</p>
</li>
<li><p>% total call time: porcentaje del tiempo total de DB Time consumido por ese evento</p>
</li>
</ul>
<p>Volviendo a nuestro informe:</p>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/ab173bed-ce75-42cc-90cd-027d1f412586.png" alt="" style="display:block;margin:0 auto" />

<p><strong>CPU time</strong></p>
<ul>
<li><p>Oracle estuvo 878 segundo ejecutando trabajo</p>
</li>
<li><p><strong>Conclusión</strong>: 58.6% del db time fue cpu → más de la mitad del tiempo fue trabajo efectivo de oracle, no esperas</p>
</li>
</ul>
<p><strong>Log file sync</strong></p>
<ul>
<li><p>241.888 waits → 242mil eventos de redo log escribiéndose en disco para una bd con solo 27.96 mins de DB time</p>
<ul>
<li><p>entonces, no estaba sobrecargada pero algo podría estar dando lugar a un elevado numero de commits, checkpoints, escrituras internas</p>
</li>
<li><p>conformando el 25.4% del DB Time</p>
</li>
</ul>
</li>
<li><p>Tiempo consumido = 382 s (6.36 s)</p>
</li>
<li><p>Avg: probablemente truncado → 1.58 mins x 241.888 = 382 s</p>
<ul>
<li>2ms para log file sync es bueno</li>
</ul>
</li>
<li><p><strong>Conclusión:</strong> la infra parece estar sana, el problema puede estar en la aplicación.</p>
</li>
</ul>
<p><strong>Direct path read</strong></p>
<ul>
<li><p>127 mil operaciones.</p>
</li>
<li><p>Avg wait excelente.</p>
</li>
<li><p>Tiempo consumido 146s (2.4 min)</p>
</li>
<li><p>menos del 10% del tiempo total de oracle</p>
</li>
<li><p><strong>Conclusión:</strong> aunque ocurrió con un frecuencia alta, apenas supone el 10% total.</p>
</li>
</ul>
<p><strong>Segunda conclusión general:</strong></p>
<ul>
<li><p>DB sana a nivel de infraestructura.</p>
</li>
<li><p><strong>Posibles problemas:</strong></p>
<ul>
<li><p>de lógica SQL</p>
</li>
<li><p>commints frecuentes</p>
</li>
<li><p>consultas muy grandes.</p>
</li>
</ul>
</li>
</ul>
<hr />
<h3><strong>3. SQLs de alto impacto</strong></h3>
<p><strong>SELECT * FROM ZNOTIFICACIONES</strong></p>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/3e6e7e01-e09f-4201-ae53-ae983ea43b3f.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p><strong>Elapsed time :</strong> tiempo total consumido por todas las ejecuciones</p>
<ul>
<li>176.91-32.36 = <strong>144.45s que estuvo esperando</strong></li>
</ul>
</li>
<li><p><strong>Executions:</strong> se ejecutó 108 veces</p>
</li>
<li><p><strong>Elap per exec</strong> : cada ejecución tarda 1.64 s</p>
</li>
<li><p><strong>Total:</strong> consume el 10.5% del tiempo total</p>
</li>
<li><p><strong>CPU time:</strong> solo 32.46 s fueron de cpu</p>
</li>
<li><p><strong>Physical read:</strong> lecturas a disco porque no está en buffer cache  (valor muy alto)</p>
</li>
<li><p><strong>FECHA_CREACION &lt;= SYSDATE</strong></p>
</li>
</ul>
<p><strong>→</strong> Todo lo creado hasta hoy (probablemente toda la tabla , lo que implicará un Full Scan</p>
<p>→ Sumamos carga al ordenarlo luego por id</p>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/431ed41c-f08b-4700-b761-d1d41bc103e0.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p>Cada vez que se lanza está leyendo casi 58,633.5 bloques</p>
<ul>
<li>Cada bloque ≃  8KB → 58.633 bloques  x 8KB = <strong>aprox 469 MB por ejecución</strong></li>
</ul>
</li>
<li><p>Physical Reads totales ≃ 6.332.423 x 8 kb ≃ <strong>48 GB leídos en disco</strong></p>
</li>
<li><p><strong>Conclusión:</strong> 48 GB leídos en disco, excesivo para una select sobre una tabla</p>
</li>
</ul>
<hr />
<p><strong>DETELE FROM SINCRTMP</strong></p>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/6b27c5ce-0398-46b2-ad94-85328858dcd9.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p><strong>Executions</strong>:  número muy elevado de ejecuciones</p>
<ul>
<li>31900 veces ejecutada cada hora →532 veces cada minuto → se puede estar ejecutando en bucle</li>
</ul>
</li>
<li><p><strong>Buffer</strong> <strong>Gets</strong>: lecturas lógicas altísimas</p>
</li>
<li><p><strong>Gets per executioin → muy alto para borrado usando una clave</strong></p>
</li>
<li><p><strong>Elapsed time:</strong> unos casi 25 min, mucho tiempo</p>
<ul>
<li><p>Se ejecuta 191.857 veces y cada ejecución lee aproximadamente 1.919 bloques lógicos</p>
</li>
<li><p>Tiempo medio de ejecución: 1490.41s / 191.857 = aprox 0.0078s ( 8 ms)</p>
<ul>
<li>8 ms x 191.857 veces = aprox 1534s (aprox el elapsed time, casi 25 min )</li>
</ul>
</li>
</ul>
</li>
<li><p>Tiempo medio de ejecución: 1490.41s / 191.857 = aprox 0.0078s ( 8 ms)</p>
<ul>
<li>8 ms x 191.857 veces = aprox 1534s (aprox el elapsd time,casi 25 min)</li>
</ul>
</li>
</ul>
<p>Buffer gets son bloques leídos en memoria, desde buffer cache. No implican disco, pero sí implican trabajo lógico de oracle:</p>
<ul>
<li><p>Buscar bloques</p>
</li>
<li><p>Recorrer índices</p>
</li>
<li><p>Comprobar filas</p>
</li>
</ul>
<p><strong>Conclusión:</strong> muy probable Oracle está haciendo un Full Scan para cada delete  → problema con el índice, quizás mal definido/inexistente ??</p>
<p>Soluciones:</p>
<ul>
<li><p>Comprimir la tabla.</p>
</li>
<li><p>Crear un índice por clave.</p>
</li>
<li><p>Analizar si es posibles reducir esas 191.857 ejecuciones con un <em>sleep</em> para bajar la frecuencia con la que se ejecuta, una vez por minuto por ejemplo, en vez de cada 8 ms.</p>
</li>
</ul>
<hr />
<p><strong>Análisis de segmentos</strong></p>
<p>Que porcentaje de todas las lecturas lógicas de la bd pertenece a ese objeto.</p>
<p>Los logical reads (buffer gets):</p>
<ul>
<li><p>Bloques leídos desde buffer cache</p>
</li>
<li><p>Accesos lógicos en memoria oracle</p>
</li>
</ul>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/bf900877-ed8e-4e3f-9615-b4044ad77f42.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p>Conclusiones:</p>
<ul>
<li><p>Las ejecuciones sobre la tabla ZNOTIFICACIONES genera el 93.9 % de todas las lecturas físicas de la instancia</p>
</li>
<li><p>Logical reads = 3.219.424  ≃  Physical Reads= 3.218.456</p>
</li>
</ul>
</li>
</ul>
<p>→ prácticamente cada lectura lógica ha implicado una lectura física a disco</p>
<p>→no está usando bloques en caché</p>
<hr />
<p><strong>SELECT…. INNER JOIN….</strong></p>
<img src="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/a936cb9c-f8bf-4669-82d9-b95657b87eec.png" alt="" style="display:block;margin:0 auto" />

<ul>
<li><p>CPU TIME ≈ Elapsed → la query no espera, consume CPU principalmente</p>
</li>
<li><p>Ese 36.6% es sobre el trabajo efectivo, esos 27 minutos totales de la bd</p>
</li>
<li><p>Gets per Exec demasiado alta para una select con filtros</p>
</li>
</ul>
<p>Lo que podemos deducir:</p>
<ul>
<li><p>En cada ejecución leemos esos 2.147 bloques, es decir, nos lo estamos trayendo todo prácticamente en cada ejecución</p>
</li>
<li><p>la ZSD puede ser una vista</p>
</li>
<li><p>JOIN en el que probablemente no coincidan FK con PK</p>
</li>
<li><p>JOIN transformada para que encaje bien</p>
</li>
<li><p>Se estań completando los valores con 0</p>
</li>
<li><p><strong>Conclusión</strong>: no parece un problema de disco ni esperas, puede ser un problema con las columnas que se utilizan para hacer el join y los filtros.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[scattered vs sequential]]></title><description><![CDATA[Hola hola, hace mucho de la última vez que publiqué un post, eso no significa que haya estado parada, a verces todos necesitamos un tiempo de reflexión para volver con más ganas y más preguntas que re]]></description><link>https://clusterofhearts.com/scattered-vs-sequential</link><guid isPermaLink="true">https://clusterofhearts.com/scattered-vs-sequential</guid><category><![CDATA[db_scattered_read]]></category><category><![CDATA[db_sequential_read]]></category><category><![CDATA[direct_path_read]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[scattered]]></category><category><![CDATA[sequential]]></category><category><![CDATA[lecturas]]></category><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Wed, 22 Jul 2026 15:47:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/c10b5792-c9f4-4313-bd92-916a9369d84f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hola hola, hace mucho de la última vez que publiqué un post, eso no significa que haya estado parada, a verces todos necesitamos un tiempo de reflexión para volver con más ganas y más preguntas que respuestas.</p>
<p>En mi nuevo camino, aprendiendo a leer e interpretar métricas de informes Stackpack y AWR (quizás haga algún post sobre esto más adelante) , hoy les traigo un poco de teoría, y como estos son apuntes tanto para vosotros, curiosos lectores, como para mi, aqui os dejo un poco de información que quizás os sea útil en algún momento.</p>
<p>La pregunta del verano:</p>
<p>✨ cuál es la diferencia entre <em>db_scattered_read</em>, <em>db_file_sequential_read</em> y <em>direct_path_read</em> ? ✨</p>
<p>La respuesta más corta podría ser:</p>
<ul>
<li><p><em>db_scattered_read</em> y <em>db_file_sequential_read</em> son eventos de espera generados por lecturas de tablas mediante "full table scan" y lecturas a tablas a partir de un índice, que devuelven un gran número de filas, respectivamente.</p>
</li>
<li><p><em>direct_path_read</em> es una lectura de bloques desde disco a la PGA (área de memoria del proceso) sin cargar y almacenar estos bloques en el buffer cahe de la SGA.</p>
</li>
</ul>
<p>Ahora bien, vamos a desarrollar esto un poco más, para los más curiosos y hambrientos de conocimiento.</p>
<p><em><strong>db_scattered_read* y *db_file_sequential_read</strong></em></p>
<p>Lo primero a tener en cuenta es que "scattered" y "sequencial" NO hace referencia a cómo se lee fisicamente el db_file, si no, a qué se hace con esas lecturas físicas</p>
<ul>
<li><p>Sequencial es una lectura secuencial de bloques independientes. Hasta que no recupera un bloque, no va al siguiente secuencialmente (normalmente implica acceso por índice). Un valor alto de db_sequential_read puede indicar:</p>
<ul>
<li><p>demasiados excesos fila a fila</p>
</li>
<li><p>nested loops excesivos</p>
</li>
<li><p>índices malos</p>
</li>
<li><p>sql ejecutándose millones de veces</p>
</li>
<li><p>I/O lento</p>
</li>
</ul>
</li>
<li><p>Scattered es un lectura de multibloque. Esto significa que en una misma operación se leen varios bloques contiguos y los almacena de manera dispersa en el buffer cache, en bloques no contiguos (normalmente indica un Full Table Scan). Un alto valor en db_scattered_read puede indicar:</p>
<ul>
<li><p>Full Table Scans sobe tablas muy grandes</p>
</li>
<li><p>Falta de índices</p>
</li>
<li><p>Planes de ejecución ineficientes</p>
</li>
</ul>
</li>
</ul>
<p><strong>direct_path_read</strong></p>
<p>Como su nombre indica, son lecturas de bloques directamente desde el disco a la PGA del proceso, sin pasar por la Buffer Cache del SGA.</p>
<p>Es común encontrarlo en:</p>
<ul>
<li><p>Grandes Full Tables Scans</p>
</li>
<li><p>Operaciones paralelas</p>
</li>
<li><p>Procesos de RMAN (backups y restores)</p>
</li>
<li><p>Hash Joins que procesan grandes volúmenes de datos</p>
</li>
</ul>
<p>Oracle utiliza el direct_path_read cuando estima que cargar los bloques en la buffer cache tendría poco beneficio final, ya que una consulta que lea millones de bloques una única vez desplazaría datos en la cache que sí podrían reutilizar otros procesos.</p>
]]></content:encoded></item><item><title><![CDATA[Resolviendo SCAN]]></title><description><![CDATA[SCAN (Single Client Access Name) es un nombre de red que permite a los clientes conectarse a una base de datos RAC (Oracle Real Application Clusters) sin preocuparse por las instancias subyacentes del]]></description><link>https://clusterofhearts.com/resolviendo-scan</link><guid isPermaLink="true">https://clusterofhearts.com/resolviendo-scan</guid><category><![CDATA[scan]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[rac]]></category><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Tue, 16 Dec 2025 06:43:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/436716cd-4738-4ed8-b832-6f0da5a9356e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>SCAN</strong> <strong>(Single Client Access Name)</strong> es un nombre de red que permite a los clientes conectarse a una base de datos <strong>RAC (Oracle Real Application Clusters)</strong> sin preocuparse por las instancias subyacentes del clúster. Oracle RAC utiliza SCAN para proporcionar una entrada única para todas las instancias en el clúster. SCAN debe resolver un DNS alias a almenos tres direcciones IP virtuales diferentes en un entorno de producción facilitando el balanceo de carga y la alta disponibilidad.</p>
<h2>Resolución de nombres</h2>
<p>Cuando un cliente quiere conectarse a la base de datos RAC, usa el nombre SCAN en su conexión. El cliente realiza una consulta DNS para poder resolver el nombre SCAN y el servidor DNS devuelve una de las IPs SCAN (generalmente se hace un balanceo de carga simple tipo Round-Robin entre las IPs SCAN configuradas).</p>
<p>El cliente se conecta a la <strong>IP SCAN</strong> obtenida, donde uno de los <strong>SCAN listeners</strong> está escuchando. Cada IP SCAN tiene un listener asociado, y estos listeners se distribuyen en los nodos del cluster para garantizar la alta disponibilidad. El SCAN listener recibe la solicitud de conexión inicial, pero este no gestiona la conexión directamente a las instancias de bases de datos, en cambio, se comunica con los local listeners en los nodos para redirigir la conexion al nodo adecuado.</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763123246242/9385bcf2-dbaa-4b5a-bd01-d44c815e5856.png" alt="" style="display:block;margin:0 auto" />

<p>El SCAN listener consulta el <strong>Oracle Cluster Registry (OCR)</strong> para obtener el estado de la base de datos y las instancias disponibles, asi como los recursos de carga de trabajo en cada nodo. Basándose en esta información, el SCAN listener redirige la conexión a uno de los local listeners de un nodo específico del cluster que este disponible. El cliente es redirigido a la direccion IP del nodo específico donde se encuentra el local listener.</p>
<p>Una vez conectado al local listener del nodo, el cliente establece la sesion de base de datos con una instancia en ese nodo. Si el nodo está ocupado o sufre un fallo, Oracle RAC y el Clusterware gestionarán el failover de la conexión a otro nodo automáticamente.</p>
<p>Configurar SCAN es un paso esencial en la instalación y configuración de un entorno de RAC, y a continuación veremos paso a paso como hacer dicha configruación.</p>
<p>Let’s go!</p>
<h3><strong>1. Configurar SCAN en DNS</strong></h3>
<p>Configurar SCAN en el DNS es un paso crítico. El nombre SCAN debe resolver a tres direcciones IP.</p>
<ul>
<li><p>Ejemplo:</p>
<ul>
<li><p>Si tu SCAN es <a href="http://rac-scan.example.com">rac-scan.example.com</a>, debes configurar las siguientes entradas en el DNS</p>
<pre><code class="language-powershell">root@rac-example.localhost:~&gt; nslookup rac-example-scan
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   rac-example-scan
Address: 192.168.1.101
Name:   rac-example-scan
Address: 192.168.1.102
Name:   rac-example-scan
Address: 192.168.1.103
** server cant find rac-example-scan: SERVFAIL
</code></pre>
</li>
<li><p>Esto significa que el nombre <a href="http://rac-scan.example.com">rac-scan.example.com</a> puede resolverse en cualquiera de estas tres direcciones IP, permitiendo que el balanceo de carga distribuya las conexiones entrantes entre ellas.</p>
</li>
</ul>
</li>
</ul>
<h3>2. <strong>Configurar el entorno de red en los nodos RAC</strong></h3>
<p>En cada nodo del clúster RAC, asegúrate de que el entorno de red está correctamente configurado en cada nodo. Esto incluye tener interfaces de red separadas:</p>
<ul>
<li><p>Red pública</p>
</li>
<li><p>Red privada (interconexión entre nodos)</p>
</li>
<li><p>IP virtual (SCAN)</p>
<ul>
<li>Asegurando que las direcciones IP de SCAN (192.168.1.101, 192.168.1.102, 192.168.1.103) no estén asignadas a ninguna interfaz física.</li>
</ul>
</li>
<li><p>Oracle Grid Infrastructure gestionará estas IPs como IPs virtuales.</p>
</li>
</ul>
<h3>3. <strong>Instalación y configuración de Oracle Grid Infrastructure</strong></h3>
<p>Durante la instalación de Oracle Grid Infrastructure, te pedirá que ingreses el nombre de SCAN. Aquí es donde ingresas <a href="http://rac-scan.example.com">rac-scan.example.com</a>.</p>
<ul>
<li><p>Ejemplo de instalación:</p>
<ul>
<li><p>Al ejecutar el instalador de Oracle Grid Infrastructure, en la sección de configuración de la red:</p>
<pre><code class="language-powershell">SCAN Name: rac-scan.example.com
SCAN Port: 1521 # o el puerto de escucha predeterminado
</code></pre>
<ul>
<li>El instalador verificará que <a href="http://rac-scan.example.com">rac-scan.example.com</a> resuelve a tres direcciones IP diferentes.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>4. Verificar la configuración de SCAN</h3>
<p>Después de completar la instalación, puedes verificar que SCAN esté funcionando correctamente. Oracle CRS (Cluster Ready Services) administrará los servicios SCAN y se asegurará de que estén en funcionamiento.</p>
<p>Para verificar que las IPs de SCAN están correctamente registradas y que los listeners de SCAN están en funcionamiento, puedes usar:</p>
<pre><code class="language-powershell">srvctl config scan
srvctl config scan_listener
srvctl status scan
srvctl status scan_listener
</code></pre>
<ul>
<li>Estos comandos te mostrarán la configuración de SCAN, las IPs asociadas, y el estado de los listeners de SCAN.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Oracle Errors]]></title><description><![CDATA[Antes de poder solucionar un problema, es necesario saber qué ha pasado.
Oracle nos proporciona códigos de error que nos ayudan a identificar la causa del fallo.
Pero… ¿y si no sabes interpretar esos ]]></description><link>https://clusterofhearts.com/oracle-errors</link><guid isPermaLink="true">https://clusterofhearts.com/oracle-errors</guid><category><![CDATA[Oracle]]></category><category><![CDATA[errors]]></category><category><![CDATA[ora]]></category><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Fri, 07 Nov 2025 17:41:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/bf7a5a82-b69d-4fc6-81c4-5692fb82399d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Antes de poder solucionar un problema, es necesario saber qué ha pasado.</p>
<p>Oracle nos proporciona códigos de error que nos ayudan a identificar la causa del fallo.</p>
<p><em>Pero… ¿y si no sabes interpretar esos códigos?</em></p>
<p>Fue lo primero que pensé cuando empecé a pelearme con la infrastructura. Asi decidí crear mi propia documentación de errores, tan útil como la documentación de soluciones.</p>
<p><strong>ORA-00265</strong></p>
<pre><code class="language-sql">
SQL&gt; alter database archivelog;

    ERROR at line 1:

    ORA-00265: instance recovery required, cannot set ARCHIVELOG mode
</code></pre>
<ul>
<li>la BD no se apagó correctamente</li>
</ul>
<p><strong>ORA-02097 &amp; ORA-19802</strong></p>
<pre><code class="language-sql">SQL&gt; alter system set db_recovery_file_dest='/mnt/oracle/fast_recovery_area';

    ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid
ORA-19802: cannot use DB_RECOVERY_FILE_DEST without DB_RECOVERY_FILE_DEST_SIZE
</code></pre>
<ul>
<li>Antes de especificar un destino para los ARCHIVE LOGs necesitamos especificar un tamaño, eso se hace definiendo el parámetro <em>db_recovery_file_dest_size</em></li>
</ul>
<p><strong>ORA-01261 &amp; ORA-01262</strong></p>
<p>Estos errores están relacionados con el parámetro <strong><em>db_recovery_file_dest</em>.</strong></p>
<ul>
<li><p>Oracle no puede acceder o encontrar el directorio especificado para <em>db_recovery_file_dest</em>, ubicación de la <strong>Fast Recovery Area (FRA)</strong>. Esto puede deberse a:</p>
<ul>
<li><p>Directorio no existe</p>
</li>
<li><p>problemas de permisos</p>
</li>
<li><p>ruta mal configurada</p>
</li>
<li><p>FRA apunta a una ruta mal montada, Oracle verifica permisos y acceso físico</p>
</li>
</ul>
</li>
<li><p>Verifica el contenido de tu archivo <em>init.ora</em> y busca el parámetro <em>db_recovery_file_dest</em> .</p>
<ul>
<li><p>Asegúrate de que el directorio especificado exista en el sistema operativo</p>
</li>
<li><p>usuario oracle tenga permisos para acceder y escribir en ese directorio.</p>
</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SQL&gt; startup

ORA-01261: Parameter db_recovery_file_dest destination string is not valid
ORA-01262: Parameter db_recovery_file_dest destination cannot be translated
Errors in file /u01/app/oracle/diag/rdbms/orcl/trace/orcl_ora_12345.trc:
ORA-19802: cannot use DB_RECOVERY_FILE_DEST without DB_RECOVERY_FILE_DEST_SIZE

-- el arranque se detiene en NOMOUNT O MOUNT, sin llegar a abrirse la BD
-- Oracle hace esto antes de abrir los datafiles, si no puede garantizar el acceso al destino
-- de la FRA, no continua el arranque


--Verificalos parametros
show parameter db_recovery_file_dest
show parameter db_recovery_file_dest_size



ALTER SYSTEM SET db_recovery_file_dest_size=10G; 
ALTER SYSTEM SET db_recovery_file_dest='/mnt/oracle/fast_recovery_area'; 
</code></pre>
<ul>
<li><strong>Error al montar el Filesystem en la FRA</strong></li>
</ul>
<p>Oracle intenta acceder a una ruta que sí existe como carpeta, pero <strong>en realidad está vacía</strong> porque el volumen no está montado.</p>
<pre><code class="language-sql">ORA-01261: Parameter db_recovery_file_dest destination string is not valid
ORA-01262: Parameter db_recovery_file_dest destination cannot be translated
</code></pre>
<p>Incluso si la BD logra abrirse, los procesos ARC o RMAN intentarán escribir en la FRA. Si en ese momento el filesystem se desmonta o no tiene acceso correcto, se repiten estos errores en el <em>alert.log</em>:</p>
<pre><code class="language-sql">ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory
</code></pre>
<p><strong>ORA-19809</strong></p>
<p>Cuando se excede el espacio asignado a la FRA (db_recovery_file_dest_size) , y Oracle no puede liberar espacio automáticamente.</p>
<p><strong>ORA-19804</strong></p>
<p>Oracle RMAN (Recovery Manager) no puede reclamar espacio necesario para completar el backup. annot reclaim the space needed to complete the backup.</p>
<ul>
<li><p>Ampliar tamaño</p>
</li>
<li><p>Eliminar backups antiguos</p>
</li>
</ul>
<p><strong>DPI-1080: connection was closed by ORA-03113</strong></p>
<p><strong>ORA-03113:</strong> indica que la conexión se perdió abruptamente entre cliente y servidor.</p>
<ul>
<li>Oracle cierra las sesiones de usuarios inactivos (idle). Este error se da en el lado del cliente, no en el servidor.</li>
</ul>
<p><strong>DPI-1080:</strong> es el error correspondiente en el cliente <strong>cx_Oracle</strong> o <strong>ODPI-C</strong> (usado por Python, Node.js, etc.).</p>
<ul>
<li><p>Causas comunes:</p>
<ul>
<li><p>Sesión matada por inactividad</p>
</li>
<li><p>Timeout</p>
</li>
<li><p>Fallo en el listener o reinicio del servidor</p>
</li>
</ul>
</li>
<li><p>Revisar en el lado del cliente si el firewall tiene timeouts/idle time en:</p>
<ul>
<li><p>Firewall</p>
</li>
<li><p>VPN setup</p>
</li>
<li><p>Load balancer</p>
</li>
</ul>
</li>
</ul>
<p><strong>ORA-12170 Connection Timeout</strong></p>
<p>Indica que el cliente intentó conectarse a la base de datos Oracle, pero no recibió respuesta dentro del tiempo límite configurado. Es básicamente un timeout en la conexión inicial.</p>
<ul>
<li>Verificar la conectividad:</li>
</ul>
<pre><code class="language-powershell"># Si usas hostname
ping &lt;nombre_servidor&gt;
# O directamente la IP
ping &lt;ip_servidor&gt;

#Conectividad a nivel de puerto
telnet &lt;host&gt; &lt;puerto&gt;
nc -vz &lt;host&gt; &lt;puerto&gt;
Test-NetConnection -ComputerName &lt;host&gt; -Port &lt;puerto&gt; # (Windows)

# Verificar que el listener esté arriba
lsnrctl status

# Verificar conectividad TNS desde cliente a traves de la capa TNS de Oracle
tnsping &lt;alias_tns&gt;

# Verificar ruta
traceroute &lt;host&gt;
# o en Windows:
tracert &lt;host&gt;
</code></pre>
<p><strong>ORA-00600: internal error code, arguments: [...][...][...][...]</strong></p>
<p>Error interno del motor de Oracle. Indica un fallo en una verificación interna o corrupción lógica.</p>
<p>Puedes encontrar mas informacion en <em>alert.log</em>, buscar el <em>trace file</em> en <em>$ORACLE_BASE/diag ,</em> e interpretar los <em>arguments</em> para diagnosticar corrupción de bloques, errores de redo o bugs.</p>
<ul>
<li>ORA-00600 [2662]: ocurre cuando el SCN leído es menor al SCN requerido, generalmente por un recovery inconsistente.</li>
</ul>
<p><strong>ORA-01555: snapshot too old</strong></p>
<p>Ocurre cuando una consulta larga intenta leer versiones antiguas de bloques del <em>undo tablespace</em>, pero esos bloques ya fueron sobrescritos.</p>
<p>Vistas que pueden dar mas información:</p>
<ul>
<li><p><em>v$undostat</em></p>
</li>
<li><p><em>v$transaction</em></p>
</li>
</ul>
<p><strong>ORA-19502 / ORA-19504</strong></p>
<p>Error en la escritura de backup (RMAN o exportación). Puede ser por:</p>
<ul>
<li><p>Espacio</p>
</li>
<li><p>Permisos</p>
</li>
<li><p>Fallos en disco/NFS</p>
</li>
</ul>
<p>Recomendación, verificar:</p>
<ul>
<li><p>Permisos en el destino de backup</p>
</li>
<li><p>Configuración del <em>db_recovery_file_dest</em> y <em>rman channels</em></p>
</li>
</ul>
<p>Este post se actualizará periódicamente.</p>
<p><em>Y tú, que errores conoces?</em></p>
]]></content:encoded></item><item><title><![CDATA[MOUNT vs NOMOUNT, he aquí la cuestión]]></title><description><![CDATA[Pensando en cual sería mi primera aportación, quise hacer honor a lo que he aprendido en este tiempo junto al Arquitecto DBA Jose Carlos Pavón, quién fue la primera persona que me planteó y me enseñó ]]></description><link>https://clusterofhearts.com/mount-vs-nomount-he-aqui-la-cuestion</link><guid isPermaLink="true">https://clusterofhearts.com/mount-vs-nomount-he-aqui-la-cuestion</guid><category><![CDATA[#nomount]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[mount]]></category><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Wed, 29 Oct 2025 14:30:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687f61392b207e2aaaaaaa30/d3fbf9df-cf00-4f5e-b972-4ae5d274f15f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pensando en cual sería mi primera aportación, quise hacer honor a lo que he aprendido en este tiempo junto al Arquitecto DBA Jose Carlos Pavón, quién fue la primera persona que me planteó y me enseñó algo fundamental:</p>
<p><em>‘‘ Puedes llevar 20 años trabajando con bases de datos, que si no sabes responder esta sencilla pregunta, no has entendido cómo funcionan realmente las bases de datos, asi que: Qué diferencia hay entre el estado MOUNT y NOMOUNT? “</em></p>
<p>Pensé en lo que habia aprendido en clase, cuando nos explicaban los diferentes estados en lo que podia encontrarse las bases de datos de Oracle. Pero, sorpresa: no tenia una respuesta directa que dar. En mi mente era texto memorizado y escrito en un examen.</p>
<p>Y así llegó mi primera lección: si no puedes responder a una pregunta sencila sobre cómo funciona internamente una base de datos, de poco sirve lanzar <em>queries</em> o saber hacer un <em>shutdown</em>.</p>
<p>Por tanto, vamos a contestar a esta pregunta, MOUNT y NOMOUNT, he aquí la cuestión.</p>
<p>La respuesta corta es:</p>
<p><em>“En NOMOUNT arranca y se construye la instancia de Oracle, pero la base de datos no está montada, no es accesible.”</em></p>
<p>Ahora vamos a documentar un poco más esta lección. Primero, Oracle separa el arranque en varias fases porque su arquitectura tambien está dividida:</p>
<ul>
<li><p>Por una lado tenemos la <em><strong>instancia</strong></em></p>
</li>
<li><p>Por otro lado, la <em><strong>base de datos</strong></em> física</p>
</li>
</ul>
<p>Y encontramos tres estados en Oracle, OPEN, MOUNT y NOMOUNT.</p>
<h1><strong>NOMOUNT</strong></h1>
<p>Es el primer estado de arranque. Se construye la <strong>instancia</strong> (procesos + áreas de memoria), pero en este punto la instancia todavia no tiene ninguna informacion acerca de los ficheros que componen la base de datos y su estructura (esa informacion se encuentra en los ficheros de control o CONTROLFILES)</p>
<p>Oracle solo lee los archivos de parámetros en <em><strong>$ORACLE_HOME/dbs :</strong></em></p>
<ul>
<li><p>primero lee <em>spfile.ora</em></p>
</li>
<li><p>si no lo encuentra, lee el <em>init.ora</em></p>
</li>
</ul>
<p>ℹ️ Especificando el PFILE en el comando de arranque <em>STARTUP</em> se puede iniciar con otro PFILE determinado</p>
<pre><code class="language-sql">SQL&gt; STARTUP NOMOUNT PFILE='/home/oracle/my_pfile_.ora';
</code></pre>
<p>Este estado se usa para:</p>
<ul>
<li><p>Crear o recuperar archivos de control</p>
</li>
<li><p>Tareas de mantenimiento que no requieren acceso a los <em>DATAFILES</em></p>
</li>
<li><p>Recuperar o crear una base de datos</p>
</li>
</ul>
<h1><strong>MOUNT</strong></h1>
<p>En este estado, Oracle monta la base de datos, es decir, lee los controls files (parámetro <em>CONTROLFILE</em>) en el archivo de parámetros, que contiene la estructura fisica de la base de datos. Los archivos de control tiene información sobre los:</p>
<ul>
<li><p><em>DATAFILES</em></p>
</li>
<li><p><em>REDO LOGs</em></p>
</li>
</ul>
<p>Pero en este punto todavia, los datos todavía no son accesibles.</p>
<p>Se usa para:</p>
<ul>
<li><p>Recuperaciones (recovery)</p>
</li>
<li><p>Cambiar el modo de archivado (<em>ARCHIVELOG / NOARCHIVELOG</em>)</p>
</li>
</ul>
<h1><strong>OPEN</strong></h1>
<p>Es el estado operativo final. En este punto, Oracle abre los archivos de datos y los redo logs, la base de datos ya esta lista para poder conectarse, hacer consultas, etc.</p>
<p>Se usa para:</p>
<ul>
<li><p>Conexiones de usuarios</p>
</li>
<li><p>Consultas y modificaciones de datos (DML)</p>
</li>
<li><p>Otras operaciones</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Hola mundo!]]></title><description><![CDATA[Este blog nace como mi cuaderno de viaje en el vasto mundo de la infraestructura y las bases de datos. No tengo intención de descubrir nada nuevo, sino de documentar los retos, errores y aprendizajes ]]></description><link>https://clusterofhearts.com/1</link><guid isPermaLink="true">https://clusterofhearts.com/1</guid><dc:creator><![CDATA[Carmen García]]></dc:creator><pubDate>Tue, 22 Jul 2025 10:07:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761734081142/76ba55b5-4eba-44be-af32-3aad930e2d94.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Este blog nace como mi cuaderno de viaje en el vasto mundo de la infraestructura y las bases de datos. No tengo intención de descubrir nada nuevo, sino de documentar los retos, errores y aprendizajes que me encuentre en este camino que apenas he comenzado a recorrer. Es una forma de ordenar mis ideas, de aprender compartiendo, y tal vez de ayudar a alguien que esté recorriendo el mismo camino.</p>
]]></content:encoded></item></channel></rss>