Convertir y Migrar Bases de Datos a otros motores

Descripción

Hay que convertir el dump en SQL, Los datos y otros gallitos

MySQL – MariaDB  –  MariaDB

 

MySQL – MariaDB-MariaDB  -> PostgreSQL

Una guia de postgresql para hacerlo https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL – MariaDB

1. PgLoader

El papa es pgloader ..   https://pgloader.readthedocs.io/en/latest/tutorial/tutorial.html

$>    pgloader   MySQL - MariaDB://admin:sveT1a%a@localhost/testOciJaime   postgresql://admin:sveT1a%a@localhost/testOciJaime

Si quiere que sea case sensitive, es necesario pasarle opcione quote identifiers .. entonces hay que crear un archivo  pgloader.load  y se corre con pglaoder pgloader.load

load database
     from      MySQL - MariaDB://admin:sveT1a%a@localhost/orfeo_ng
     into postgresql://admin:sveT1a%a@localhost/orfeo_ng


 WITH include drop, create tables, no truncate, quote identifiers,
      create indexes, reset sequences, foreign keys

 BEFORE LOAD DO
 $$ create schema if not exists orfeo_ng; $$;

 

2. PG-Chameleeon

Un relplicador de datos . pero nopp Pg-Chameleon https://pypi.org/project/pg-chameleon/

pip3 install argparse
pip3 install MySQL – MariaDB-replication
pip3 install psycop
pip3 install pyyaml
pip3 install rollbar

apt-get -y install python3-pymysql
apt-get -y  install  python3-psycopg2
apt-get -y  install python3-tabulate
apt-get -y  install python3-daemonize
apt-get install python3-chameleon

MySQL – MariaDB-MariaDB  -> Oracle DB

Lo que recomienda Oracle por supuesto es usar sqldevelopper para migrar. Hay que agregarle el jdbc para que se conecte con MySQL – MariaDB

https://www.oracle.com/database/technologies/migrating-MySQL – MariaDB-oracle-database.html

Para 11g es una cosa y para 12c es otra !!!

Oracle 18c

En general arriba de la 12c (12.1) ya hay autoincrement (https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1) o sea eso no es problema.

** OJO .. el formato de la fecha friega .. toca cambiarlo en el motor o en la sesion. Mire el howto de Oracle DB

** OJO en la migracion todos los identificadores deben estar entre comillas para que sea case Sensitive

PROMPT Creating Table testOciJaime …
CREATE TABLE «testOciJaime» (
«id» NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY START WITH 0 INCREMENT BY 1 MINVALUE 0 NOMAXVALUE ,
«nombre» VARCHAR2(50 CHAR) NOT NULL,
«creacion» DATE NOT NULL,
«estado» NUMBER(5,0) NOT NULL
);

PROMPT Creating Primary Key Constraint PRIMARY on table testOciJaime …
ALTER TABLE «testOciJaime» ADD CONSTRAINT «testOciJaime_pk» PRIMARY KEY ( «id» ) ENABLE ;

Insertando cosas a los machetazos

INSERT INTO «C##ORFEO_USR».»testOciJaime» («id», «nombre», «creacion», «estado») VALUES (‘2’, ‘pruebad2’, TO_DATE(‘2020-07-25 00:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ’10’)

UPDATE «C##ORFEO_USR».»testOciJaime» SET «nombre» = ‘prueba2’ WHERE ROWID = ‘AAATwaAAHAAAAKlAAA’ AND ORA_ROWSCN = ‘4446720’

Oracle 11g

