viernes, 18 de mayo de 2012

Copias de seguridad mysql

Voy a estrenar mi blog con esta entrada.
En mi trabajo, siempre es necesario disponer de copias de seguridad de las bases de datos mysql que se utilizan en las páginas web de la empresa y las bases de datos de consulta interna de clientes. En cualquier sistema en producción es más que aconsejable hacerlas de una manera periódica.
Voy a contar lo que se desde un sistema operativo tipo linux, ya que son los más utilizados en los sistemas en producción.

Haciendo copias de seguridad:
Yo no soy un experto en bases de datos, pero dentro de la poca experiencia que tengo, me ha tocado aprender a hacer copias de seguridad frecuentemente.
Para hacer un volcado de una base de datos mysql a un fichero de texto .sql del cual posteriormente podremos re-introducir en otra base de datos, haremos lo siguiente:
Sin entrar al cliente mysql, desde terminal podemos hacer una copia completa de la estructura y contenido de una base de datos.
(Lo siguiente que describo es suponiendo usuario root y sin contraseña, más abajo indico como introducir contraseña y otro usuario)

Copia completa de una base de datos
mysqldump nombre_base_datos > fichero_salida.sql

Si queremos solo determinadas tablas de la base de datos:
mysqldump nombre_base_datos tabla1 tabla2 ... > fichero_salida.sql

Si queremos salvar más de una base de datos:
mysqldump --databases DB1 DB2 ... > fichero_salida.sql

O si queremos salvar todas las que están en esa máquina:
mysqldump --all-databases

En ocasiones solo queremos un volcado de la estructura de la base de datos y no queremos el contenido almacenado en el. Para ello simplemente escribimos la opción siguiente justo después del mysqldump con cualquiera de las opciones anteriores:

--no-data Por ejemplo mysqldump --no-data nombre_base_datos > fichero.sql Si tenemos clave puesta en la base de datos y/o otro usuario distinto de root, después de mysqldump escribiremos -u nombre_usuario -p al igual que hariamos si nos conectamos al cliente mysql. Recuperando copias de seguridad:
Voy a describir como lo hago yo por ser muy simple:
Lo primero es ir al directorio donde tenemos el dump de la base de datos en un fichero .sql.
Luego abrimos el cliente mysql, si queremos importar una base de datos que no está creada en esa máquina, lo primero es crearla con 

create database nombre_base_datos

Y lo siguiente es escribir

use nombre_base_datos.

Si ya estaba creada de antes simplemente escribimos el último comando.

Ahora simplemente escribimos

source nombre_fichero.sql

y todo importado de nuevo. Programar copias periódicas:
En los sistemas operativos linux, disponemos de una herramienta muy sencilla y eficaz de urilizar, el cron. En muchas distribuciones como debian y ubuntu viene instalado por defecto.
Cron nos permite ejecutar una tarea a una determinada hora, podemos ver las tareas que van a ser ejecutadas en el fichero /etc/crontab con cualquier editor de textos como vi. Ahí mismo podemos añadir la tarea, aunque lo más correcto es añadir nuestro script en una de las carpetas destinadas a tal fin /etc/cron.hourly /etc/cron.daily /etc/cron.monthly, etc en funcion de la periodicidad de ejecución del script.

En el script habrá que añadir las tareas que necesitemos, por ejemplo si queremos hacer una copia de seguridad de una base de datos mysql llamada prueba y guardarlo en /home/pepito/copiasSeg, escribiremos en el script:

mysqldump prueba > /home/pepito/copiasSeg/prueba.sql

En otra entrada quizás me extienda un poco más con cron y con el tema de las copias de seguridad, pues ya que hacemos una copia de seguridad, ¿porque no guardarla en otro ordenador en red? para ello simplemente tendremos que montar una carpeta compartida en samba de otro pc de la red y pasar ahí todo lo que necesitemos, incluso a otro pc que no está en la misma red.

De momento dejo aquí unos enlaces que me han servido de referencia a mi en más de una ocasión y también para escribir esta entrada:

http://www.linuxtotal.com.mx/index.php?cont=info_admon_006
http://dev.mysql.com/doc/refman/5.0/es/batch-mode.html
http://dev.mysql.com/doc/refman/5.0/es/mysqldump.html