<?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[DBA DE TRINCHERA]]></title><description><![CDATA[En este blog encontrarás artículos técnicos de bases de datos Oracle breves que van al hueso, directo al problema y a la solución.]]></description><link>https://dbadetrinchera.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1726091716494/24de1e30-63a4-412c-9bc4-d6859791788d.png</url><title>DBA DE TRINCHERA</title><link>https://dbadetrinchera.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 07:20:03 GMT</lastBuildDate><atom:link href="https://dbadetrinchera.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[¿Qué versiones de clientes Oracle se conectan a mi base?]]></title><description><![CDATA[Para poder saber esto sin perdernos de ninguna conexión, ni siquiera esas conexiones que se realizan una vez por mes y por la noche, crearemos un trigger de logon que relevará la información del cliente y la guardará en una tabla para este fin.
Comen...]]></description><link>https://dbadetrinchera.com/que-versiones-de-clientes-oracle-se-conectan-a-mi-base</link><guid isPermaLink="true">https://dbadetrinchera.com/que-versiones-de-clientes-oracle-se-conectan-a-mi-base</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Thu, 20 Nov 2025 13:28:06 GMT</pubDate><content:encoded><![CDATA[<p>Para poder saber esto sin perdernos de ninguna conexión, ni siquiera esas conexiones que se realizan una vez por mes y por la noche, crearemos un trigger de logon que relevará la información del cliente y la guardará en una tabla para este fin.</p>
<p>Comencemos creando una tabla en el esquema SYS. Yo en este ejemplo la creé en el tablespace SYSAUX, pero vos podés crearla en el tablespace que mejor te parezca:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> sys.audit_sesiones_cliente (
    <span class="hljs-keyword">id</span>               <span class="hljs-built_in">NUMBER</span> <span class="hljs-keyword">GENERATED</span> <span class="hljs-keyword">ALWAYS</span> <span class="hljs-keyword">AS</span> <span class="hljs-keyword">IDENTITY</span>,
    evento           <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">10</span>),   <span class="hljs-comment">-- LOGON | LOGOFF</span>
    fecha_evento     <span class="hljs-built_in">DATE</span>,
    <span class="hljs-keyword">sid</span>              <span class="hljs-built_in">NUMBER</span>,
    <span class="hljs-built_in">serial</span><span class="hljs-comment">#          NUMBER,</span>
    inst_id          <span class="hljs-built_in">NUMBER</span>,
    username         <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>),
    osuser           <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">30</span>),
    machine          <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">64</span>),
    program          <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">128</span>),
    client_version   <span class="hljs-built_in">VARCHAR2</span>(<span class="hljs-number">20</span>)
) <span class="hljs-keyword">TABLESPACE</span> <span class="hljs-keyword">SYSAUX</span>;
</code></pre>
<p>Y ahora creamos el trigger de logon, que contemplará todas las conexiones que se realicen en todos los nodos del RAC:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TRIGGER</span> SYS.trg_logon_cliente
<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">BEGIN</span>
    <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> SYS.audit_sesiones_cliente (
        evento, fecha_evento,
        <span class="hljs-keyword">sid</span>, <span class="hljs-built_in">serial</span><span class="hljs-comment">#, inst_id,</span>
        username, osuser, machine, program,
        client_version
    )
    <span class="hljs-keyword">SELECT</span> <span class="hljs-string">'LOGON'</span>, <span class="hljs-keyword">SYSDATE</span>,
           s.sid, s.serial<span class="hljs-comment">#, s.inst_id,</span>
           s.username, s.osuser, s.machine, s.program,
           c.client_version
    <span class="hljs-keyword">FROM</span> gv$<span class="hljs-keyword">session</span> s
    <span class="hljs-keyword">JOIN</span> gv$session_connect_info c
      <span class="hljs-keyword">ON</span> s.inst_id = c.inst_id
     <span class="hljs-keyword">AND</span> s.sid     = c.sid
   <span class="hljs-keyword">WHERE</span> s.audsid = SYS_CONTEXT(<span class="hljs-string">'USERENV'</span>,<span class="hljs-string">'SESSIONID'</span>);
<span class="hljs-keyword">END</span>;
/
</code></pre>
<p>Listo, ahora a esperar que pase al menos un mes, para no perdernos ninguna conexión de esos procesos batches que se ejecutan una vez por mes. Si en tu entorno tenés procesos que se ejecutan semestralmente, deberás esperar 6 meses para asegurarte de no perder nada.</p>
<p>¡Esto es todo!</p>
<p>Hasta el próximo post 😀</p>
<p>Saludos desde Buenos Aires, Argentina</p>
]]></content:encoded></item><item><title><![CDATA[Cómo conectar una base Oracle con otra PostgreSQL]]></title><description><![CDATA[Existen varias arquitecturas para resolver este desafío, en mi caso yo utilicé un servidor intermedio y dedicado para el Gateway:

El primer paso es instalar el driver ODBC. En mi caso utilicé un servidor nuevo con el sistema operativo Oracle Linux 8...]]></description><link>https://dbadetrinchera.com/como-conectar-una-base-oracle-con-otra-postgresql</link><guid isPermaLink="true">https://dbadetrinchera.com/como-conectar-una-base-oracle-con-otra-postgresql</guid><category><![CDATA[Oracle]]></category><category><![CDATA[gateway]]></category><category><![CDATA[PostgreSQL]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Mon, 18 Aug 2025 14:33:52 GMT</pubDate><content:encoded><![CDATA[<p>Existen varias arquitecturas para resolver este desafío, en mi caso yo utilicé un servidor intermedio y dedicado para el Gateway:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755525544367/d33d83d2-6876-4c48-bdd8-92d519fde641.png" alt class="image--center mx-auto" /></p>
<p>El primer paso es instalar el <strong>driver ODBC</strong>. En mi caso utilicé un servidor nuevo con el sistema operativo Oracle Linux 8 con conexión a internet:</p>
<pre><code class="lang-bash">yum install unixODBC*
</code></pre>
<p>Luego debemos instalar el <strong>Oracle Database Gateway for ODBC</strong>, el mismo se descarga desde aquí: <a target="_blank" href="https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html">https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html</a></p>
<p>Mientras se descarga el archivo, preparamos el servidor para la instalación del Gateway:</p>
<pre><code class="lang-bash">yum install oracle-database-preinstall-19c
mkdir /u01/app/oracle/instalador
</code></pre>
<p>Una vez descargado el instalador del gateway (LINUX.X64_193000_gateways.zip), lo copiamos al directorio <strong>/u01/app/oracle/instalador</strong> y seguimos estos pasos:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> /u01/app/oracle/instalador
unzip LINUX.X64_193000_gateways.zip
<span class="hljs-built_in">cd</span> gateways
<span class="hljs-built_in">export</span> CV_ASSUME_DISTID=OL8
./runInstaller
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526108648/912343b0-bc37-473d-ab65-ed6271c9bfb2.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526118199/60df1076-9de9-4d96-8257-d78d20a52549.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526124633/f42421d8-03bd-4331-9b5c-d243a9544329.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526133022/a7abcb34-76d1-45dd-af08-fb9d3d4e65a0.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526139130/c93dbe54-028b-4d84-a125-ae3ec3270aed.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526145141/4c6c8578-da0d-4955-893c-167b423c78ae.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526149405/e7412a5b-b1b0-4b97-808b-8fff45e5cc49.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526155502/706234fc-c479-437c-94d3-265c17fdb13e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526159412/12898ccb-49c3-4948-a199-bb46e34af15e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526164007/67f7c578-1777-45ce-b91f-8d3bdffed5bc.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526168439/9152aacc-1b1a-487a-bf80-7e49369f8f48.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526174350/bc9c040c-06f4-4aad-a104-d2b063e764a1.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526178575/ee761291-0e37-4a78-b9da-d9dec8b613e8.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526184465/d1da789f-fd26-4a38-959e-04b66de0fb99.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755526187458/86c66d10-d624-4c54-b886-3be365105a66.png" alt class="image--center mx-auto" /></p>
<p>Ahora comenzamos a configurar el Gateway:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1
<span class="hljs-built_in">cd</span> <span class="hljs-variable">$ORACLE_HOME</span>/hs/admin
vi <span class="hljs-variable">$ORACLE_HOME</span>/hs/admin/init&lt;SID&gt;.ora
<span class="hljs-comment">#####################################################################################################</span>
vi <span class="hljs-variable">$ORACLE_HOME</span>/hs/admin/initpostgresUAT.ora

