Copiar varios directorios de Bases de datos MySql a un solo servidor

Mysql LogoTras la muerte de Rigel (Mi PC de desarrollo) tuve que apañarmelas durante un par de meses con la pc que usaba de media center, toco reinstalar el sistema, configurar servidores ajustar las herramientas de desarrollo, etc.

Finalmente hace una semana arme mi nueva pc; compre piezas nuevas, redistribuí algunas viejas, almacene otras y di gracias en mis oraciones a Chthulu por usar linux y tener mis particiones diferenciadas para cada cosa. Sin embargo en estas situaciones siempre surgen detalles escabrosos: stacks de servidores libres de instalación que se niegan a funcionar una vez cambias el disco duro de un pc a otro, reinstalaciones que se resisten, Sutiles diferencias entre versiones de los programas ó del propio Ubuntu, en fin miles de cosas bellas que aparecen para joderte cuando menos lo esperas.

En particular, las dos instancias del servidor MySql que tenia instaladas en el media-center se negaban a arrancar en mi nuevo pc, para cortar por lo sano termine migrando las dos bases de datos a una instalación de mysql por defecto y como no podía hacer dumps tuve hacer copias directa de los directorios.

Para asegurar el éxito de la transferencia de las bases de datos debemos garantizar lo siguiente:

  • misma version de Mysql Server involucrados (no es indispensable pero facilita la vida).
  • integridad de los datos que vamos a transferir (si están corruptos y destrozamos todo nos puede dar un infarto).
  • que el servidor Msql que recibira los datos esta bien instalado y funcionando adecuadamente.
  • En caso que ninguna tabla  use el motor InnoDB Se mezclan los dos directorios que queriamos copiar y se arranca de nuevo el servidor MySql. Pero si algunas tablas usan InnoDB entonces hay información que se guarda en archivos numerados del tipo “ibdata1” y si se sobrescribe el archivo se perderán las tablas Inno del servidorde origen. En ese caso se hace backup del archivo, hacemos un dump de cada base de datos, se sobreescribe ibdata1, arrancamos  el servidor y restauramos los dumps.

Que quede en registro que la mejor forma para migrar una base de datos es hacer un dump desde el propio servidor Mysql de origen… pero si no es posible, hay que buscarse la vida, de modo que pasamos a la consola.


echo "1- Haciendo Backup de los Datos que queremos mover"
sudo cp -R /opt/server/bitnami/mysql/data /tmp/mysql-data-old1
sudo cp -R /opt/server/zend/mysql/var/ /tmp/mysql-data-old2

echo "tomamos precauciones por si se apaga el pc"
sudo mysqldump -uroot -p --all-databases > ~/Escritorio/all_DB_mysql-data_backup.sql

echo "Deteniendo el Servidor Mysql"
sudo stop mysql
sudo cp -R /var/lib/mysql /tmp/mysql-data
sudo mv /var/lib/mysql  ~/Escritorio/Mysql-data

echo "2 sustituimos el directorio de datos del Servidor por el del servidor antiguo"
sudo mv  /tmp/mysql-data-old1 /var/lib/mysql

echo "3 Garantizamos los permisos del servidor"
sudo chown -R mysql /var/lib/mysql/
sudo chgrp -R mysql /var/lib/mysql/
sudo chmod -R 700 /var/lib/mysql/

echo "4 arrancando el Servidor Mysql y restauramos el dump"
sudo start mysql
sudo mysql -u root -p < ~/Escritorio/all_DB_mysql-data_backup.sql 

Como mencione si solo es un directorio de datos ó si son varios y no hay Tablas que usen InnoDB eso es todo, borramos lo que sobro en el escritorio y listo. Si tenemos tablas con InnoDB en varios de los servidores que estamos mezclando como en mi caso gracias a magento… mi querido magento, repetimos el proceso, siguiendo con mi caso particular:

 
echo " Volcamos las bases de datos ya mezcladas (en mi caso la del servidor de destino+bitnami)"
sudo mysqldump -uroot -p --all-databases > ~/Escritorio/all_DB_mysql-data-mix_backup.sql

echo "6 respaldamos de nuevo"
sudo stop mysql
sudo cp -R /var/lib/mysql /tmp/mysql-data-mix
sudo mv /var/lib/mysql ~/Escritorio/Mysql-data-mix

echo "7 sustituimos el directorio de datos del Servidor por el que nos queda"
sudo mv  /tmp/mysql-data-old2 /var/lib/mysql

echo "8 Garantizamos los permisos del servidor de nuevo"
sudo chown -R mysql /var/lib/mysql/
sudo chgrp -R mysql /var/lib/mysql/
sudo chmod -R 700 /var/lib/mysql/

echo "9 arrancando el Servidor Mysql y restauramos el dump"
sudo start mysql
sudo mysql -u root -p < ~/Escritorio/all_DB_mysql-data-mix_backup.sql

echo "10 Eso es todo, verificamos que todo haya marchado bien y limpiamos el escritorio"
sudo rm -iv ~/Escritorio/*.sql
sudo rm -iv ~/Escritorio/Mysql-data*

Es posible que en algún momento del proceso nos topemos con que los servidores tenían claves distintas para root y no recordamos la clave pertinente, por suerte no fue mi caso, pero puede ocurrir y solo por precaución es bueno saber como restaurar la contraseña de MySql.

Leave a Reply

Your email address will not be published. Required fields are marked *

Comments