Aqui esto se pone bonito porque toca simular los autoincrementales entre triggers y secuencias   ( https://stackoverflow.com/questions/11296361/how-to-create-id-with-auto-increment-on-oracle/11296469#11296469)

Entonces mi tabla se convierte en

CREATE TABLE «testOciJaime» (
«id» NUMBER(10,0) NOT NULL,
«nombre» VARCHAR2(50 CHAR) NOT NULL,
«creacion» DATE NOT NULL,
«estado» NUMBER(5,0) NOT NULL
);

ALTER TABLE «testOciJaime»  ADD CONSTRAINT «testOciJaime_pk» PRIMARY KEY («id»)  ENABLE  ;

CREATE SEQUENCE «testOciJaime_seq» START WITH 1;

CREATE OR REPLACE TRIGGER «testOciJaime_bir»
BEFORE INSERT ON «testOciJaime»
FOR EACH ROW

BEGIN
SELECT «testOciJaime_seq».NEXTVAL
INTO   :new.»id »
FROM   dual;
END;
/

MySQL – MariaDB-MariaDB  -> SQL Server

Todos quieren que se migren a sus BDs ..

1. MySQLtoSQL o  SSMA  (SQL Server Migration Asistant)  for MySQL – MariaDB

– Como migrar https://datamigration.microsoft.com/scenario/MySQL – MariaDB-to-sqlserver?step=1
– El manual de la herramienta https://docs.microsoft.com/en-us/sql/ssma/MySQL – MariaDB/sql-server-migration-assistant-for-MySQL – MariaDB-mysqltosql?view=sql-server-ver15

OJO.. el sistema asigna las tablas al schema del nombre de la base de datos y toca moverla a bdo.xxxx para que se pueda hacer consultas

alter schema dbo transfer testOciJaime.testOciJaime

Oracle DB

 

Oracle DB  -> MySQL – MariaDB-MariaDB

Lo he intentado por muchos lados ,,… ni workbench ni sqldeveloper no tiene (a oracle no le conviene), dbeaver no lo encontre

Hay otra herramienta que no he logrado poner a funcionar: https://github.com/seanharr11/etlalchemy

https://www.thegeekdiary.com/how-to-migrate-from-oracle-to-MySQL – MariaDB/   una quia para sacar datos
https://www.sqlines.com/sqldata_cmd    Herramienta para convertir
https://dbconvert.com/download/        Un trial que depronto sirve

MS SQL Server

MS SQL Server –> PostgreSQL

https://wiki.postgresql.org/wiki/Microsoft_SQL_Server_to_PostgreSQL_Migration_by_Ian_Harding

1. DBConverter

Hay varios caminos, yo opte por usar este que fue el que menos ruido me causo, el problema es que ensucia los registros texto.

Entonces el proceso fue, haga la conversion, luego un DUMP de PostgreSQL y luego limpielo con un script que se anexa al final

./quite_TRIAL.sh postgresql.dump |  sed -v ‘^$’ > postgresql_limpio.dump

Si la base de datos es muy grande, puede ser muy lento .. yo lo paralelice partiendo el archivo con split -l  y lanzando muchos procesos simulaneos

$**OJO no verificamos sino los datos .. puede que haya llaves foraneas o algo mas que no pasa bien.

$**OJO No olvide quitar las lineas en blanco. Como sube los datos con un COPY (STDIN) una linea en blanco lo enloquece.

2. sqlserver2postgresl

Promete pero no lo probe .. necesita (pentaho) ketle para funcionar y me fue imposible instalarlo

Trucos

Problemas

1. Si el instale_mrtg.sh no le funciona

Referencias

FIN


ANEXO

Script para limpiar los TRIAL de DBConverter en postgresql

#!/bin/bash
#
DEBUG=0

# cada linea del archivo
j=1
while read -r ; do
# Si vale la pena procesarlo
if [[ `echo «$REPLY» | grep ‘\-TRIAL\-‘ ` != «»  ]] ; then
if [[ $DEBUG == 1 ]] ; then echo «Linea $j» > /dev/stderr ; fi
if [[ $DEBUG == 1 ]] ; then printf ‘%s\n’ «$REPLY» > /dev/stderr ; fi
# Es una alterada
numf=`echo «$REPLY» | awk -F»\t» ‘{print NF}’`
i=1
if [[ $DEBUG == 1 ]] ; then  echo «Hay $numf columnas en la linea» > /dev/stderr ; fi
while [ $i -le $numf ]; do
if [[ $i -eq $numf ]] ; then ultimo=1 ; else ultimo=0 ; fi
campo=`echo «$REPLY» | awk -v D=$i -F»\t» ‘{print $D}’`
if [[ `echo $campo | grep ‘\-TRIAL\-‘ ` != «»  ]] ; then
if [[ $DEBUG == 1 ]] ; then echo  «El campo ($i) esta alerado» > /dev/stderr ; fi
echo -n «$campo» | awk -F» » ‘{for(i=1;i<=NF-1;i++)  printf(«%s «,$i)}’  | \
sed -e «s/^[0-9][0-9][0-9]-TRIAL-//g» | \
sed -e «s/^[0-9][0-9]-TRIAL-//g» | \
sed -e «s/^[0-9]-TRIAL-//g»  | \
sed -e «s/                /       \\\N    /g»  | \
sed -e «s/                /       \\\N    /g»  | \
sed -e «s/        $/      \\\N/g» -e «s/ $//g»  | \
sed -e «s/        /       /g»
# Aqui quite los trial
# los vacios los vuelvo \N
# Dos tab seguidos \N
# Quito el espacio-tab final
# ultimo con tab
if [[ $ultimo -eq 0 ]] ; then echo -n -e «\t» ; fi
else
if [[ $ultimo -eq 1 ]] ; then
echo «$campo»
else
echo -n -e «$campo\t»
fi
fi
i=$(($i+1))
done
if [[ $i -gt $(($numf+1)) ]] ; then
echo «Problemas con el conteo de columnas [$j] ($i)>>($numf)» > /dev/stderr
exit 1
fi
echo «»
else
echo «$REPLY»
fi
j=$(($j+1))
done < $1

==============================================================