<span class="hljs-comment"># This is a sample agent init file that contains the HS parameters that are</span>
<span class="hljs-comment"># needed for the Database Gateway for ODBC</span>

<span class="hljs-comment">#</span>
<span class="hljs-comment"># HS init parameters</span>
<span class="hljs-comment">#</span>
HS_FDS_CONNECT_INFO = postgresUAT  &lt;========= AQUI PUEDES USAR EL VALOR QUE DESEES. ESTE SERÁ TU SID
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

<span class="hljs-comment">#</span>
<span class="hljs-comment"># ODBC specific environment variables</span>
<span class="hljs-comment">#</span>
<span class="hljs-built_in">set</span> ODBCINI=/etc/odbc.ini

<span class="hljs-comment">#</span>
<span class="hljs-comment"># Environment variables required for the non-Oracle system</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment">#set &lt;envvar&gt;=&lt;value&gt;</span>
</code></pre>
<p>Ahora agregamos el SID elegido al listener:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> <span class="hljs-variable">$ORACLE_HOME</span>/network/admin
cp -p listener.ora listener.ora.bkp
vi listener.ora

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME= postgresUAT) &lt;== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN EL PUNTO ANTERIOR
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1)
         (ENVS=<span class="hljs-string">"LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/19.0.0/tghome_1/lib"</span>)
         (PROGRAM=dg4odbc)
      )
  )
</code></pre>
<p>Reiniciamos el listener para que tome el cambio anterior:</p>
<pre><code class="lang-bash"><span class="hljs-variable">$ORACLE_HOME</span>/bin/lsnrctl stop
<span class="hljs-variable">$ORACLE_HOME</span>/bin/lsnrctl start
</code></pre>
<p>Luego instalamos el <strong>driver PostgreSQL</strong>:</p>
<pre><code class="lang-bash">yum install postgresql*odbc
vi /etc/odbc.ini

[postgresUAT] &lt;============= ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
Driver = PostgreSQL
Description = PostgreSQL ODBC Driver
Database = &lt;database_name_postgres&gt;
Servername = &lt;hostname_postgres&gt;
Username = &lt;usuario_postgres&gt;
Password = &lt;contraseña_usuario_postgres&gt;
Port = &lt;puerto_postgres&gt;
BOOLSASCHAR=No
UseDeclareFetch = 1
CommLog = /tmp/pgodbclink.log
Debug = 1
</code></pre>
<p><strong>IMPORTANTE:</strong> El valor de la variable <strong>Driver</strong>, debe coincidir con el valor que aparece entre corchetes en el archivo <strong>/etc/odbcinst.ini</strong></p>
<p>Luego probamos la conectividad desde el Gateway hacia la base PostgreSQL:</p>
<pre><code class="lang-bash">isql -v postgresUAT
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| <span class="hljs-built_in">help</span> [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
</code></pre>
<p>Una vez que verificamos el correcto funcionamiento de la conexión, nos dirigimos al servidor de base de datos Oracle y allí agregamos al archivo <strong>tnsnames.ora</strong> la cadena de conexión que utilizará el dblink:</p>
<pre><code class="lang-bash">GATEWAY_POSTGRES=
   (DESCRIPTION=
      (ADDRESS=
         (PROTOCOL=TCP)
         (HOST=&lt;hostname_gateway&gt;)  &lt;====== ESPECIFICAR EL NOMBRE DEL SERVIDOR DEL GATEWAY
         (PORT=1521)
      )
      (CONNECT_DATA=
         (SID= postgresUAT)) &lt;== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
      (HS=OK)
   )
</code></pre>
<p>Por último nos conectamos a la base Oracle, creamos el dblink y lo probamos:</p>
<pre><code class="lang-bash">CREATE PUBLIC DATABASE LINK TEST_POSTGRES
 CONNECT TO &lt;usuario_postgres&gt;
 IDENTIFIED BY &lt;contraseña_usuario_postgres&gt;
 USING <span class="hljs-string">'GATEWAY_POSTGRES'</span>;

SELECT * FROM &lt;tabla&gt;@TEST_POSTGRES;
</code></pre>
<p>¡Esto es todo!</p>
<p>Hasta el próximo post 😀</p>
<p>Saludos desde Buenos Aires, Argentina</p>
]]></content:encoded></item><item><title><![CDATA[Cómo migrar una política de auditoría de FGA]]></title><description><![CDATA[El objetivo es migrar una política FGA desde una base origen a una base destino

Relevar las políticas habilitadas en la base origen con la siguiente consulta:

SELECT * FROM DBA_AUDIT_POLICIES WHERE ENABLED='YES'


Crear las políticas en la base des...]]></description><link>https://dbadetrinchera.com/como-migrar-una-politica-de-auditoria-de-fga</link><guid isPermaLink="true">https://dbadetrinchera.com/como-migrar-una-politica-de-auditoria-de-fga</guid><category><![CDATA[Oracle]]></category><category><![CDATA[auditoría]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Mon, 12 May 2025 13:28:47 GMT</pubDate><content:encoded><![CDATA[<p>El objetivo es migrar una política FGA desde una base origen a una base destino</p>
<ol>
<li>Relevar las políticas habilitadas en la base origen con la siguiente consulta:</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> DBA_AUDIT_POLICIES <span class="hljs-keyword">WHERE</span> ENABLED=<span class="hljs-string">'YES'</span>
</code></pre>
<ol start="2">
<li>Crear las políticas en la base destino con los datos obtenidos anteriormente. Esto se deberá ejecutar por cada una de las políticas que aparezca en la consulta anterior</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">BEGIN</span>
  DBMS_FGA.ADD_POLICY(
    object_schema   =&gt; <span class="hljs-string">'PIA'</span>, 
    object_name     =&gt; <span class="hljs-string">'"FN_Matri"'</span>,
    policy_name     =&gt; <span class="hljs-string">'ALU_FN_MATRI'</span>,
    audit_condition =&gt; <span class="hljs-string">'"alumnoId"=xxxxx'</span>,
    statement_types =&gt; <span class="hljs-string">'INSERT, UPDATE, DELETE'</span>,
    handler_module  =&gt; <span class="hljs-literal">NULL</span>,   
    <span class="hljs-keyword">enable</span>     =&gt; <span class="hljs-literal">TRUE</span>,
    audit_column    =&gt; <span class="hljs-string">'"alumnoId"'</span>
  );
