Archive for the ‘MySQL’ category

Backup de MySQL mediante consola/comandos

Mayo 24th, 2010

¿Por qué mysqldump?

Yo siempre he hecho las copias de mis bases de datos mediante la opción que da PHPMyAdmin para exportar los datos. Pero cuando una base de datos alcanza un tamaño considerable el exportador de PHPMyAdmin se queda corto ya que PHP no puede procesar toda la información.

En ese momento, hay que pasar a hacer las copias de seguridad mediante los comandos que MySQL nos proporciona. Este método es un poco más tedioso ya que no hay interfaz gráfica como en PHPMyAdmin pero realmente hay 4 opciones y son bastante facilitas.

El programa que nos propociona MySQL se llama mysqldump. Éste comando se encarga de acceder a las base de datos que le indiques y sacarte por la salida estándar el código SQL del backup.

Uso de mysqldump

Tiene muchas opciones (para verlas todas escribe man mysqldump en la consola) pero las que más nos interesan son:

  • opt: Esta opción es un popurrí de otras opciones. Lo que hace es añadir al código SQL del backup las ordenes de borrar las tablas si existen con anterioridad, bloquea las tablas para que el backup sea más rápido, escribe en los CREATE TABLE las opciones específicas de cada tabla, hace las inserciones en pocas líneas para que el archivo ocupe menos y se haga más rápido el backup y utiliza las opciones de backup rápido. En definitiva esta opción es muy recomendable ya que te ahorra poner muchas otras opciones y consigue que el backup se haga de la manera más rápida posible.
  • user: Esta opción indica a mysqldump el usuario con el que accederá a la base de datos para hacer el backup.
  • password: Indica el password a mysqldump.
  • host: Indica la dirección donde está la base de datos.

Imaginemos que tengo una base de datos en mi servidor (servidorficticio.com) que se llama base_de_datos_de_prueba. En ella tienen privilegios para leerla y modificarla el usuario jorge con la contraseña mi_nombre_es_jorge. Ahora existen dos opciones: que me pueda conectar al servidor por SSH o que no me dejen.

En el caso de poder conectarme por SSH debería de identificarme en servidorficticio.com y escribir en la línea de comandos:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

En cambio, si no te dan la opción de conectarte por SSH tendrás que utilizar la opción host y ejecutar la orden desde tu ordenador. El comando que tendrías que escribir sería muy parecido:

mysqldump --opt --host=dominioficticio.com --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

En ambos casos se creará un archivo backup_base_de_datos_de_prueba.sql que contendrá el backup completo de la base de datos.

Backup de más de una base de datos

Ahora tenemos las bases de datos: base_de_datos_de_prueba1 y base_de_datos_de_prueba2. Utilizaremos la opción databases:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge --databases base_de_datos_de_prueba1 base_de_datos_de_prueba2 >  backup_multiple.sql

Backup de todas las bases de datos

Para hacer un backup completo de toda la base de datos utilizaremos la opción all-databases:

mysqldump --opt --user=jorge --password=mi_nombre_es_jorge --all-databases > backup_total.sql

Problemas típicos

Alguna vez me ha pasado cuando hacía un backup que mysqldump me mostraba que una tabla había producido el error cuando se intentaba bloquear. Concrétamente el error decía algo así:

mysqldump: Got error: 1105: File './xxxx/tabla_problematica.MYD' not found (Errcode: 24) when using LOCK TABLES

Este problema se puede arreglar facilmente añadiendo a la opción lock-tables e igualándola false para que no intente bloquear las tablas y puedea terminar el backup. Esta modificación lo único que cambia es la velocidad en la que se hará el backup. De forma que el comando quedaría:

mysqldump --opt --lock-tables=false --user=jorge --password=mi_nombre_es_jorge base_de_datos_de_prueba >  backup_base_de_datos_de_prueba.sql

Por último, cuando el backup es muy grande (alrededor del GB) es posible que mysqldump avise de que no puede hacerlo porque supera el tamaño permitido. Para arreglar ésto solo hay que cambiar un valor de la configuración de MySQL: max_allowed_packet.

Ésta variable se encuentra en el archivo de configuración de MySQL my.cnf que normalmente se encuentra en el directorio /etc/mysql. Editamos ese archivo y cambiamos la variable max_allowed_packet a lo que queramos, por ejemplo 200MB (el valor defecto es 16MB)

Nota: Si no sabes dónde está tu archivo de configuración my.cnf puedes ejecutar este comando

find / -name 'my.cnf' 2> /dev/null

Un saludo, espero que os sea útil!