sql >> Base de Datos >  >> RDS >> PostgreSQL

Migración de Oracle a PostgreSQL:lo que debe saber

Ya sea que migre una base de datos o una aplicación de Oracle a PostgreSQL con solo un tipo de conocimiento de base de datos, hay algunas cosas que debe saber sobre las diferencias entre los dos sistemas de base de datos.

PostgreSQL es la base de datos de código abierto más avanzada del mundo. La comunidad de PostgreSQL es muy fuerte y están mejorando continuamente las características existentes de PostgreSQL y también agregan nuevas características. Según db-engines.com, PostgreSQL es el DBMS del año 2017.

Hay algunas incompatibilidades en Oracle y PostgreSQL. El comportamiento de algunas funciones es diferente entre Oracle y PostgreSQL.

Por qué migrar de Oracle a PostgreSQL

  1. Costo:como sabrá, el costo de la licencia de Oracle es muy alto y hay un costo adicional para algunas funciones, como el particionamiento y la alta disponibilidad. Entonces, en general, es muy caro.
  2. Licencias de código abierto flexibles y fácil disponibilidad de proveedores de nube pública como AWS.
  3. Benefíciese de los complementos de código abierto para mejorar el rendimiento.

Comprobación preliminar

Como sabrá, la migración de Oracle a PostgreSQL es una tarea costosa y que requiere mucho tiempo. Es importante entender qué parte es migrar. No pierda tiempo en migrar objetos que ya no son necesarios. Además, verifique si se requieren datos históricos o no. No pierda el tiempo replicando datos que no necesita, por ejemplo, datos de copia de seguridad y tablas temporales de mantenimiento anterior.

Evaluación de la migración

Después de una verificación preliminar, el primer paso de la migración es analizar la aplicación y el objeto de la base de datos, descubrir las incompatibilidades entre ambas bases de datos y estimar el tiempo y el costo necesarios para la migración.

La herramienta Ora2pg es muy útil para la evaluación de la migración. Se conecta a la base de datos Oracle, la escanea automáticamente y extrae los datos, generando el informe de migración de la base de datos. Puede consultar un informe de muestra en Ora2pg.

Lo que debe saber

Comprenda las diferencias entre Oracle y PostgreSQL y conviértalo usando cualquier herramienta. No existe ninguna herramienta que pueda convertir 100% la base de datos de Oracle en PostgreSQL, se requieren algunos cambios manuales. Consulte a continuación algunas de las diferencias importantes que debe conocer antes de migrar.

Asignación de tipos de datos

PostgreSQL tiene un rico conjunto de tipos de datos. Algunas de las conversiones de tipos de datos importantes entre Oracle y PostgreSQL son las siguientes.

Oráculo PostgreSQL Comentario
VARCHAR2(n) VARCHAR(n) En Oracle 'n' es el número de bytes mientras que en PostgreSQL 'n' es el número de caracteres
CARÁCTER(n) CHAR(n) En Oracle 'n' es el número de bytes mientras que en PostgreSQL 'n' es el número de caracteres
NÚMERO(n,m) NUMÉRICO(n,m) El tipo NÚMERO se puede convertir a NUMÉRICO, pero si usa SMALLINT, INT y BIGINT, el rendimiento será mejor.
NÚMERO(4) PEQUEÑO
NÚMERO(9) INT
NÚMERO(18) GRANDE
NÚMERO(n) NUMÉRICO(n) NUMÉRICO(n), si n>=19
FECHA TIMESTAMP(0) Ambas bases de datos tienen el tipo DATE, pero el tipo DATE de Oracle devuelve la fecha y la hora, mientras que el tipo DATE de PostgreSQL solo devuelve la fecha y no la hora.
SELLO DE TIEMPO CON ZONA HORARIA LOCAL TIMESTAMPTZ El tipo de PostgreSQL Timestamptz(Timestamp with time zone) es diferente del Oracle Timestamp con zona horaria. Es equivalente a la marca de tiempo de Oracle con la zona horaria local, pero esta pequeña diferencia puede causar problemas de rendimiento o errores en la aplicación.
CLOB TEXTO El tipo TEXT de PostgreSQL puede almacenar hasta 1 GB de texto.
BLOB
SIN PROCESAR(n)
BYTEA (límite de 1 GB)
Objeto grande
En Oracle, el tipo de datos BLOB almacena datos binarios no estructurados en la base de datos. El tipo BLOB puede almacenar hasta 128 terabytes de datos binarios. PostgreSQL BYTEA almacena datos binarios pero solo hasta 1 GB. Si los datos superan 1 GB, utilice Objeto grande.

Transacciones

La base de datos Oracle siempre usa transacciones, pero en PostgreSQL debe activar eso. En Oracle, la transacción comienza al ejecutar cualquier instrucción y finaliza cuando se ejecuta la instrucción COMMIT. En PostgreSQL, la transacción comienza cuando se ejecuta BEGIN y finaliza cuando se ejecuta la instrucción COMMIT. Incluso los niveles de aislamiento tampoco tienen problema. La base de datos PostgreSQL conoce todos los niveles de aislamiento que conoce la base de datos Oracle. El nivel de aislamiento predeterminado de PostgreSQL es Lectura confirmada.