<span class="hljs-keyword">END</span>;
/
</code></pre>
<p>¡Esto es todo!</p>
<p>Hasta el próximo post 😀</p>
<p>Saludos desde Buenos Aires, Argentina</p>
]]></content:encoded></item><item><title><![CDATA[Cómo hacer un upgrade del CRS de Oracle 12.2 a 19c en Oracle Linux 8]]></title><description><![CDATA[Entorno: RAC de 2 nodos con Oracle Linux 8 y un CRS versión 12.2
Primero descargamos el instalador del GRID con el usuario oracle:
$ cd /u01/soft/gi_19c
$ wget --http-user=xxxx@xxxx --http-password=xxxx --no-check-certificate --output-document=V98206...]]></description><link>https://dbadetrinchera.com/como-hacer-un-upgrade-del-crs-de-oracle-122-a-19c-en-oracle-linux-8</link><guid isPermaLink="true">https://dbadetrinchera.com/como-hacer-un-upgrade-del-crs-de-oracle-122-a-19c-en-oracle-linux-8</guid><category><![CDATA[Oracle]]></category><category><![CDATA[upgrade]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Tue, 15 Apr 2025 13:55:16 GMT</pubDate><content:encoded><![CDATA[<p><strong>Entorno:</strong> RAC de 2 nodos con Oracle Linux 8 y un CRS versión 12.2</p>
<p>Primero descargamos el instalador del GRID con el usuario oracle:</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> /u01/soft/gi_19c
$ wget --http-user=xxxx@xxxx --http-password=xxxx --no-check-certificate --output-document=V982068-01.zip <span class="hljs-string">"https://edelivery.oracle.com/osdc/softwareDownload?fileName=V982068-01.zip&amp;token=ejQxL3hTRllsK1Nway9QQmJCdXk2USE6OiFmaWxlSWQ9MTA0NDg4MDA5JmZpbGVTZXRDaWQ9OTAxMzI3JnJlbGVhc2VDaWRzPTg5OTMzMiZwbGF0Zm9ybUNpZHM9MzUmZG93bmxvYWRUeXBlPTk1NzY0JmFncmVlbWVudElkPTExNjgwOTE1JmVtYWlsQWRkcmVzcz1mYWdyYW5kZUB1YWRlLmVkdS5hciZ1c2VyTmFtZT1FUEQtRkFHUkFOREVAVUFERS5FRFUuQVImaXBBZGRyZXNzPTE3MC4yMzkuMTcwLjEwOCZ1c2VyQWdlbnQ9TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzNC4wLjAuMCBTYWZhcmkvNTM3LjM2JmNvdW50cnlDb2RlPUFSJmRscENpZHM9MTA2MzIwOQ"</span>
</code></pre>
<p>Luego descargamos el último parche RU disponible, en mi caso fue el GI RELEASE UPDATE 19.26.0.0.0</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> /u01/soft/gi_19c/parche
$ wget --http-user=xxxx@xxxx --http-password=xxxx --no-check-certificate --output-document=p37257886_190000_Linux-x86-64.zip <span class="hljs-string">"https://updates.oracle.com/Orion/Services/download/p37257886_190000_Linux-x86-64.zip?aru=26041193&amp;patch_file=p37257886_190000_Linux-x86-64.zip"</span>
</code></pre>
<p>Creamos los directorios necesarios y descomprimimos los nuevos binarios 19c. Previamente debes asegurarte que tengas espacio libre en el /u01:</p>
<pre><code class="lang-bash">mkdir -p /u01/app/19.0.0/grid 
chown oracle:oinstall /u01/app/19.0.0/grid 
su - oracle
$ cp V982068-01.zip /u01/app/19.0.0/grid/ 
$ <span class="hljs-built_in">cd</span> /u01/app/19.0.0/grid/ 
$ unzip V982068-01.zip 
$ rm V982068-01.zip
</code></pre>
<p>Debido a que en Oracle Linux 8 la versión del OPENSSH es 8, la validación de la conectividad SSH fallará con el siguiente error:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744723488564/765ae44f-0a76-4253-856f-e0b8240c9faf.png" alt class="image--center mx-auto" /></p>
<p>Para evitar este error, debemos aplicar el último RU disponible en el nuevo $GI_HOME, previo a su configuración (ejecución del root.sh) - Fuente: Nota 2555697.1</p>
<p>Pero previamente debemos descargar e instalar la última versión del OPatch para version 19c (Patch 6880880).</p>
<p>Como estamos trabajando en un Oracle Linux 8, al ejecutar el instalador aparecerá el siguiente mensaje de error:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744724722147/b8ecb1eb-13b0-42e0-abe3-4e616c09d7f8.png" alt class="image--center mx-auto" /></p>
<p>Para evitarlo debemos configurar la variable CV_ASSUME_DISTID con el valor OEL7</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> /u01/soft/gi_19c/parche
$ unzip p37257886_190000_Linux-x86-64.zip
$ <span class="hljs-built_in">export</span> CV_ASSUME_DISTID=OEL7
$ <span class="hljs-built_in">export</span> ORACLE_HOME=/u01/app/19.0.0/grid
$ <span class="hljs-variable">$ORACLE_HOME</span>/gridSetup.sh -applyRU /u01/soft/gi_19c/parche/37257886
</code></pre>
<p>Luego verificamos que nuestro ambiente cumpla con todos los requisitos necesarios para realizar el upgrade:</p>
<pre><code class="lang-bash">$ /u01/app/19.0.0/grid/runcluvfy.sh stage -pre crsinst -upgrade -rolling -src_crshome /u01/app/12.2.0/grid -dest_crshome /u01/app/19.0.0/grid -dest_version 19.0.0.0.0 -fixupnoexec -verbose &gt; cluverify.log
</code></pre>
<p>En mi caso, el cluvfy me indicó que debía descargar y aplicar el parche 27006180 en el $GI_HOME origen (12.2)</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">cd</span> /u01/soft/parches
$ wget --http-user=xxxx@xxxx --http-password=xxxx --no-check-certificate --output-document=p27006180_122010_Linux-x86-64.zip <span class="hljs-string">"https://updates.oracle.com/Orion/Services/download/p27006180_122010_Linux-x86-64.zip?aru=21761216&amp;patch_file=p27006180_122010_Linux-x86-64.zip"</span>
$ unzip p27006180_122010_Linux-x86-64.zip
</code></pre>
<p>Antes de aplicar el parche, debí descargar e instalar la última versión del OPatch para 12.2</p>
<p>Luego aplicamos el parche con el usuario root en modo rolling (de a un nodo por vez) para evitar pérdida de servicio total:</p>
<p><strong>NODO 1</strong></p>
<pre><code class="lang-bash">yum install -y zip
<span class="hljs-built_in">export</span> ORACLE_HOME=/u01/app/12.2.0/grid
<span class="hljs-variable">$ORACLE_HOME</span>/bin/crsctl stop crs =&gt; COMIENZA PERDIDA DE SERVICIO EN EL NODO 1.
(Lo bajo porque sino me devuelve este error:
OPATCHAUTO-72030: Execution mode invalid. OPATCHAUTO-72030: Cannot execute <span class="hljs-keyword">in</span> rolling mode, as CRS home is shared. OPATCHAUTO-72030: Execute <span class="hljs-keyword">in</span> non-rolling mode. OPatchAuto failed.)

