Teléfono y Whatsapp: 675 18 68 80

Migrar bases de datos de diferentes esquemas en MySQL

Estoy en situación de migrar una web que programé por mi cuenta años atrás, con mis propias tablas para almacenar información a WordPress. Si tuviese 5 o 10 entradas, la migración se podría hacer a mano sin ningún problema, pero el problema viene cuando ya tengo más de 2000 entradas. Es necesario la integración de un script que automatice esta ardua tarea.

migración

No voy a entrar en PHP, (cadenas de conexión a la base de datos, etc) sino en MySQL. Este código que pongo a continuación es un ejemplo muy básico en el que se modifica el tipo de dato de un campo, se elimina una tabla existente y se migran datos a partir de una consulta. También se reemplazan cadenas con funciones de MySQL.

<?php
 
function conectar_origen(){
    $host = "host";
    $usuario = "usuario";
    $contrasenya= "pass";
    $db = "database";
    $enlace = mysql_connect($host,$usuario,$contrasenya) or die("No pudo conectarse a la base de datos por: " . mysql_error());
    if (!$enlace) {
        die('No conectado : ' . mysql_error());
    }
    $seldb = mysql_select_db($db,$enlace);
    if (!$seldb) {
        die ('No se puede seleccionar la base de datos: ' . mysql_error());
    }
    return $enlace;
}
 
function desconectar($conexion){
    mysql_close($conexion);
}
 
function consulta($sql){
    $res = mysql_query($sql) or die ("No se pudieron obtener datos en la consulta por: ".mysql_error());
    return $res;
}
 
 
//ORIGEN DE DATOS:
$link_origen= conectar_origen();
 
//QUITAR AUTO INCREMENT DE NOTICIA.
consulta("ALTER TABLE noticia MODIFY COLUMN id_noticia smallint(6);");
 
//ELIMINAR LA TABLA ANTERIOR.
consulta("TRUNCATE TABLE noticia;");
 
//MIGRACION DE DATOS
if(consulta("INSERT INTO noticia(id_noticia, titulo, url, url_video, url_foto, descripcion, fecha, visitas, hd) SELECT id_dia_noticia, titulo, url, REPLACE(url_video, 'cadena1', 'cadena2'), REPLACE(url_foto, 'cadena1', 'cadena2'), descripcion, fecha, visitas, 'NO' FROM dia_noticia WHERE fecha >'2010-09-01';")){
	printf("NOTICIAS MIGRADAS CON EXITO\n");
}
 
//CONTINUARIA...
desconectar($link_origen);
?>

diferentes bases de datos

Puede ser que haya tablas que queramos migrar que estén en diferentes bases de datos (noticia en basededatos1 y dia_noticia en basededatos2), para ello habría que comentar el código anterior:

$seldb = mysql_select_db($db,$enlace);
if (!$seldb) {
   die ('No se puede seleccionar la base de datos: ' . mysql_error());
}

e indicar antes del nombre de cada tabla la base de datos a la que pertenece:

if(consulta("INSERT INTO basededatos1.noticia(id_noticia, titulo, url, url_video, url_foto, descripcion, fecha, visitas, hd) SELECT id_dia_noticia, titulo, url, REPLACE(url_video, 'cadena1', 'cadena2'), REPLACE(url_foto, 'cadena1', 'cadena2'), descripcion, fecha, visitas, 'NO' FROM basededatos2.dia_noticia WHERE fecha >'2010-09-01';")){
	printf("NOTICIAS MIGRADAS CON EXITO\n");
}

  • walo

    Efectivamente, nosotros hemos realizado varias migraciones y hay que tener claro como es la base de datos de WordPress. Lleva bastante tiempo. Si ves que no puedes, nos dices y lo presupuestamos.