{"id":6814,"date":"2026-04-25T12:13:38","date_gmt":"2026-04-25T10:13:38","guid":{"rendered":"https:\/\/rootfan.com\/?p=6814"},"modified":"2026-04-25T17:20:39","modified_gmt":"2026-04-25T15:20:39","slug":"instalar-ora2pg-en-ubuntu","status":"publish","type":"post","link":"https:\/\/rootfan.com\/es\/ora2pg-install-ubuntu\/","title":{"rendered":"C\u00f3mo instalar ora2pg en Ubuntu y ejecutar un informe de evaluaci\u00f3n de migraci\u00f3n"},"content":{"rendered":"<p><strong>En resumen<\/strong> La instalaci\u00f3n de ora2pg en Ubuntu 24.04 requiere tres componentes: Oracle Instant Client 19c (para las bibliotecas de conexi\u00f3n de Oracle), el m\u00f3dulo Perl DBD::Oracle (que se vincula a esas bibliotecas) y ora2pg en s\u00ed (instalado desde el c\u00f3digo fuente; no est\u00e1 en CPAN). Una vez instalado, un solo comando se conecta a su base de datos Oracle, escanea cada objeto en el esquema y produce un informe HTML con una puntuaci\u00f3n de complejidad y una estimaci\u00f3n de esfuerzo en d\u00edas-persona. Esta publicaci\u00f3n cubre la instalaci\u00f3n completa y el comando de informe.<\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>La forma m\u00e1s r\u00e1pida de saber si una migraci\u00f3n de Oracle a PostgreSQL es un trabajo de una semana o un proyecto de tres meses es ejecutar el informe de migraci\u00f3n ora2pg antes de abrir una hoja de c\u00e1lculo. <\/p>\n\n\n\n<p>El informe se conecta a Oracle, cuenta cada objeto por tipo, califica el esquema de A (sencillo) a C (complejo) y produce una estimaci\u00f3n de esfuerzo en d\u00edas-hombre. <\/p>\n\n\n\n<p>Lleva unos veinte minutos instalar y sesenta segundos ejecutar.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>\u00cdndice<\/h2><nav><ul><li><a href=\"#what-the-migration-report-produces\">\u00bfQu\u00e9 produce el Informe de Migraci\u00f3n<\/a><\/li><li><a href=\"#prerequisites\">Requisitos previos<\/a><\/li><li><a href=\"#step-1-install-oracle-instant-client-on-ubuntu-24-04\">Paso 1: Instalar Oracle Instant Client en Ubuntu 24.04<\/a><\/li><li><a href=\"#step-2-install-dbd-oracle-and-ora-2-pg\">Paso 2: Instalar DBD::Oracle y ora2pg<\/a><\/li><li><a href=\"#step-3-configure-the-connection\">Paso 3: Configurar la conexi\u00f3n<\/a><\/li><li><a href=\"#step-4-run-the-migration-assessment-report\">Paso 4: Ejecutar el Informe de Evaluaci\u00f3n de Migraci\u00f3n<\/a><\/li><li><a href=\"#step-5-read-the-report-output\">Paso 5: Leer la salida del informe<\/a><\/li><li><a href=\"#step-6-adjust-the-effort-estimate\">Paso 6: Ajustar la Estimaci\u00f3n de Esfuerzo<\/a><\/li><li><a href=\"#frequently-asked-questions\">Preguntas frecuentes<\/a><\/li><li><a href=\"#in-summary\">En resumen<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-the-migration-report-produces\">\u00bfQu\u00e9 produce el Informe de Migraci\u00f3n<\/h2>\n\n\n\n<p>El comando ora2pg SHOW_REPORT se conecta a tu base de datos Oracle, escanea cada objeto en el esquema y produce una tabla con cinco columnas: tipo de objeto, cantidad de objetos, cantidad de objetos inv\u00e1lidos, costo estimado de migraci\u00f3n en unidades y comentarios sobre lo que ora2pg har\u00e1 con cada tipo. <\/p>\n\n\n\n<p>La \u00faltima l\u00ednea da un costo total y una estimaci\u00f3n de esfuerzo legible por humanos: \u201c22.40 unidades de costo de migraci\u00f3n significan aproximadamente 1 d\u00eda(s) de persona. <\/p>\n\n\n\n<p>La unidad de migraci\u00f3n se estableci\u00f3 en 5 minuto(s).\u201d<\/p>\n\n\n\n<p>La puntuaci\u00f3n consta de dos partes: una letra y un n\u00famero.<\/p>\n\n\n\n<p>La carta refleja una complejidad general:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A<\/strong> \u2014 migraci\u00f3n que puede ser automatizada en gran medida<\/li>\n\n\n\n<li><strong>B<\/strong> \u2014 migraci\u00f3n con reescritura de c\u00f3digo; coste estimado hasta 10 d\u00edas-persona<\/li>\n\n\n\n<li><strong>C<\/strong> \u2014 migraci\u00f3n con reescritura de c\u00f3digo; costo estimado superior a 10 d\u00edas-persona<\/li>\n<\/ul>\n\n\n\n<p>El n\u00famero refleja la dificultad t\u00e9cnica:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>1<\/strong> \u2014 sin funciones almacenadas, sin disparadores<\/li>\n\n\n\n<li><strong>2<\/strong> \u2014 desencadenantes presentes, no se requiere reescritura manual<\/li>\n\n\n\n<li><strong>3<\/strong> \u2014 funciones almacenadas y\/o disparadores, no se requiere reescritura manual<\/li>\n\n\n\n<li><strong>4<\/strong> \u2014 desencadenadores o vistas que requieren reescritura de c\u00f3digo<\/li>\n\n\n\n<li><strong>5<\/strong> \u2014 funciones y\/o disparadores almacenados que requieren reescritura de c\u00f3digo<\/li>\n<\/ul>\n\n\n\n<p>Un esquema sin c\u00f3digo almacenado punt\u00faa A-1. Un esquema con paquetes PL\/SQL, disparadores y vistas espec\u00edficas de Oracle generalmente punt\u00faa B-4 o B-5. <\/p>\n\n\n\n<p>El nivel C se activa cuando el esfuerzo estimado supera las 10 personas-d\u00eda (ajustable con <code>--l\u00edmite_d\u00edas_humanos<\/code>).<\/p>\n\n\n\n<p>Ejecuta el informe antes de comprometerte con un cronograma. <\/p>\n\n\n\n<p>El n\u00famero que produce es el \u00fanico n\u00famero que vale la pena conocer antes de que comience el proyecto.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prerequisites\">Requisitos previos<\/h2>\n\n\n\n<p>Se requieren tres cosas, en orden de dependencia:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Oracle Instant Client 19c<\/strong> \u2014 las bibliotecas C (<code>libclntsh.so<\/code> (y relacionados) contra los que el controlador Perl se enlaza en tiempo de compilaci\u00f3n y carga en tiempo de ejecuci\u00f3n. Sin ellos, no es posible ninguna conexi\u00f3n con Oracle, independientemente del acceso a la red.<\/li>\n\n\n\n<li><strong>DBD::Oracle<\/strong> \u2014 el m\u00f3dulo de Perl que proporciona el controlador Oracle. Se compila contra las cabeceras de Instant Client durante la instalaci\u00f3n \u2014 se requiere el paquete de desarrollo (devel), no solo el tiempo de ejecuci\u00f3n b\u00e1sico.<\/li>\n\n\n\n<li><strong>ora2pg 25.0<\/strong> \u2014 instalado desde el c\u00f3digo fuente a trav\u00e9s de su archivo tar de lanzamiento de GitHub. ora2pg no est\u00e1 disponible en CPAN; <code>cpanm ora2pg<\/code> fallar\u00e1.<\/li>\n<\/ol>\n\n\n\n<p>Tambi\u00e9n necesita acceso de red desde la m\u00e1quina Ubuntu a la base de datos Oracle en el puerto 1521 y un usuario de base de datos con privilegios suficientes para escanear el esquema (detalles en las preguntas frecuentes a continuaci\u00f3n).<\/p>\n\n\n\n<p>Si tu servidor Oracle no est\u00e1 en DNS, agr\u00e9galo a <code>\/etc\/hosts<\/code> en la m\u00e1quina Ubuntu antes de continuar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo vi \/etc\/hosts\n# Add: 192.168.x.x   your-oracle-host.localdomain   your-oracle-host\n<\/pre><\/div>\n\n\n<p>Verificar la resoluci\u00f3n de nombres antes de continuar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nping -c 2 your-oracle-host.localdomain\n<\/pre><\/div>\n\n\n<p>Si el ping falla, las pruebas de conectividad en el Paso 3 tambi\u00e9n fallar\u00e1n; arregla DNS o <code>\/etc\/hosts<\/code> primero.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-1-install-oracle-instant-client-on-ubuntu-24-04\">Paso 1: Instalar Oracle Instant Client en Ubuntu 24.04<\/h2>\n\n\n\n<p>Oracle distribuye Instant Client solo como paquetes RPM. <\/p>\n\n\n\n<p>Ubuntu utiliza paquetes DEB. <\/p>\n\n\n\n<p>En <code>extraterrestre<\/code> La herramienta convierte RPM a DEB. Maneja la traducci\u00f3n de metadatos del paquete para que los archivos aterricen en las rutas correctas y el administrado de paquetes rastree la instalaci\u00f3n.<\/p>\n\n\n\n<p>Descarga tres paquetes de <a href=\"https:\/\/www.oracle.com\/database\/technologies\/instant-client\/linux-x86-64-downloads.html\" rel=\"nofollow noopener\" target=\"_blank\">Descargas de Oracle Instant Client<\/a> p\u00e1gina \u2014 use los RPM gen\u00e9ricos de Linux x86-64 para la versi\u00f3n 19.30, no las variantes OL8 u OL9 (esas est\u00e1n compiladas para sistemas de la familia Red Hat y tienen dependencias diferentes):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>oracle-instantclient19.30-basic-*.rpm<\/code> \u2014 las bibliotecas compartidas en tiempo de ejecuci\u00f3n completas (<code>libclntsh.so<\/code>, <code>libnnz19.so<\/code>, y otros)<\/li>\n\n\n\n<li><code>oracle-instantclient19.30-devel-*.rpm<\/code> \u2014 archivos de cabecera y <code>sdk\/<\/code> directorio necesario para compilar DBD::Oracle<\/li>\n\n\n\n<li><code>oracle-instantclient19.30-sqlplus-*.rpm<\/code> el <code>sqlplus64<\/code> binario para probar la conectividad de Oracle independientemente de ora2pg<\/li>\n<\/ul>\n\n\n\n<p>Transfiere los tres RPM a tu m\u00e1quina Ubuntu, luego ejecuta:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# libaio1t64: the async I\/O library required by Oracle Instant Client at runtime\n# On Ubuntu 24.04 the package name is libaio1t64, not libaio1 -- the name changed in this release\n# alien: converts RPM packages to DEB format for installation with dpkg\nsudo apt-get install -y libaio1t64 alien\n\n# Convert each RPM to DEB and install in one step (-i: convert and install immediately)\nsudo alien -i oracle-instantclient19.30-basic-*.rpm\nsudo alien -i oracle-instantclient19.30-devel-*.rpm\nsudo alien -i oracle-instantclient19.30-sqlplus-*.rpm\n<\/pre><\/div>\n\n\n<p><strong>Soluci\u00f3n de enlace simb\u00f3lico de Ubuntu 24.04:<\/strong> Ubuntu 24.04 env\u00eda la biblioteca de E\/S as\u00edncrona como <code>libaio.so.1t64<\/code> como parte de la transici\u00f3n a time_t de 64 bits. <\/p>\n\n\n\n<p>Oracle Instant Client se compil\u00f3 en sistemas Red Hat y codifica de forma r\u00edgida <code>libaio.so.1<\/code> en su binario ELF. <\/p>\n\n\n\n<p>Sin un enlace simb\u00f3lico, <code>sqlplus64<\/code> falla inmediatamente con <code>no se puede abrir el archivo de objeto compartido: libaio.so.1<\/code>. <\/p>\n\n\n\n<p>Crea el enlace simb\u00f3lico antes de hacer la prueba:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo ln -s \/usr\/lib\/x86_64-linux-gnu\/libaio.so.1t64 \/usr\/lib\/x86_64-linux-gnu\/libaio.so.1\n<\/pre><\/div>\n\n\n<p>Establece las tres variables de entorno requeridas y pers\u00edstelas en <code>~\/.bashrc<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nexport ORACLE_HOME=\/usr\/lib\/oracle\/19.30\/client64\nexport LD_LIBRARY_PATH=$ORACLE_HOME\/lib\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\necho &#039;export ORACLE_HOME=\/usr\/lib\/oracle\/19.30\/client64&#039; &gt;&gt; ~\/.bashrc\necho &#039;export LD_LIBRARY_PATH=$ORACLE_HOME\/lib&#039; &gt;&gt; ~\/.bashrc\necho &#039;export PATH=$ORACLE_HOME\/bin:$PATH&#039; &gt;&gt; ~\/.bashrc\n<\/pre><\/div>\n\n\n<p><code>ORACLE_HOME<\/code> indica a DBD::Oracle y ora2pg d\u00f3nde est\u00e1 instalado Instant Client; ambas herramientas leen esto tanto en tiempo de compilaci\u00f3n como en tiempo de ejecuci\u00f3n. <\/p>\n\n\n\n<p><code>LD_LIBRARY_PATH<\/code> le dice al enlazador din\u00e1mico de Linux d\u00f3nde encontrar las bibliotecas compartidas de Oracle; sin esto, cualquier binario que se enlace con <code>libclntsh.so<\/code> falla con \u201cerror al cargar bibliotecas compartidas\u201d. <\/p>\n\n\n\n<p><code>RUTA<\/code> agrega el directorio bin del Instant Client para <code>sqlplus64<\/code> est\u00e1 disponible en la l\u00ednea de comandos.<\/p>\n\n\n\n<p>Verifique la instalaci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsqlplus64 -V\n# Expected: SQL*Plus: Release 19.30.0.0.0 Production\n<\/pre><\/div>\n\n\n<p>Si este comando falla con un error de biblioteca despu\u00e9s del enlace simb\u00f3lico, compruebe que <code>LD_LIBRARY_PATH<\/code> se exporta (no solo se establece) en el shell actual.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-2-install-dbd-oracle-and-ora-2-pg\">Paso 2: Instalar DBD::Oracle y ora2pg<\/h2>\n\n\n\n<p>DBD::Oracle es el controlador de base de datos de Perl para Oracle. Es una extensi\u00f3n C \u2014 se compila a partir de c\u00f3digo fuente contra las cabeceras de Instant Client durante la instalaci\u00f3n. <\/p>\n\n\n\n<p>Por eso <code>ORACLE_HOME<\/code> debe ser exportado antes de ejecutar <code>cpanm DBD::Oracle<\/code>: el script de compilaci\u00f3n lee esa variable para ubicar las cabeceras y enlazar contra las bibliotecas compartidas.<\/p>\n\n\n\n<p>Instala primero las dependencias de compilaci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# perl: the Perl runtime (may already be present on Ubuntu 24.04)\n# cpanminus: a lightweight CPAN module installer -- simpler than the full CPAN shell\n# make, gcc: required to compile DBD::Oracle from C source\nsudo apt-get install -y perl cpanminus make gcc\n<\/pre><\/div>\n\n\n<p>Luego instala DBD::Oracle <code>ORACLE_HOME<\/code> y <code>LD_LIBRARY_PATH<\/code> debe ser exportado en el shell actual antes de ejecutar esto:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo cpanm DBD::Oracle\n<\/pre><\/div>\n\n\n<p>La compilaci\u00f3n tarda entre 2 y 3 minutos. Si falla con un mensaje sobre la falta de encabezados, verifique que el paquete RPM de desarrollo estuviera instalado y que <code>ORACLE_HOME<\/code> apunta al directorio correcto.<\/p>\n\n\n\n<p>Ahora instala ora2pg desde el archivo tarball de lanzamientos de GitHub. ora2pg no est\u00e1 disponible en CPAN \u2014 <code>cpanm ora2pg<\/code> fallar\u00e1 con \u201cm\u00f3dulo no encontrado\u201d. <\/p>\n\n\n\n<p>La \u00fanica instalaci\u00f3n admitida es desde el c\u00f3digo fuente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nwget https:\/\/github.com\/darold\/ora2pg\/archive\/refs\/tags\/v25.0.tar.gz\ntar xzf v25.0.tar.gz\ncd ora2pg-25.0\n\n# Makefile.PL generates the Makefile based on the system Perl configuration\nperl Makefile.PL\n\n# make compiles and prepares the distribution\nmake\n\n# make install copies the ora2pg script and Perl modules to the system Perl paths\nsudo make install\n\ncd ..\n<\/pre><\/div>\n\n\n<p>Verificar<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nora2pg --version\n# Expected: Ora2Pg v25.0\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-3-configure-the-connection\">Paso 3: Configurar la conexi\u00f3n<\/h2>\n\n\n\n<p>ora2pg lee <code>\/etc\/ora2pg\/ora2pg.conf<\/code> por defecto. <\/p>\n\n\n\n<p>La instalaci\u00f3n crea <code>\/etc\/ora2pg\/ora2pg.conf.dist<\/code> como un archivo de referencia con muchos comentarios y cada par\u00e1metro disponible documentado. <\/p>\n\n\n\n<p>C\u00f3pialo para crear tu configuraci\u00f3n de trabajo: el archivo dist sirve como tu copia de seguridad de referencia:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo cp \/etc\/ora2pg\/ora2pg.conf.dist \/etc\/ora2pg\/ora2pg.conf\nsudo vi \/etc\/ora2pg\/ora2pg.conf\n<\/pre><\/div>\n\n\n<p>El archivo dist es largo (m\u00e1s de 1.000 l\u00edneas de comentarios y par\u00e1metros). <\/p>\n\n\n\n<p>Utilice <code>ORACLE_DSN<\/code> en vi para saltar directamente a cada par\u00e1metro \u2014 no desplaces manualmente.<\/p>\n\n\n\n<p>Establecer estos cinco par\u00e1metros:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nORACLE_DSN     dbi:Oracle:host=YOUR_ORACLE_HOST;service_name=YOUR_PDB_NAME;port=1521\nORACLE_USER    system\nORACLE_PWD     YOUR_SYSTEM_PASSWORD\nSCHEMA         YOUR_SCHEMA_NAME\nOUTPUT_DIR     \/home\/YOUR_USER\/ora2pg-output\n<\/pre><\/div>\n\n\n<p><strong><code>ORACLE_DSN<\/code>:<\/strong> Utilice <code>nombre_del_servicio<\/code>, no <code>lado<\/code>. Oracle 19c organiza las bases de datos como Bases de Datos Contenedor (CDB) con una o m\u00e1s Bases de Datos Conectables (PDB). <code>sid=ORCL<\/code> se conecta a la ra\u00edz de CDB; su esquema de aplicaci\u00f3n no existe all\u00ed. <code>nombre_del_servicio=TU_PDB_NAME<\/code> se conecta a la PDB donde reside tu esquema. El nombre del servicio de la PDB es visible en <code>lsnrctl status<\/code> en el servidor de Oracle.<\/p>\n\n\n\n<p><strong><code>ORACLE_USUARIO<\/code>:<\/strong> Con\u00e9ctate como SYSTEM u otro usuario DBA, no como el propietario del esquema. El propietario del esquema normalmente carece de <code>SELECCIONAR EN v$base de datos<\/code>, lo que provoca que el comando SHOW_REPORT falle. El uso de SYSTEM evita problemas de privilegios durante la fase de evaluaci\u00f3n.<\/p>\n\n\n\n<p><strong><code>ESQUEMA<\/code>:<\/strong> Limita el escaneo a un esquema. Sin esto, ora2pg escanea todos los esquemas de la base de datos, lo que aumenta significativamente el tiempo de escaneo y produce un informe que mezcla todos los objetos de esquema.<\/p>\n\n\n\n<p><strong><code>DIRECTORIO_DE_SALIDA<\/code>:<\/strong> El directorio donde ora2pg escribe los archivos de exportaci\u00f3n. Este directorio debe existir antes de ejecutar cualquier comando de ora2pg; ora2pg no lo crea autom\u00e1ticamente.<\/p>\n\n\n\n<p>Crea el directorio de salida:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmkdir -p ~\/ora2pg-output\n<\/pre><\/div>\n\n\n<p>Ejecuta dos pruebas de conectividad antes de proceder al informe. <\/p>\n\n\n\n<p>Las pruebas verifican diferentes capas de la pila. Pasar ambas confirma que la cadena completa de Ubuntu a Oracle funciona correctamente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Test 1: sqlplus64 -- verifies Instant Client libraries, network routing, and Oracle listener\nsqlplus64 YOUR_USER\/YOUR_PASSWORD@\/\/YOUR_ORACLE_HOST:1521\/YOUR_PDB_NAME\n# Expected: Connected to: Oracle Database 19c Enterprise Edition ...\n# Type &quot;exit&quot; to leave the SQL*Plus prompt\n\n# Test 2: ora2pg SHOW_VERSION -- verifies ora2pg connects to Oracle via DBD::Oracle\nora2pg -t SHOW_VERSION\n# Expected: Oracle Database 19c Enterprise Edition Release 19.x.x.x.x\n\n# If test 1 fails: check the Oracle listener with &quot;lsnrctl status&quot; on the Oracle server\n# and confirm port 1521 is open between the two machines.\n# If test 2 fails but test 1 passes: check that LD_LIBRARY_PATH is exported (not just set)\n# in the current shell.\n<\/pre><\/div>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Si la conectividad funciona pero no est\u00e1 seguro de c\u00f3mo interpretar la salida del informe \u2014 o la puntuaci\u00f3n es de nivel C y necesita una segunda opini\u00f3n sobre el alcance \u2014 <a href=\"https:\/\/rootfan.com\/es\/servicios\/\">una evaluaci\u00f3n a precio fijo cubre exactamente eso<\/a><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-4-run-the-migration-assessment-report\">Paso 4: Ejecutar el Informe de Evaluaci\u00f3n de Migraci\u00f3n<\/h2>\n\n\n\n<p>Antes de ejecutar el informe, recopile estad\u00edsticas actualizadas del esquema de Oracle. ora2pg deriva sus recuentos de filas y estimaciones de costos de las estad\u00edsticas almacenadas en Oracle en el diccionario de datos. <\/p>\n\n\n\n<p>Si las estad\u00edsticas est\u00e1n obsoletas \u2014 lo que es com\u00fan en esquemas que no se han analizado recientemente \u2014 los recuentos de filas ser\u00e1n inexactos y la estimaci\u00f3n del esfuerzo no ser\u00e1 fiable.<\/p>\n\n\n\n<p>Ejecute esto en el servidor Oracle como SYSTEM o SYSDBA:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nBEGIN\n  DBMS_STATS.GATHER_SCHEMA_STATS(&#039;YOUR_SCHEMA&#039;);\n  DBMS_STATS.GATHER_DATABASE_STATS;\n  DBMS_STATS.GATHER_DICTIONARY_STATS;\nEND;\n\/\n-- Expected: PL\/SQL procedure successfully completed.\n<\/pre><\/div>\n\n\n<p><code>RECOPILAR_ESTAD\u00cdSTICAS_DEL_ESQUEMA<\/code> actualiza las estad\u00edsticas para el esquema de destino. <code>RECOPILAR_ESTAD\u00cdSTICAS_BASE_DE_DATOS<\/code> actualiza estad\u00edsticas para todos los objetos de la base de datos. <\/p>\n\n\n\n<p><code>RECOPILAR_ESTAD\u00cdSTICAS_DEL_DICCIONARIO<\/code> actualiza las vistas del diccionario de datos de Oracle que ora2pg lee durante el escaneo. <\/p>\n\n\n\n<p>En una base de datos grande este bloque puede tardar varios minutos; en un esquema peque\u00f1o como HR se completa en segundos.<\/p>\n\n\n\n<p>Luego ejecuta el informe desde Ubuntu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# HTML version -- recommended for reading the report\nora2pg -t SHOW_REPORT --estimate_cost --dump_as_html &gt; ~\/ora2pg-output\/migration_report.html\n# SHOW_REPORT: connects to Oracle and counts every object by type in the schema\n# --estimate_cost: calculates a complexity score and converts the total units to person-days\n# --dump_as_html: formats the output as an HTML table -- open in a browser\n\n# Plain text version -- useful for scripting or sending the report by email\nora2pg -t SHOW_REPORT --estimate_cost &gt; ~\/ora2pg-output\/migration_report.txt\n<\/pre><\/div>\n\n\n<p>Abrir <code>informe_migracion.html<\/code> en un navegador. <\/p>\n\n\n\n<p>La versi\u00f3n de texto sin formato es dif\u00edcil de leer porque las columnas no est\u00e1n alineadas; la versi\u00f3n HTML formatea la tabla limpiamente y es la que se debe compartir con los interesados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-5-read-the-report-output\">Paso 5: Leer la salida del informe<\/h2>\n\n\n\n<p>El informe proporciona una fila por tipo de objeto. <\/p>\n\n\n\n<p>Las columnas son: tipo de objeto, recuento de objetos, recuento de objetos no v\u00e1lidos, costo estimado en unidades de migraci\u00f3n y un campo de comentarios que explica qu\u00e9 har\u00e1 ora2pg con cada tipo.<\/p>\n\n\n\n<p>Presta atenci\u00f3n a cuatro cosas:<\/p>\n\n\n\n<p><strong>El nivel de migraci\u00f3n<\/strong> \u2014 que se muestra en la parte superior del informe como una letra y un n\u00famero (por ejemplo, B-5). Los esquemas A-1 y A-2 no tienen c\u00f3digo almacenado y migran en gran medida de forma autom\u00e1tica. Los esquemas B-4 y B-5 tienen procedimientos almacenados o desencadenadores que requieren una reescritura manual en PL\/pgSQL. Los esquemas de nivel C superan el umbral de d\u00edas por persona y requieren un alcance de proyecto formal antes de comprometerse a un cronograma.<\/p>\n\n\n\n<p><strong>Las filas de FUNCTION, PROCEDURE, PACKAGE y TRIGGER<\/strong> \u2014 aqu\u00ed es donde se concentra el esfuerzo manual. Las tablas, secuencias e \u00edndices se migran con un m\u00ednimo de trabajo manual. El c\u00f3digo almacenado no lo hace: cada funci\u00f3n, procedimiento y disparador debe revisarse y reescribirse. Un esquema con 200 tablas y cero procedimientos almacenados se migra m\u00e1s r\u00e1pido que un esquema con 50 tablas y 30 procedimientos almacenados. Los recuentos de objetos en estas filas son los n\u00fameros m\u00e1s importantes del informe.<\/p>\n\n\n\n<p><strong>El recuento de objetos no v\u00e1lidos<\/strong> - la tercera columna de la tabla. Cualquier objeto que el propio Oracle marque como no v\u00e1lido (dependencias rotas, errores de compilaci\u00f3n) no se exportar\u00e1 limpiamente. Corrija los objetos no v\u00e1lidos en Oracle antes de ejecutar cualquier exportaci\u00f3n - no los lleve a la migraci\u00f3n.<\/p>\n\n\n\n<p><strong>La columna de comentarios<\/strong> \u2014 ora2pg explica qu\u00e9 har\u00e1 con cada tipo de objeto y se\u00f1ala los problemas conocidos. Lea atentamente los comentarios de TRIGGER: los triggers BEFORE INSERT basados en secuencias (utilizados para simular auto-incremento en Oracle) se exportan como PL\/pgSQL pero deben ser reemplazados con PostgreSQL. <code>IDENTIDAD<\/code> columnas o <code>GENERADO SIEMPRE COMO IDENTIDAD<\/code>, lo que requiere una decisi\u00f3n deliberada durante la migraci\u00f3n.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-6-adjust-the-effort-estimate\">Paso 6: Ajustar la Estimaci\u00f3n de Esfuerzo<\/h2>\n\n\n\n<p>La unidad de costo predeterminada son 5 minutos por unidad de migraci\u00f3n. <\/p>\n\n\n\n<p>Esta cifra asume un consultor con experiencia en PostgreSQL realizando el trabajo de reescritura. <\/p>\n\n\n\n<p>Es un punto de partida razonable para la delimitaci\u00f3n, pero dos par\u00e1metros te permiten ajustarlo para que coincida con el equipo y el apetito de riesgo reales.<\/p>\n\n\n\n<p><strong><code>--valor_unidad_costo<\/code><\/strong> cambia el n\u00famero de minutos por unidad. El predeterminado es 5. Para un equipo interno que realiza su primera migraci\u00f3n de Oracle a PostgreSQL, duplicar a 10 minutos por unidad es m\u00e1s realista: las migraciones por primera vez siempre llevan m\u00e1s tiempo de lo que sugiere la herramienta debido a la sintaxis desconocida, los ciclos de prueba y los casos extremos:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nora2pg -t SHOW_REPORT --estimate_cost --cost_unit_value 10 --dump_as_html &gt; ~\/ora2pg-output\/migration_report.html\n# --cost_unit_value 10: each unit = 10 minutes instead of 5\n# The person-day total doubles -- use this when the team has no prior migration experience\n<\/pre><\/div>\n\n\n<p><strong><code>--l\u00edmite_d\u00edas_humanos<\/code><\/strong> establece el umbral por encima del cual el esquema se clasifica como de nivel C. El valor predeterminado es 10 d\u00edas-persona. Reducirlo a 5 es \u00fatil cuando se desea ser m\u00e1s conservador, por ejemplo, al presentar el informe a un cliente que necesita presupuestar el trabajo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nora2pg -t SHOW_REPORT --estimate_cost --human_days_limit 5 --dump_as_html &gt; ~\/ora2pg-output\/migration_report.html\n# --human_days_limit 5: any schema above 5 person-days is classified as C-level\n# The underlying unit counts do not change -- only the letter classification changes\n<\/pre><\/div>\n\n\n<p>Ambas banderas se pueden combinar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nora2pg -t SHOW_REPORT --estimate_cost --cost_unit_value 10 --human_days_limit 5 --dump_as_html &gt; ~\/ora2pg-output\/migration_report.html\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"frequently-asked-questions\">Preguntas frecuentes<\/h2>\n\n\n\n<p><strong>Qu\u00e9 privilegios de Oracle necesita el usuario ora2pg<\/strong><\/p>\n\n\n\n<p>Para un usuario que no es DBA, las concesiones m\u00ednimas son:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nGRANT CONNECT TO ora2pg_user;\nGRANT SELECT ANY DICTIONARY TO ora2pg_user;\nGRANT SELECT ON v_$database TO ora2pg_user;\n<\/pre><\/div>\n\n\n<p><code>SELECCIONAR CUALQUIER DICCIONARIO<\/code> cubre el <code>DBA_*<\/code> vistas del diccionario de datos est\u00e1ticas que consulta ora2pg para el recuento de objetos. <code>SELECCIONAR EN v_$base de datos<\/code> cubre el <code>V$<\/code> vistas de rendimiento din\u00e1mico \u2014 estos son un tipo de objeto separado en Oracle y requieren un grant expl\u00edcito incluso cuando <code>SELECCIONAR CUALQUIER DICCIONARIO<\/code> ya est\u00e1 concedido. Ambas concesiones son necesarias; ninguna hace que la otra sea redundante.<\/p>\n\n\n\n<p>Configurar <code>USUARIO_CONCESIONES 1<\/code> en <code>ora2pg.conf<\/code> para decirle a ora2pg que consulte <code>USUARIO_*<\/code> vistas en lugar de <code>DBA_*<\/code> vistas al conectarse como el propietario del esquema. Para la mayor\u00eda de las evaluaciones, conectarse como SYSTEM es m\u00e1s sencillo y evita completamente los problemas de concesi\u00f3n.<\/p>\n\n\n\n<p><strong>\u00bfora2pg funciona con bases de datos enchufables de Oracle 19c?<\/strong><\/p>\n\n\n\n<p>S\u00ed, pero debes usar <code>nombre_del_servicio<\/code> en el DSN, no <code>lado<\/code>. <code>sid=ORCL<\/code> se conecta a la ra\u00edz de la CDB donde sus esquemas de aplicaci\u00f3n no existen. Utilice <code>nombre_del_servicio=TU_PDB_NAME<\/code> \u2014 el nombre del servicio PDB es visible en <code>lsnrctl status<\/code> en el servidor de Oracle.<\/p>\n\n\n\n<p><strong>El informe muestra una estimaci\u00f3n de alto costo. \u00bfQu\u00e9 significa eso para la migraci\u00f3n?<\/strong><\/p>\n\n\n\n<p>A high estimate means the schema has significant PL\/SQL \u2014 stored procedures, packages, and triggers that require manual rewriting. The report does not mean migration is impossible; it means the rewriting work needs to be scoped and resourced properly. In my experience, a C-level schema with 50\u2013100 person-days of estimated effort is a 6\u20138 week engagement with the right approach \u2014 not a reason to abandon the project. The estimate is a starting point for scoping, not a final answer.<\/p>\n\n\n\n<p><strong>\u00bfPuedo ejecutar el informe sin conectarme a una base de datos Oracle activa?<\/strong><\/p>\n\n\n\n<p>No. SHOW_REPORT se conecta al diccionario de datos de Oracle para contar objetos y leer estad\u00edsticas. No puede operar sin conexi\u00f3n o contra un archivo de exportaci\u00f3n. La base de datos debe estar en ejecuci\u00f3n y accesible en el puerto 1521 desde la m\u00e1quina Ubuntu.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"in-summary\">En resumen<\/h2>\n\n\n\n<p>La instalaci\u00f3n de ora2pg en Ubuntu 24.04 requiere tres componentes en orden de dependencia: Oracle Instant Client 19.30 (instalado a trav\u00e9s de <code>extraterrestre<\/code> desde los RPM de Oracle, DBD::Oracle (compilado desde el c\u00f3digo fuente a trav\u00e9s de <code>cpanminus<\/code>), y ora2pg 25.0 (instalado desde el tarball de GitHub \u2014 no disponible en CPAN).<\/p>\n\n\n\n<p>Una vez instalado, el comando de evaluaci\u00f3n es una sola l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code\" data-no-translation=\"\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nora2pg -t SHOW_REPORT --estimate_cost --dump_as_html &gt; ~\/ora2pg-output\/migration_report.html\n<\/pre><\/div>\n\n\n<p>La salida proporciona una puntuaci\u00f3n de complejidad (A\/B\/C + 1\u20135) y una estimaci\u00f3n de esfuerzo en d\u00edas-persona. Ejec\u00fatela antes de comprometerse con cualquier cronograma de migraci\u00f3n; el n\u00famero que produce es el \u00fanico n\u00famero que determina c\u00f3mo se debe definir el alcance y los recursos del proyecto.<\/p>\n\n\n\n<p>Si el informe resultante es de nivel B-5 o C y necesita ayuda para interpretar la salida o definir el alcance del trabajo manual, <a href=\"https:\/\/rootfan.com\/es\/servicios\/\">ponerse en contacto<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Una gu\u00eda paso a paso para instalar ora2pg en Ubuntu 24.04 y ejecutar la evaluaci\u00f3n de migraci\u00f3n SHOW_REPORT. Cubre Oracle Instant Client, DBD::Oracle, ora2pg desde el c\u00f3digo fuente y c\u00f3mo leer la puntuaci\u00f3n de complejidad y la estimaci\u00f3n de esfuerzo.<\/p>","protected":false},"author":1,"featured_media":6819,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_focus_keyword":"how to install ora2pg on ubuntu","rank_math_title":"","rank_math_description":"How to install ora2pg on Ubuntu 24.04, connect to Oracle, and run the migration assessment report. Get your schema complexity score and effort estimate in under 20 minutes.","rank_math_robots":"","rank_math_og_title":"","rank_math_og_description":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[146],"tags":[137],"class_list":["post-6814","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle-to-postgresql","tag-migration"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/rootfan.com\/wp-content\/uploads\/5638320778_076e33a851.jpg?fit=500%2C345&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6814","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/comments?post=6814"}],"version-history":[{"count":7,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6814\/revisions"}],"predecessor-version":[{"id":6823,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/posts\/6814\/revisions\/6823"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/media\/6819"}],"wp:attachment":[{"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/media?parent=6814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/categories?post=6814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rootfan.com\/es\/wp-json\/wp\/v2\/tags?post=6814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}