<span class="hljs-variable">$ORACLE_HOME</span>/OPatch/opatchauto apply /u01/soft/parches/27006180 -oh <span class="hljs-variable">$ORACLE_HOME</span> -analyze
<span class="hljs-variable">$ORACLE_HOME</span>/OPatch/opatchauto apply /u01/soft/parches/27006180 -oh <span class="hljs-variable">$ORACLE_HOME</span>
<span class="hljs-variable">$ORACLE_HOME</span>/bin/crsctl start crs =&gt; VUELVE A DAR SERVICIO EL NODO 1.
</code></pre>
<p><strong>NODO 2</strong></p>
<pre><code class="lang-bash">yum install -y zip
<span class="hljs-variable">$ORACLE_HOME</span>/bin/crsctl stop crs =&gt; COMIENZA PERDIDA DE SERVICIO EN EL NODO 2.
<span class="hljs-variable">$ORACLE_HOME</span>/OPatch/opatchauto apply /u01/soft/parches/27006180 -oh <span class="hljs-variable">$ORACLE_HOME</span> -analyze
<span class="hljs-variable">$ORACLE_HOME</span>/OPatch/opatchauto apply /u01/soft/parches/27006180 -oh <span class="hljs-variable">$ORACLE_HOME</span>
<span class="hljs-variable">$ORACLE_HOME</span>/bin/crsctl start crs =&gt; VUELVE A DAR SERVICIO EL NODO 2.
</code></pre>
<p>Volvemos a ejecutar el CLUVFY para corroborar que ya no figuren errores:</p>
<pre><code class="lang-bash">$ /u01/app/19.0.0/grid/runcluvfy.sh stage -pre crsinst -upgrade -rolling -src_crshome /u01/app/12.2.0/grid -dest_crshome /u01/app/19.0.0/grid -dest_version 19.0.0.0.0 -fixupnoexec -verbose &gt; cluverify_2.log
</code></pre>
<p>Si ya no se presentan errores, avanzamos con el proceso (para no hacer tan largo este artículo con las imágenes del instalador, resumo los pasos):</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">export</span> CV_ASSUME_DISTID=OEL7 
$ /u01/app/19.0.0/grid/gridSetup.sh -dryRunForUpgrade
    - Upgrade Oracle Grid Infrastructure
    - Next
    - Next
    - Next
    - Verificar que el Oracle Base sea el correcto y luego hacer clic en Next
    - Next
    - Asegurarse que no exista ningún punto con estado Failed. Clic en Next
    - Submit 
    - Ejecutar el /u01/app/19.0.0/grid/rootupgrade.sh como root. Esto demora varios minutos
</code></pre>
<p>Por precaución, reinicio los nodos del RAC (de a uno por vez) antes del upgrade para asegurarme que no exista ningún problema previo y que todo levante bien.</p>
<p>Ahora sí, ejecutamos el proceso del upgrade, esto provocará una pérdida de servicio total de la base de datos, con lo cual se deberá realizar en una ventana de trabajo previamente coordinada con el negocio:</p>
<pre><code class="lang-bash">$ /u01/app/19.0.0/grid/gridSetup.sh
</code></pre>
<p>Consultamos la version del CRS</p>
<pre><code class="lang-bash">$ /u01/app/19.0.0/grid/bin/crsctl query crs activeversion
</code></pre>
<p>¡Listo! Ya tenemos nuestro CRS en versión 19c 😀</p>
<p>Hasta el próximo post 😀</p>
<p>Saludos desde Buenos Aires, Argentina</p>
]]></content:encoded></item><item><title><![CDATA[Cómo saber si una base usó o usa una funcionalidad - feature]]></title><description><![CDATA[Para esto consultamos la vista DBA_FEATURE_USAGE_STATISTICS
SELECT * FROM DBA_FEATURE_USAGE_STATISTICS;

El resultado muestra el detalle de cada feature, cuántas veces se detectó su uso, cuando y si está siendo utilizado actualmente:

Hasta el próxim...]]></description><link>https://dbadetrinchera.com/como-saber-si-una-base-uso-o-usa-una-funcionalidad-feature</link><guid isPermaLink="true">https://dbadetrinchera.com/como-saber-si-una-base-uso-o-usa-una-funcionalidad-feature</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Wed, 26 Feb 2025 12:51:36 GMT</pubDate><content:encoded><![CDATA[<p>Para esto consultamos la vista DBA_FEATURE_USAGE_STATISTICS</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> DBA_FEATURE_USAGE_STATISTICS;
</code></pre>
<p>El resultado muestra el detalle de cada feature, cuántas veces se detectó su uso, cuando y si está siendo utilizado actualmente:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1740574155696/12e45d12-dc3e-42e7-81ff-ec8b7c8ddf03.png" alt class="image--center mx-auto" /></p>
<p>Hasta el próximo post :)</p>
<p>Saludos desde Buenos Aires, Argentina</p>
]]></content:encoded></item><item><title><![CDATA[Historial de crecimiento de una base de datos]]></title><description><![CDATA[Nos conectamos a la base de datos del Cloud Control con el usuario SYSMAN y ejecutamos la siguiente consulta:
SELECT ROLLUP_TIMESTAMP, MAXIMUM FROM sysman.mgmt$metric_daily
WHERE UPPER(TARGET_NAME) = '<nombre_base>' 
AND COLUMN_LABEL='Allocated Space...]]></description><link>https://dbadetrinchera.com/historial-de-crecimiento-de-una-base-de-datos</link><guid isPermaLink="true">https://dbadetrinchera.com/historial-de-crecimiento-de-una-base-de-datos</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Tue, 25 Feb 2025 14:18:57 GMT</pubDate><content:encoded><![CDATA[<p>Nos conectamos a la base de datos del Cloud Control con el usuario SYSMAN y ejecutamos la siguiente consulta:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> ROLLUP_TIMESTAMP, MAXIMUM <span class="hljs-keyword">FROM</span> sysman.mgmt$metric_daily
<span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">UPPER</span>(TARGET_NAME) = <span class="hljs-string">'&lt;nombre_base&gt;'</span> 
<span class="hljs-keyword">AND</span> COLUMN_LABEL=<span class="hljs-string">'Allocated Space(GB)'</span> 
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> ROLLUP_TIMESTAMP <span class="hljs-keyword">DESC</span>;
</code></pre>
<p>¡Eso es todo! muy simple.</p>
<p>Hasta el próximo post :)</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Como saber la contraseña del usuario weblogic del Enterprise Manager Cloud Control]]></title><description><![CDATA[Existe un archivo que guarda la contraseña encriptada, vamos a buscarlo…
cd $OMS_BASE/gc_inst/user_projects/domains/GCDomain/
cat servers/EMGC_ADMINSERVER/security/boot.properties
username={AES256}84+JCnGGZvrlC2TsRdBYBlum4tLn4I9Cew/tCZxJw/A=
password...]]></description><link>https://dbadetrinchera.com/como-saber-la-contrasena-del-usuario-weblogic-del-enterprise-manager-cloud-control</link><guid isPermaLink="true">https://dbadetrinchera.com/como-saber-la-contrasena-del-usuario-weblogic-del-enterprise-manager-cloud-control</guid><category><![CDATA[Cloud control]]></category><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Thu, 20 Feb 2025 13:59:02 GMT</pubDate><content:encoded><![CDATA[<p>Existe un archivo que guarda la contraseña encriptada, vamos a buscarlo…</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> <span class="hljs-variable">$OMS_BASE</span>/gc_inst/user_projects/domains/GCDomain/
cat servers/EMGC_ADMINSERVER/security/boot.properties
username={AES256}84+JCnGGZvrlC2TsRdBYBlum4tLn4I9Cew/tCZxJw/A=
password={AES256}GZW3hhW87Fs98+mdfrC2PkDthJ2nMCc7Nhoxtlf9Dro=
</code></pre>
<p>Creamos un archivo java llamado <strong>recoverpassword.java</strong> que desencriptará esa contraseña</p>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">recoverpassword</span> </span>{
 <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span>
 </span>{
  System.out.println(
  <span class="hljs-keyword">new</span> weblogic.security.internal.encryption.ClearOrEncryptedService(
  weblogic.security.internal.SerializedSystemIni.getEncryptionService(args[<span class="hljs-number">0</span>]
   )).decrypt(args[<span class="hljs-number">1</span>]));
  }
}
</code></pre>
<p>Ejecutamos el archivo de la siguiente manera</p>
<pre><code class="lang-bash">javac recoverpassword.java
java -cp <span class="hljs-variable">$CLASSPATH</span>:. recoverpassword <span class="hljs-variable">$DOMAIN_HOME</span> {AES}84+JCnGGZvrlC2TsRdBYBlum4tLn4I9Cew/tCZxJw/A=
java -cp <span class="hljs-variable">$CLASSPATH</span>:. recoverpassword <span class="hljs-variable">$DOMAIN_HOME</span> {AES}GZW3hhW87Fs98+mdfrC2PkDthJ2nMCc7Nhoxtlf9Dro=
</code></pre>
<p>Y listo!</p>
<p>Hasta el próximo post :).</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[OUI-10022: The target area /u01/app/oraInventory cannot be used because it is in an invalid state.]]></title><description><![CDATA[Revisar dentro del directorio /u01/app/oraInventory/locks si hay archivos. En mi caso existía el siguiente archivo:
-rw-rw----. 1 oracle oinstall 0 Aug 14  2017 inventory.lock

Eliminarlo y luego reintentar la operación.
Fuente: https://jasonbrownsit...]]></description><link>https://dbadetrinchera.com/oui-10022-the-target-area-u01apporainventory-cannot-be-used-because-it-is-in-an-invalid-state</link><guid isPermaLink="true">https://dbadetrinchera.com/oui-10022-the-target-area-u01apporainventory-cannot-be-used-because-it-is-in-an-invalid-state</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Tue, 18 Feb 2025 16:51:33 GMT</pubDate><content:encoded><![CDATA[<p>Revisar dentro del directorio <strong>/u01/app/oraInventory/locks</strong> si hay archivos. En mi caso existía el siguiente archivo:</p>
<pre><code class="lang-bash">-rw-rw----. 1 oracle oinstall 0 Aug 14  2017 inventory.lock
</code></pre>
<p>Eliminarlo y luego reintentar la operación.</p>
<p><strong>Fuente:</strong> <a target="_blank" href="https://jasonbrownsite.wordpress.com/2016/11/30/patching-issues-oracle-cpu-oct-2016-grid-patch-oui-10022-orainventory-is-in-an-invalid-state/">https://jasonbrownsite.wordpress.com/2016/11/30/patching-issues-oracle-cpu-oct-2016-grid-patch-oui-10022-orainventory-is-in-an-invalid-state/</a></p>
<p>Hasta el próximo post.</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo activar el VARCHAR2 EXTENDIDO]]></title><description><![CDATA[El parámetro max_string_size se debe habilitar a nivel PDB, evitar hacerlo a nivel CDB.
alter session set container=<nombre_pdb>;

show parameter MAX_STRING_SIZE
alter system set MAX_STRING_SIZE=EXTENDED scope=spfile sid='*';

alter pluggable databas...]]></description><link>https://dbadetrinchera.com/como-activar-el-varchar2-extendido</link><guid isPermaLink="true">https://dbadetrinchera.com/como-activar-el-varchar2-extendido</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Fri, 14 Feb 2025 13:00:09 GMT</pubDate><content:encoded><![CDATA[<p>El parámetro <strong>max_string_size</strong> se debe habilitar a nivel PDB, evitar hacerlo a nivel CDB.</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>=&lt;nombre_pdb&gt;;

