viernes, 16 de agosto de 2019

Migracion de MariaDB a Oracle 12c via archivo chatos.


Pasos para migrar bases de datos heterogéneas. (paso a paso técnico)


En este caso pasamos de MariaDB a Oracle 12c.


Hay muchas formas de migrar bases de datos por todos los foros, pero en todas siempre algo falla. Esta es la tradicional forma de migración bajando todos los datos a texto y luego subirlos a las tablas destinos de la otra base de datos.
Vamos a empezar con esta migración, tomando el origen de MariaDB (de aquí en mas MDB) y llevando todos los datos de la mejor manera posible a Oracle 12c (de aquí en mas ORC).

Pasos que seguimos:


Ubicados en la base origen MDB,

1.- Seteamos el uso de la base que vamos a migrar:

2.- Nos fijamos la cantidad de tablas que vamos a migrar; y armamos un archivo de texto para luego modificar y hacer un Shell para ejecutar todo.
Y más tablas … solo tomo una porción de la pantalla.

3.- Armamos una sentencia de INTO OUTFILE, para cada tablas, de esta forma hacemos un export de los datos de todas las tablas perteneciente a esa base de datos desde MDB.

Donde seleccionamos todos los campos de la tabla y los exportamos a un archivo de texto en un directorio especifico que le indicamos en la sentencia INTO OUTFILE, de esta forma le decimos donde lo dejamos y de que forma lo dejamos, es decir especificamos como vamos a separar los campos, como terminara la línea y de que tabla lo sacamos.
Esto lo ejecutamos para todas las tablas del listado que obtuvimos antes.
Generará un archivo por cada tabla con los datos, en el directorio donde le dijimos que lo haga en el script, por ejemplo “/migración/<nombre_tabla>.DAT”
A su vez le decimos que la separación de campos se proceda con “,” y el fin de línea sea el control “\n”
Una vez que exportamos todo a TXT debemos llevar todos los archivos de todas la tablas al equipo destino, donde será tomado via el SQL Loader para la suba de datos a las tablas destino.