Ejemplo:

Oráculo:

DELETE FROM table_name WHERE id = 120;
COMMIT;

PostgreSQL:

BEGIN;
DELETE FROM table_name WHERE id  = 120;
COMMIT;

Mesa doble

En Oracle, la cláusula FROM es obligatoria para cada declaración SELECT, por lo que la base de datos Oracle usa la tabla DUAL para la declaración SELECT donde no se requiere el nombre de la tabla. En PostgreSQL, la cláusula FROM no es obligatoria, por lo que la tabla DUAL no es necesaria. La tabla Dual se puede crear en PostgreSQL como una vista para eliminar el problema de la portabilidad. La herramienta Orafce ha implementado esto para que también puedas usar Orafce.

Ejemplo:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
ERROR:  relation "dual" does not exist
LINE 1: SELECT CURRENT_TIMESTAMP FROM DUAL;
                                      ^
postgres=# SELECT CURRENT_TIMESTAMP;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

Después de instalar el módulo Orafce:

postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
       current_timestamp
-------------------------------
 2018-03-16 09:36:01.205925+00
(1 row)

SISTEMA

La función SYSDATE de Oracle devuelve la fecha y la hora. El comportamiento de la función SYSDATE es diferente en diferentes lugares. PostgreSQL no tiene ninguna función correspondiente a la función SYSDATE. En PostgreSQL existen múltiples métodos para obtener la fecha y la hora y se basa en el propósito de la aplicación.

Método de recuperación de tiempo Función a utilizar
Hora de inicio de SQL Statement_timestamp()
Hora de inicio de la transacción ahora() o

Transacción_marca de tiempo()

Momento en que se implementa la función Reloj_marca de tiempo()

En el siguiente ejemplo, clock_timestamp() devuelve la hora en que se ejecuta la función real y otra declaración_timestamp() devuelve la hora en que la instrucción SQL comenzó su ejecución.

postgres=# SELECT now(), statement_timestamp(), current_timestamp, transaction_timestamp(), clock_timestamp();
              now              |      statement_timestamp      |       current_timestamp       |     transaction_timestamp     |        clock_timestamp
 
-------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163281+00
 (1 row)

TO_DATE(dos argumentos)

La función TO_DATE de Oracle devuelve el valor de tipo FECHA (año, mes, día, hora, minuto, segundo) mientras que la función TO_DATE de PostgreSQL (dos_argumentos) devuelve el valor de tipo FECHA (año, mes, día).

La solución para esta incompatibilidad es convertir TO_DATE() a TO_TIMESTAMP(). Si usa la herramienta Orafce, entonces no es necesario cambiar nada porque Orafce implementó esta función, por lo que obtenemos el mismo resultado que Oracle.

Oráculo:

SELECT TO_DATE ('20180314121212','yyyymmddhh24miss') FROM dual;

PostgreSQL:

SELECT TO_TIMESTAMP ('20180314121212','yyyymmddhh24miss')::TIMESTAMP(0);

SINÓNIMO

CREATE SYNONYM no es compatible con PostgreSQL. En Oracle, CREATE SYNONYM se usa para acceder a objetos remotos, mientras que en PostgreSQL podemos usar SET search_path para incluir la definición remota.

Oráculo:

CREATE SYNONYM abc.table_name FOR pqr.table_name;

PostgreSQL:

SET search_path TO 'abc.table_name';

Comportamiento de cadena vacía y NULL

En Oracle, las cadenas vacías y los valores NULL en el contexto de cadena son iguales. La concatenación de NULL y cadena obtiene como resultado una cadena. En PostgreSQL, el resultado de la concatenación es nulo en este caso. En Oracle, el operador IS NULL se usa para verificar si la cadena está vacía o no, pero en PostgreSQL, el resultado es FALSO para una cadena vacía y VERDADERO para NULL.

Secuencias

Hay una ligera diferencia en la sintaxis de la secuencia en Oracle y PostgreSQL.

Oráculo:

Sequence_name.nextval

PostgreSQL:

Nextval(‘sequence_name’)

Para cambiar esta sintaxis, puede crear un script o puede cambiarlo manualmente.

SUBSTR

El comportamiento de la función SUBSTR en Oracle y PostgreSQL es diferente. La función SUBSTR funciona en PostgreSQL sin error pero devuelve un resultado diferente. Esta diferencia puede causar errores en la aplicación.

Oráculo:

SELECT SUBSTR(‘ABC’,-1) FROM DUAL;
Returns ‘C’

PostgreSQL:

postgres=# SELECT SUBSTR('ABC',-1);
 substr
--------
 ABC
(1 row)

La solución para esto es usar la función SUBSTR de Orafce que devuelve el mismo resultado que Oracle en PostgreSQL.

Declaración DELETE

