martes, 13 de enero de 2015

Migrar una base de datos MySQL de un servidor a otro

Para pasar la base de datos de un servidor a otro, lo más sencillo es crear un fichero SQL que enviaremos al servidor de destino mediante SCP.
  1. Crear backup en servidor de origen:
    mysqldump -u root -p --opt base_de_datos > base_de_datos.sql
  2. Copiar backup al servidor de destino:
    scp -P puerto base_de_datos.sql usuario@servidor:~/
    "-P puerto" se puede omitir si usas el puerto por defecto de SSH.
    La copia en este caso se realiza al home del usuario (~/)
  3. Restaurar backup en servidor de destino:
    mysql -u root -p base_de_datos < base_de_datos.sql
Durante el proceso de restauración podemos abrir una sesión de MySQL (mysql -u root -p) y ejecutar show processlist; para ver qué sentencias va ejecutando, y así poder saber en qué punto de la restauración se encuentra.

Si vamos a restaurar una base de datos de tamaño considerable, podemos modificar algunas variables de /etc/mysql/my.cnf para conseguir un rendimiento mayor. En mi caso, en un servidor con 4GB de RAM, he conseguido reducir el tiempo de restauración de un backup, de 5GB, de 1 hora y 30 minutos a sólo 11 minutos. Estos son los ajustes realizados:

key_buffer_size                 = 1G
innodb_buffer_pool_size         = 1G
innodb_log_file_size            = 256M
innodb_flush_method             = O_DIRECT
innodb_flush_log_at_trzx_commit = 2

En mi caso, key_buffer_size aparecía en my.cnf como key_buffer.
Para cambiar el valor de innodb_log_file_size has de parar MySQL y borrar los ficheros de log (/var/lib/mysql/ib_logfile0, /var/lib/mysql/ib_logfile1...). En lugar de borrarlos, muévelos a una carpeta temporal y bórralos cuando te asegures que MySQL vuelve a iniciar correctamente tras modificar el valor de dicha variable.
Usa el valor 2 en innodb_flush_log_at_trzx_commit sólo para agilizar la restauración. Una vez terminada, deja su valor tal y como estaba.

Una vez hechos los cambios en my.cnf, reinicia MySQL. Puedes comprobar que has asignado correctamente los valores abriendo una sesión de mysql en el terminal y ejecutando show variables like '%nombre_variable%'; 

No hay comentarios:

Publicar un comentario