<span class="hljs-keyword">show</span> parameter MAX_STRING_SIZE
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">system</span> <span class="hljs-keyword">set</span> MAX_STRING_SIZE=<span class="hljs-keyword">EXTENDED</span> <span class="hljs-keyword">scope</span>=<span class="hljs-keyword">spfile</span> <span class="hljs-keyword">sid</span>=<span class="hljs-string">'*'</span>;

<span class="hljs-keyword">alter</span> <span class="hljs-keyword">pluggable</span> <span class="hljs-keyword">database</span> &lt;nombre_pdb&gt; <span class="hljs-keyword">close</span> <span class="hljs-keyword">immediate</span> instances=<span class="hljs-keyword">all</span>;
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">pluggable</span> <span class="hljs-keyword">database</span> &lt;nombre_pdb&gt; <span class="hljs-keyword">open</span> <span class="hljs-keyword">upgrade</span>;

<span class="hljs-keyword">show</span> parameter MAX_STRING_SIZE
@?/rdbms/<span class="hljs-keyword">admin</span>/utl32k.sql
</code></pre>
<p><strong>¡ATENCION!</strong> - Si la ejecución del script <strong>utl32k.sql</strong> devuelve los errores <strong>ORA-38301</strong> y <strong>ORA-01722</strong>, se deberá purgar la papelera de reciclaje completa con el siguiente comando:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">PURGE</span> DBA_RECYCLEBIN;
</code></pre>
<p>Luego de la aclaración, continuamos con los siguientes pasos:</p>
<pre><code class="lang-sql">shutdown immediate
startup
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">pluggable</span> <span class="hljs-keyword">database</span> &lt;nombre_pdb&gt; <span class="hljs-keyword">close</span> <span class="hljs-keyword">immediate</span> instances=<span class="hljs-keyword">all</span>;
<span class="hljs-keyword">alter</span> <span class="hljs-keyword">pluggable</span> <span class="hljs-keyword">database</span> &lt;nombre_pdb&gt; <span class="hljs-keyword">open</span> instances=<span class="hljs-keyword">all</span>;
exit
</code></pre>
<p>En caso de que tu PDB tenga más servicios, además del que viene por omisión, los deberías levantar:</p>
<pre><code class="lang-sql">srvctl status service -d &lt;nombre_cdb&gt;
srvctl <span class="hljs-keyword">start</span> service -d &lt;nombre_cdb&gt; -s &lt;nombre_servicio&gt;
srvctl <span class="hljs-keyword">status</span> service -d &lt;nombre_cdb&gt;
</code></pre>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo comprimir índices y... que sea sustentable en el tiempo]]></title><description><![CDATA[El parámetro DB_INDEX_COMPRESSION_INHERITANCE con sus posibles valores (TABLESPACE | TABLE | ALL | NONE) indica si el índice debe heredar la compresión del tablespace, de la tabla o de ningún lugar. Por omisión el valor es NONE, por ende no hereda lo...]]></description><link>https://dbadetrinchera.com/como-comprimir-indices-y-que-sea-sustentable-en-el-tiempo</link><guid isPermaLink="true">https://dbadetrinchera.com/como-comprimir-indices-y-que-sea-sustentable-en-el-tiempo</guid><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Fri, 07 Feb 2025 13:00:17 GMT</pubDate><content:encoded><![CDATA[<p>El parámetro <strong>DB_INDEX_COMPRESSION_INHERITANCE</strong> con sus posibles valores <strong>(TABLESPACE | TABLE | ALL | NONE)</strong> indica si el índice debe heredar la compresión del tablespace, de la tabla o de ningún lugar. Por omisión el valor es <strong>NONE</strong>, por ende no hereda los atributos de compresión.</p>
<p>Para definir la compresión a nivel tablespace, se debe ejecutar lo siguiente:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLESPACE</span> &lt;tablespace_name&gt; <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">INDEX</span> <span class="hljs-keyword">COMPRESS</span> <span class="hljs-keyword">ADVANCED</span> <span class="hljs-keyword">HIGH</span>;
</code></pre>
<p>Esto provocará que todos los índices que se creen a futuro tendrán la compresión del tipo ADVANCED HIGH.</p>
<p>Para comprimir un índice en el momento, se debe ejecutar lo siguiente:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">INDEX</span> &lt;owner&gt;.&lt;index_name&gt; <span class="hljs-keyword">REBUILD</span> <span class="hljs-keyword">COMPRESS</span> <span class="hljs-keyword">ADVANCED</span> <span class="hljs-keyword">HIGH</span> <span class="hljs-keyword">ONLINE</span>;
</code></pre>
<p>Esto hará que el índice en cuestión se re-cree comprimido de manera online, es decir, no provocará un bloqueo.</p>
<p>Si querés comprimir todos los índices de tu base, te dejo un script que te será de utilidad:</p>
<p>Este script relevará todos los índices no particionados:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-string">'ALTER INDEX '</span>||OWNER||<span class="hljs-string">'.'</span>||INDEX_NAME||<span class="hljs-string">' REBUILD COMPRESS ADVANCED HIGH ONLINE;'</span> 
<span class="hljs-keyword">FROM</span> DBA_INDEXES 
<span class="hljs-keyword">WHERE</span> OWNER <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'USR_%'</span>
<span class="hljs-keyword">AND</span> PARTITIONED=<span class="hljs-string">'NO'</span>
<span class="hljs-keyword">AND</span> COMPRESSION = <span class="hljs-string">'DISABLED'</span>
<span class="hljs-keyword">AND</span> INDEX_NAME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'SYS%'</span>
<span class="hljs-keyword">AND</span> INDEX_NAME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'BIN$%'</span>
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> OWNER;
</code></pre>
<p>Y este relevará todos los índices particionados:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-string">'ALTER INDEX '</span>||INDEX_OWNER||<span class="hljs-string">'.'</span>||INDEX_NAME||<span class="hljs-string">' REBUILD PARTITION '</span>||PARTITION_NAME||<span class="hljs-string">' COMPRESS ADVANCED HIGH ONLINE;'</span> 
<span class="hljs-keyword">FROM</span> DBA_IND_PARTITIONS 
<span class="hljs-keyword">WHERE</span> INDEX_OWNER <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'USR_%'</span>
<span class="hljs-keyword">AND</span> COMPRESSION = <span class="hljs-string">'DISABLED'</span>
<span class="hljs-keyword">AND</span> INDEX_NAME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'SYS_%'</span>
<span class="hljs-keyword">AND</span> INDEX_NAME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">LIKE</span> <span class="hljs-string">'BIN$%'</span>
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> INDEX_OWNER;
</code></pre>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Como migrar una base on-premise a AWS (RDS oracle) mediante un export/import]]></title><description><![CDATA[Realizar un export de la base on-premise.

El o los archivos resultantes (dmp) subirlos al storage S3 de amazon. Esto se puede realizar desde la consola de AWS.

Transferir el o los archivos dmps hacia el servidor de base de datos utilizando el proce...]]></description><link>https://dbadetrinchera.com/como-migrar-una-base-on-premise-a-aws-rds-oracle-mediante-un-exportimport</link><guid isPermaLink="true">https://dbadetrinchera.com/como-migrar-una-base-on-premise-a-aws-rds-oracle-mediante-un-exportimport</guid><category><![CDATA[migracion]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[AWS]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Wed, 05 Feb 2025 18:45:12 GMT</pubDate><content:encoded><![CDATA[<ol>
<li><p>Realizar un export de la base on-premise.</p>
</li>
<li><p>El o los archivos resultantes (dmp) subirlos al storage S3 de amazon. Esto se puede realizar desde la consola de AWS.</p>
</li>
<li><p>Transferir el o los archivos dmps hacia el servidor de base de datos utilizando el procedimiento <strong>download_from_s3</strong>, que devolverá un <strong>ID</strong>.</p>
</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> rdsadmin.rdsadmin_s3_tasks.download_from_s3(
    p_bucket_name =&gt; <span class="hljs-string">'&lt;nombre_bucket&gt;'</span>,
    p_directory_name =&gt; <span class="hljs-string">'DATA_PUMP_DIR'</span>) 