En Oracle, la declaración DELETE puede funcionar sin la cláusula FROM, pero en PostgreSQL no es compatible. Necesitamos agregar la cláusula FROM en la declaración DELETE de PostgreSQL manualmente.

Oráculo:

DELETE table_name WHERE column_name = 'Col_value';

PostgreSQL:

DELETE FROM table_name WHERE column_name = 'Col_value';

Acoplamiento externo +

Oracle usa el operador + para la combinación izquierda y derecha, pero PostgreSQL no lo usa.

Oráculo:

SELECT a1.name1, a2.name2
     FROM a1, a2
     WHERE a1.code = a2.code (+);

PostgreSQL:

SELECT a1.name1, a2.name2
    FROM a1
    LEFT OUTER JOIN a2 ON a1.code = a2.code;

COMENZAR CON...CONECTAR POR

Oracle usa START WITH..CONNECT BY para consultas jerárquicas. PostgreSQL no es compatible con la instrucción START WITH..CONNECT BY. PostgreSQL tiene CON RECURSIVO para consultas jerárquicas, así que traduzca la declaración CONNECT BY a la declaración CON RECURSIVO.

Oráculo:

SELECT 
    restaurant_name, 
    city_name 
FROM 
    restaurants rs 
START WITH rs.city_name = 'TOKYO' 
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;

PostgreSQL:

WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
                                 FROM restaurants
                                WHERE city_name = 'TOKYO'
                                UNION
                               SELECT m.restaurant_name, m.city_name
                                 FROM restaurants m
                                 JOIN tmp ON tmp.restaurant_name = m.city_name)
                  SELECT restaurant_name, city_name FROM tmp;

Conversión de PLSQL a PLPGSQL

El lenguaje PL/pgSQL de PostgreSQL es similar al lenguaje PL/SQL de Oracle en muchos aspectos. Es un lenguaje imperativo estructurado en bloques, y todas las variables tienen que ser declaradas. En ambas bases de datos, las asignaciones, los bucles y los condicionales son similares.

Las principales diferencias que debe tener en cuenta al migrar de PL/SQL de Oracle a PL/pgSQL de PostgreSQL

Descargue el documento técnico hoy Administración y automatización de PostgreSQL con ClusterControlObtenga información sobre lo que necesita saber para implementar, monitorear, administrar y escalar PostgreSQLDescargar el documento técnico

Herramientas de migración

Hay algunas herramientas que son muy útiles para una migración de Oracle a PostgreSQL. También puede crear su propia herramienta como una extensión y usarla dentro de PostgreSQL.

Orafce

Las funciones, el tipo de datos y los paquetes compatibles con Oracle se pueden usar tal como están en PostgreSQL. Esta es una herramienta de código abierto con licencia BSD para que cualquiera pueda usar esta herramienta.

La mayoría de las funciones principales están cubiertas en Orafce.

Las aplicaciones generalmente usan esas funciones con múltiples ocurrencias. Puede reducir el costo de modificación de SQL usando esta herramienta.

Todas las funciones y paquetes están implementados correctamente y están bien probados.

Algunas de las funciones:

  • Dbms_salida
  • dbms_aleatorio
  • utl_file:funciones relacionadas con el sistema de archivos
  • Dbms_pipe y dbms_alert
  • PLVfecha,PLVstr, PLVchr
  • Tipo de datos DATE compatible con Oracle y funciones como ADD_MONTHS, LAST_DAY,NEXT_DAY, etc.
  • Función NVL
  • Función SUBSTR y SUBSTRB
  • Compatibilidad con VARCHAR2 y NVARCHAR2
  • HASTA_FECHA()

Ora2pg

Ora2Pg es una herramienta gratuita que se utiliza para migrar una base de datos Oracle a un esquema compatible con PostgreSQL.

Se conecta a la base de datos Oracle, la escanea automáticamente, extrae su estructura o datos y luego genera scripts SQL que puede cargar en su base de datos PostgreSQL.

La estimación de costos en una migración de Oracle a PostgreSQL no es fácil.

Ora2Pg inspecciona todos los objetos de la base de datos, todas las funciones y procedimientos almacenados para detectar si todavía hay algunos objetos y código PL/SQL que Ora2Pg no puede convertir automáticamente.

Esta herramienta es muy útil para las siguientes conversiones:

  • Conversión de esquema
  • Conversión de PLSQL a PLPGSQL

Pruebas

Probar toda la aplicación y la base de datos migrada es muy importante porque algunas de las funciones son las mismas en ambas bases de datos, sin embargo, el comportamiento es diferente.

  • Se deben verificar algunos escenarios comunes:
    • Compruebe si todos los objetos se han convertido correctamente o no.
    • Compruebe si todos los DMLS funcionan correctamente o no.
    • Cargue algunos datos de muestra en ambas bases de datos y verifique el resultado. El resultado de SQL de ambas bases de datos debe ser el mismo.
    • Compruebe el rendimiento del DML y mejórelo si es necesario.