4.- Pasamos los archivos .DAT al server destino:
  scp <origen>  <usuario>@<server_destino>:<ubicacion_destino>
  scp /migracion/*.dat  dlaadmin@10.20.8.11:/migracion/data/

Una ves que tenemos todo en el server destino, vamos y ejecutamos lo siguiente en dicho Server.


5.- Verificamos que todos los archivos hayan pasada correctamente.

6.- En ambos servidores creamos la misma estructura de directorio para llevar a cabo la migracion, es decir en ambos existe el directorio.
“/migracion”
Tomaremos este como raíz para la migración, de ahí saldrán todos los demás para acomodarlos según tengamos que hacer, por ejemplo
/migracion/log
/migracion/data
/migracion/ctl

En el directorio “/migracion” realice un script que genera los CTL de todas las tablas del owner a  migrar. Cabe destacar que ya nos encontrábamos con un esquema instalado de cero.
Este script es el siguiente.
[oracle@ora01nc001-2 migracion]$ cat gen_todas.sh
#!/bin/bash
# Generacion de CTL para sqlloader.
while read tabla;
do
SALIDA=$(sqlplus -s '/ as sysdba' <<-EOF>> /u05/migracion/$tabla.ctl
set heading off feedback off serveroutput on trimout on pagesize 0

declare
i number :=0;
j number :=0;

begin
  for i in (select * from dba_tables a where a.owner='NEXTCLOUD' and a.table_name ='$tabla') loop
    DBMS_OuTPUT.PUT_LINE ('LOAD DATA');
    DBMS_OUTPUT.PUT_LINE ('INFILE '|| upper(i.table_name) ||'.DAT');
    DBMS_OUTPUT.PUT_LINE ('REPLACE INTO TABLE NEXTCLOUD."'||i.table_name||'"' );
    DBMS_OUTPUT.PUT_LINE ('FIELDS TERMINATED BY '|| chr(39) ||',' ||chr(39) );
    for j in (select * from dba_tab_columns b where b.owner=i.owner and b.table_name=i.table_name order by column_id) loop
      if j.column_id = 1 THEN
        DBMS_OUTPUT.PUT_LINE('("'||j.column_name||'"' );
      ELSE
        DBMS_OUTPUT.PUT_LINE(', "'||j.column_name||'"' );
      END IF;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(')');
  END LOOP;
END;
/
EOF
);
done < /u05/migracion/tablas_nextcloud.txt

[oracle@ora01nc001-2 migracion]$

Donde mediante un loop de un archivo externo lo recorre y crea un archivo CTL por cada fila, ese archivo fue lo que extrajimos al principio, es decir la lista de tablas que pertenece al esquema que vamos a importar. Cabe destacar que tanto el nombre de la tabla como los campos se deben sostener entre comillas debido a como fueron creados.

7.- Luego de esto, ya estamos en condiciones de ejecutar el Sql Loader para cada tabla. Es importante para que no surgan errores incluir los path absolutos en casa Loader.
sqlldr "'/ as sysdba'" control=/u05/migracion/ data=/u05/migracion/data/OC_PRIVATEDATA.DAT log=/u05/migracion/log/0.log

8.- Contamos con un scripts (ingreso_masivo.sh) en el mismo directorio, que une a todos los CTL para ejecutarlos todos juntos.
[oracle@ora01nc001-2 migracion]$ cat ingreso_masivo.sh
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_accounts.ctl data=/u05/migracion/data/OC_ACCOUNTS.DAT log=/u05/migracion/log/oc_accounts.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_activity.ctl data=/u05/migracion/data/OC_ACTIVITY.DAT log=/u05/migracion/log/oc_activity.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_activity_mq.ctl data=/u05/migracion/data/OC_ACTIVITY_MQ.DAT log=/u05/migracion/log/oc_activity_mq.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_addressbookchanges.ctl data=/u05/migracion/data/OC_ADDRESSBOOKCHANGES.DAT log=/u05/migracion/log/oc_addressbookchanges.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_addressbooks.ctl data=/u05/migracion/data/OC_ADDRESSBOOKS.DAT log=/u05/migracion/log/oc_addressbooks.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_fake_user_backend_auth.ctl data=/u05/migracion/data/OC_AMX_FAKE_USER_BACKEND_AUTH.DAT log=/u05/migracion/log/oc_amx_fake_user_backend_auth.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_contacts.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_CONTACTS.DAT log=/u05/migracion/log/oc_amx_filesharing_contacts.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_templates.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_TEMPLATES.DAT log=/u05/migracion/log/oc_amx_filesharing_templates.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_templates_media.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_TEMPLATES_MEDIA.DAT log=/u05/migracion/log/oc_amx_filesharing_templates_media.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_gallery_myalbums.ctl data=/u05/migracion/data/OC_AMX_GALLERY_MYALBUMS.DAT log=/u05/migracion/log/oc_amx_gallery_myalbums.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_gallery_myalbums_files.ctl data=/u05/migracion/data/OC_AMX_GALLERY_MYALBUMS_FILES.DAT log=/u05/migracion/log/oc_amx_gallery_myalbums_files.ctl.log
y asi sucesivamente con las 76 tablas.
Una vez ejecutado el script con todos los CTL y los DAT ya estaríamos en condiciones de verificar si se cargaron los datos en nueva base de datos.
En el mismo directorio donde ejecutamos el anterior scripts, vamos a encontrar los archivos BAD que son las fallas que nos dan los sqlLoaderl.
Fin

No hay comentarios:

Publicar un comentario

RMAN - Cuando no se encuentra un archive log --- RMAN-06726: could not locate archived log

  Lo importante en todo esto, es estar dentro del catalogo correspondiente, sino el crosscheck NO FNCIONA !!   oracle backup of logfiles is ...