<span class="hljs-keyword">AS</span> TASK_ID <span class="hljs-keyword">FROM</span> DUAL;
</code></pre>
<ol start="4">
<li>Con el <strong>ID</strong> del punto anterior, verificar que la tarea haya terminado bien con la siguiente consulta</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-built_in">text</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">table</span>(rdsadmin.rds_file_util.read_text_file(<span class="hljs-string">'BDUMP'</span>,<span class="hljs-string">'dbtask-&lt;ID&gt;.log'</span>));
</code></pre>
<ol start="5">
<li>Realizar la importación de los esquemas deseados</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">DECLARE</span> v_hdnl <span class="hljs-built_in">NUMBER</span>; 

<span class="hljs-keyword">BEGIN</span> 
v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation =&gt; <span class="hljs-string">'IMPORT'</span>,
    job_mode =&gt; <span class="hljs-string">'SCHEMA'</span>,
    job_name =&gt; <span class="hljs-string">'&lt;nombre_job&gt;'</span>); 
DBMS_DATAPUMP.ADD_FILE(
    handle =&gt; v_hdnl,
    filename =&gt; '&lt;dumpfile&gt;.dmp', 
    directory =&gt; 'DATA_PUMP_DIR',
    filetype =&gt; dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE(
    handle =&gt; v_hdnl,
    filename =&gt; '&lt;nombre_archivo_log&gt;.log',
    directory =&gt; 'DATA_PUMP_DIR',
    filetype =&gt; dbms_datapump.ku$_file_type_log_file); 
DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','LIKE ''VT%'''); 
DBMS_DATAPUMP.START_JOB(v_hdnl); 
<span class="hljs-keyword">END</span>;
/
</code></pre>
<ol start="6">
<li>Verificar el log del import ejecutando la siguiente consulta</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-built_in">text</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">table</span>(rdsadmin.rds_file_util.read_text_file(<span class="hljs-string">'DATA_PUMP_DIR'</span>,<span class="hljs-string">'&lt;nombre_archivo_log&gt;.log'</span>));
</code></pre>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Dynamic Scaling - Agregar y quitar cpus según la carga que tengan los servidores]]></title><description><![CDATA[¿Cómo funciona el Dynamic Scaling?
Este componente puede ser ejecutado como daemon en uno o más nodos del VM Cluster (a mi me parece mejor tenerlo en todos los nodos) del Exadata (en la nube o cloud at customer). Lo que hace es monitorear cada cierto...]]></description><link>https://dbadetrinchera.com/dynamic-scaling-agregar-y-quitar-cpus-segun-la-carga-que-tengan-los-servidores</link><guid isPermaLink="true">https://dbadetrinchera.com/dynamic-scaling-agregar-y-quitar-cpus-segun-la-carga-que-tengan-los-servidores</guid><category><![CDATA[Oracle]]></category><category><![CDATA[dynamicscaling]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Wed, 02 Oct 2024 12:50:53 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-como-funciona-el-dynamic-scaling">¿Cómo funciona el Dynamic Scaling?</h3>
<p>Este componente puede ser ejecutado como daemon en uno o más nodos del VM Cluster (a mi me parece mejor tenerlo en todos los nodos) del Exadata (en la nube o cloud at customer). Lo que hace es monitorear cada cierto tiempo el uso de la cpu y si la carga de la cpu supera un umbral determinado durante un periodo de tiempo, este componente automáticamente incrementará la cantidad de cpu del VM Cluster y lo hará respetando una cantidad máxima definida por vos.</p>
<p>Luego si la carga de la cpu disminuye por sobre un umbral determinado durante un periodo de tiempo, este componente reducirá automáticamente la cantidad de cpu del VM Cluster y lo hará hasta una cantidad mínima definida por vos.</p>
<p>Incluso, si tenés un ACFS configurado, el Dynamic Scaling tendrá en consideración la carga de todos los nodos del cluster y realizará el aumento o disminución de cpu en base a la carga del cluster completo.</p>
<h3 id="heading-cuales-son-los-requerimientos-para-que-funcione">¿Cuáles son los requerimientos para que funcione?</h3>
<ul>
<li><p>OCI-client o REST-API (Yo uso REST-API porque me parece más sencillo): Para usar la REST-API necesitas descargar desde OCI una API KEY y un API KEY FINGERPRINT. Esto te lo explico en este post: <a target="_blank" href="https://hashnode.com/post/cm1rv234a000c09lb9dy47pxs">¿Cómo obtener la API KEY de un usuario en OCI?</a></p>
</li>
<li><p>Los servidores deben tener acceso a internet para poder interactuar con la API. El acceso puede ser a través de un proxy que tenga tu empresa.</p>
</li>
</ul>
<h3 id="heading-como-instalar-esta-funcionalidad">¿Cómo instalar esta funcionalidad?</h3>
<ol>
<li><p>Descargar el archivo .zip correspondiente a tu sistema operativo de la nota 2719916.1</p>
</li>
<li><p>Transferir el archivo .zip a todos los servidores del VM Cluster en el directorio /tmp</p>
</li>
<li><p>Descomprimir el archivo .zip</p>
</li>
<li><p>Instalar el archivo rpm:</p>
<pre><code class="lang-bash"> rpm -ivh /tmp/dynamicscaling-2.0.2-5.el7.x86_64.rpm
</code></pre>
</li>
<li><p>Crear un directorio compartido bajo el ACFS:</p>
<pre><code class="lang-bash"> mkdir /acfs01/.dynamicscaling
 chown opc.opc /acfs01/.dynamicscaling
</code></pre>
</li>
<li><p>Crear el directorio oculto .oci dentro del home del usuario opc, donde estarán los archivos de configuración:</p>
<pre><code class="lang-bash"> mkdir /home/opc/.oci
</code></pre>
</li>
<li><p>Conectarse a OCI y descargar la API KEY del usuario y el archivo config. Esta tarea la explico paso a paso en este post: <a target="_blank" href="https://hashnode.com/post/cm1rv234a000c09lb9dy47pxs">¿Cómo obtener la API KEY de un usuario en OCI?</a></p>
</li>
<li><p>Copiar la API KEY al directorio <strong><em>/home/opc/.oci</em></strong> y ejecutar lo siguiente:</p>
<pre><code class="lang-bash"> chmod go-rwx &lt;nombre_key&gt;.pem
</code></pre>
</li>
<li><p>En el directorio <strong><em>/home/opc/.oci</em></strong> crear el archivo config con las lineas obtenidas en el punto 7 y en el parámetro <strong><em>key_file</em></strong> asignarle el directorio <strong><em>/home/opc/.oci</em></strong></p>
</li>
</ol>
<h3 id="heading-factores-de-incremento-clasico-vs-incremental">Factores de incremento - Clásico vs Incremental</h3>
<p>Esto se refiere a la velocidad con la cual el Dynamic Scaling aumentará la cantidad de cpus de tu VM Cluster.</p>
<p>Con el factor clásico (es el default) uno le define un valor y todas las veces que el Dynamic Scaling aumente la cantidad de cpus, lo hará con ese valor. Por ejemplo, si el valor es 4, se sumarán 4 cpus cada vez que se necesite aumentar la cantidad.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td>Valor del Factor Clásico</td><td>Cantidad de OCPUs a agregar</td></tr>
</thead>
<tbody>
<tr>
<td>Primera vez</td><td>8</td><td>8</td></tr>
<tr>
<td>Segunda vez</td><td>8</td><td>8</td></tr>
<tr>
<td>Tercera vez</td><td>8</td><td>8</td></tr>
</tbody>
</table>
</div><p>Con el factor incremental, uno le define un valor y cuando el Dynamic Scaling deba aumentar la cantidad de cpus, la primera vez lo hará con ese valor, pero la segunda vez, lo hará con el doble de ese valor, la tercera vez, lo hará con el triple de ese valor y así sucesivamente.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td>Valor del Factor Incremental</td><td>Cantidad de OCPUs a agregar</td></tr>
</thead>
<tbody>
<tr>
<td>Primera vez</td><td>8</td><td>8</td></tr>
<tr>
<td>Segunda vez</td><td>8</td><td>16</td></tr>
<tr>
<td>Tercera vez</td><td>8</td><td>24</td></tr>
</tbody>
</table>
</div><p>Es resumen, si tu VM Cluster de repente tiene mucha carga, el Factor Incremental llegará más rápido al máximo de cpu definido por vos. Pero cuidado, porque cuanto más cpu se agregue, mayor será el costo que deba pagar tu empresa. A usarlo con responsabilidad 😉.</p>
<h3 id="heading-como-registrarla-como-servicio-de-sistema-operativo-para-que-inicie-automaticamente-luego-de-un-reinicio">¿Cómo registrarla como servicio de sistema operativo para que inicie automáticamente luego de un reinicio?</h3>
<p>Sencillo, se debe crear el archivo <strong><em>/etc/systemd/system/dynamicscaling.service</em></strong> con este contenido, adaptando los valores entre &lt;&gt; a tu entorno:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment"># Oracle dynamicscaling.service</span>
[Unit]
Description=Dynamicscaling - Scale-up and Scale-down automation utility <span class="hljs-keyword">for</span> OCI DB System
Wants=network-online.target local-fs.target
After=network-online.target local-fs.target

[Service]
User=opc
Type=simple
Environment=<span class="hljs-string">"HTTPS_PROXY=https://&lt;IP&gt;:&lt;puerto&gt;"</span>
Environment=<span class="hljs-string">"https_proxy=https://&lt;IP&gt;:&lt;puerto&gt;"</span>
Environment=<span class="hljs-string">"PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/dynamicscaling"</span>
ExecStart=/bin/sh -c <span class="hljs-string">"/opt/dynamicscaling/dynamicscaling.bin --vm-cluster-id &lt;ocid_vm_cluster&gt; --ociregion &lt;nombre_region&gt; --tenancy-id &lt;ocid_tenant&gt; --user-id &lt;ocid_usuario&gt; --keyfingerprint &lt;key_fingerprint&gt; --privatekey /home/opc/.oci/&lt;nombre_key&gt;.pem --proxyhost &lt;ip&gt; --proxyport &lt;puerto&gt; --maxocpu 10 --minocpu 2 --ocpu 2 --acfs /acfs01/.dynamicscaling --mailx &lt;dirección_mail&gt; --subject &lt;palabra de referencia&gt; --sopnum 3"</span>

TimeoutStartSec=300
PIDFile=/tmp/.dynamicscaling.pid
Restart=on-failure
RestartSec=5s
ExecStop=/bin/<span class="hljs-built_in">kill</span> -s SIGINT <span class="hljs-variable">$MAINPID</span>

[Install]
WantedBy=multi-user.target
</code></pre>
<p>Luego ejecutar como root estos comandos:</p>
<pre><code class="lang-bash">systemctl daemon-reload
systemctl <span class="hljs-built_in">enable</span> dynamicscaling.service
systemctl start dynamicscaling.service
systemctl status dynamicscaling.service
</code></pre>
<p>¡¡¡Y listo!!!!</p>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[¿Como obtener la API KEY de un usuario en OCI?]]></title><description><![CDATA[Ingresar a OCI con tu usuario

Dirigirse a la sección My Profile


 En el menú de la izquierda hacer clic en API KEYS y luego en Add API key


 Luego hacer clic en el botón Download private key y en el botón Add


 Esto descargará la API key del usua...]]></description><link>https://dbadetrinchera.com/como-obtener-la-api-key-de-un-usuario-en-oci</link><guid isPermaLink="true">https://dbadetrinchera.com/como-obtener-la-api-key-de-un-usuario-en-oci</guid><category><![CDATA[Oracle]]></category><category><![CDATA[OCI]]></category><category><![CDATA[apikey]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Wed, 02 Oct 2024 12:45:44 GMT</pubDate><content:encoded><![CDATA[<ol>
<li><p>Ingresar a OCI con tu usuario</p>
</li>
<li><p>Dirigirse a la sección <strong>My Profile</strong></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727872681801/b30f0566-368f-4080-8978-8a8166db23ba.png" alt class="image--center mx-auto" /></p>
<p> En el menú de la izquierda hacer clic en <strong>API KEYS</strong> y luego en <strong>Add API key</strong></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727872854431/988e2496-7add-4973-8bdc-fe98634f44b9.png" alt class="image--center mx-auto" /></p>
<p> Luego hacer clic en el botón <strong>Download private key</strong> y en el botón <strong>Add</strong></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727872955130/9bad40f9-5974-44fe-8bb3-145e9a8c4899.png" alt class="image--center mx-auto" /></p>
<p> Esto descargará la API key del usuario y generará las líneas necesarias para el archivo config que necesita la aplicaciónDynamic Scaling.</p>
</li>
</ol>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[FLASHBACK QUERY - Consultar como estaba una tabla en el pasado]]></title><description><![CDATA[Se puede usar para comparar las filas que una tabla tiene hoy con las que tenía ayer por ejemplo.
Vayamos a la práctica:
Supongamos que sabemos que se han borrado filas hace menos de una hora, entonces hacemos lo siguiente:
SELECT * FROM owner.tabla_...]]></description><link>https://dbadetrinchera.com/flashback-query-consultar-como-estaba-una-tabla-en-el-pasado</link><guid isPermaLink="true">https://dbadetrinchera.com/flashback-query-consultar-como-estaba-una-tabla-en-el-pasado</guid><category><![CDATA[Oracle]]></category><category><![CDATA[flashback]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Fri, 20 Sep 2024 12:22:03 GMT</pubDate><content:encoded><![CDATA[<p>Se puede usar para comparar las filas que una tabla tiene hoy con las que tenía ayer por ejemplo.</p>
<h3 id="heading-vayamos-a-la-practica"><strong>Vayamos a la práctica:</strong></h3>
<p>Supongamos que sabemos que se han borrado filas hace menos de una hora, entonces hacemos lo siguiente:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> owner.tabla_ejemplo <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">'60'</span> <span class="hljs-keyword">MINUTE</span>;
</code></pre>
<p>Dicha consulta nos traerá todas las filas que tenía la tabla_ejemplo hace una hora.</p>
<p>También podríamos crear una tabla_soporte que contenga todos los registros de la tabla_ejemplo hace una hora de la siguiente manera:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> owner.tabla_soporte <span class="hljs-keyword">AS</span>
       <span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> owner.tabla_ejemplo <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">'60'</span> <span class="hljs-keyword">MINUTE</span>;
</code></pre>
<p>Una desventaja de este último ejemplo es que no se crearán ni los índices ni las constraints de la tabla original.</p>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[Flashback Drop]]></title><description><![CDATA[Si tu base de datos Oracle tiene activada la papelera de reciclaje, recuperar una tabla borrada por accidente es muy fácil. Pero… ¿Qué pasa si alguien volvió a crear dicha tabla con el mismo nombre?
Vamos por parte, si se eliminó una tabla se puede r...]]></description><link>https://dbadetrinchera.com/flashback-drop</link><guid isPermaLink="true">https://dbadetrinchera.com/flashback-drop</guid><category><![CDATA[Oracle]]></category><category><![CDATA[flashback]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Fri, 20 Sep 2024 12:07:08 GMT</pubDate><content:encoded><![CDATA[<p>Si tu base de datos Oracle tiene activada la papelera de reciclaje, recuperar una tabla borrada por accidente es muy fácil. Pero… ¿Qué pasa si alguien volvió a crear dicha tabla con el mismo nombre?</p>
<p>Vamos por parte, si se eliminó una tabla se puede recuperar con este comando:</p>
<pre><code class="lang-sql">FLASHBACK TABLE &lt;nombre_tabla&gt; TO BEFORE <span class="hljs-keyword">DROP</span>;
</code></pre>
<p>Si luego de haberse eliminado una tabla, alguien ya creó otra tabla con el mismo nombre, podés recuperar la tabla original con un nombre distinto con este comando:</p>
<pre><code class="lang-sql">FLASHBACK TABLE &lt;recyclebin_name&gt; TO BEFORE <span class="hljs-keyword">DROP</span> <span class="hljs-keyword">RENAME</span> <span class="hljs-keyword">TO</span> &lt;nombre_nuevo&gt;;
</code></pre>
<p>Y para obtener el recyclebin_name puedes consultar la vista DBA_RECYCLEBIN.  </p>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item><item><title><![CDATA[FLASHBACK QUERY - ¿Cómo recuperar datos sin esfuerzo en una base Oracle?]]></title><description><![CDATA[Con el Flashback Query se puede extraer el estado de una tabla en un cierto instante temporal anterior. Se puede usar, por ejemplo, para comparar las filas que una tabla tiene hoy con las que tenía ayer.
Si sos DBA, imaginate que una persona hizo un ...]]></description><link>https://dbadetrinchera.com/flashback-query-como-recuperar-datos-sin-esfuerzo-en-una-base-oracle</link><guid isPermaLink="true">https://dbadetrinchera.com/flashback-query-como-recuperar-datos-sin-esfuerzo-en-una-base-oracle</guid><category><![CDATA[flashback]]></category><category><![CDATA[Oracle]]></category><dc:creator><![CDATA[Facundo Ezequiel Grande]]></dc:creator><pubDate>Wed, 11 Sep 2024 22:47:00 GMT</pubDate><content:encoded><![CDATA[<p>Con el Flashback Query se puede extraer el estado de una tabla en un cierto instante temporal anterior. Se puede usar, por ejemplo, para comparar las filas que una tabla tiene hoy con las que tenía ayer.</p>
<p>Si sos DBA, imaginate que una persona hizo un DELETE sin un filtro por equivocación, si esa persona te avisa rápido, vos serías capaz de recuperar los datos de una manera sencilla y rápida.</p>
<p>Para funcionar, esta característica sólo utiliza el tablespace de UNDO.</p>
<h3 id="heading-vayamos-a-la-practica"><strong>Vayamos a la práctica</strong></h3>
<p>Supongamos que sabemos que se han borrado filas hace menos de una hora, entonces hacemos lo siguiente:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> owner.tabla_ejemplo <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">'60'</span> <span class="hljs-keyword">MINUTE</span>;
</code></pre>
<p>Dicha consulta nos traerá todas las filas que tenía la <strong>tabla_ejemplo</strong> hace una hora.</p>
<p>También podríamos crear una <strong>tabla_soporte</strong> que contenga todos los registros de la <strong>tabla_ejemplo</strong> hace una hora de la siguiente manera:</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> owner.tabla_soporte <span class="hljs-keyword">AS</span>
       <span class="hljs-keyword">SELECT</span> * <span class="hljs-keyword">FROM</span> owner.tabla_ejemplo <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">'60'</span> <span class="hljs-keyword">MINUTE</span>;
</code></pre>
<p>Una desventaja de este último ejemplo es que no se crearán ni los índices, ni las constraints de la tabla original.</p>
<p>Hasta el próximo post 🙂</p>
<p>Saludos desde Buenos Aires, Argentina.</p>
]]></content:encoded></item></channel></rss>