Script para crear backups de forma automatizada

Bueno este seria el script a ejecutar. Tenemos que tener en cuenta que es necesario tener montada la un unidad de NAS en una carpeta local y configurar el crontab para que se ejecute cuando consideremos necesario.

#!/bin/bash
# Script de terminal para realizar backups de todas las Bases de Datos de MySQL
# Volcado cada hora al servidor Nas /nasServer/mysql
# Descripcion detallada de los datos:
# Directorio: /nasServer/mysql/yyyy-mm-dd
# Fichero: mysql-DBNAME.2009-07-23-14:23:40.gz
# Ruta completa: /nasServer/mysql/yyyy-mm-dd/mysql-DBNAME.2009-07-23-14:23:40.gz
# -------------------------------------------------------------------------
# GNU GENERAL PUBLIC LICENSE
# Version 3, 29 June 2007
#
# Copyright (C) 2007 Free Software Foundation, Inc.
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
# -------------------------------------------------------------------------
# Ultima actualización: Jul-23-2009 - Asegurarse que NAS esta realmente montado en $NAS
# -------------------------------------------------------------------------
NOW=$(date +"%Y-%m-%d") # Formato yyyy-mm-dd
FILE="" # Uso en el bucle
NASBASE="/nasServer" # Punto de montage de NAS
BAK="${NASBASE}/mysql/${NOW}" # Ruta del directorio backup en $NAS
### Configuración del Server ###
#* Usuario de MySQL *#
MyUser="root"
#* PASSWORD del usuario de MySQL *#
MyPass="PASSWORD"
#* Host de MySQL *#
MyHost="127.0.0.1"
#* Binarios de MySQL *#
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
# Asegurarse que nas esta realmente montado
mount | awk '{ print $3}' |grep -w $NASBASE >/dev/null
if [ $? -ne 0 ]
then
echo "Error: NAS no montado en $NASBASE, por favor monta el Servidor NAS el un direcotio local local y vuelve a intentarlo."
exit 99
fi
### NAS debe montarse de forma avanzada ###
# Se asume que /nasServer esta montado via /etc/fstab
if [ ! -d $BAK ]; then
mkdir -p $BAK
else
:
fi
# Obtener la lista de todas las BBDD
DBS="$($MYSQL -u $MyUser -h $MyHost -p$MyPass -Bse 'show databases')"
# Comenzar volcado de la base de datos una a una
for db in $DBS
do
FILE=$BAK/mysql-$db.$NOW-$(date +"%T").gz
# Comprimir todas los ficheros con gzip.
$MYSQLDUMP -u $MyUser -h $MyHost -p$MyPass $db | $GZIP -9 > $FILE
done

Descarga:

backup_mysql.sh.tar.gz

Importar / Exportar Bases de datos grandes de MYSQL

Sustituiremos [USERNAME] con el nombre de usuario de mysql, [DBNAME] con el nombre de la base de datos, [/path_to_file/DBNAME] con la ruta path y nombre del fichero para el volcado de la base de datos.

Copiar/Exportar base de datos grande

Vamos a crear una fichero comprimido con la base de datos:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Importar base de datos grande

Forma rápida:

gzip -dc [/path_to_file/DBNAME].sql.gz | mysql -u [USERNAME] -p [DBNAME]

O

gunzip -c [/path_to_file/DBNAME].sql.gz | mysql -u [USERNAME] -p [DBNAME]

Forma mas rustica:

Primero descomprimimos la base de datos:

gzip -d [/path_to_file/DBNAME].sql.gz

Nos conectamos a mysql:

mysql -u [USERNAME] -p

Continuamos mostrando las base de datos, borramos, creamos, elegimos base de datos añadimos fichero:

SHOW DATABASES;
DROP DATABASE [DBNAME];
CREATE DATABASE [DBNAME];
USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Condiciones de volcado

Volcado con excepciones de tablas, en este caso búsquedas.

mysqldump -u [USERNAME] -p [DBNAME] --ignore-table=[DBNAME].index_busqueda | gzip > [/path_to_file/DBNAME].sql.gz

Creamos lo backup solo con las tablas sin informacion:

mysqldump -u [USERNAME] -p [DBNAME] --no-data | gzip > [/path_to_file/DBNAME].info.sql.gz

Creamos la copia incluyendo solo los datos de las tablas que necesitemos.

mysqldump -u [USERNAME] -p [DBNAME] --no-create-info --ignore-table=[DBNAME].search_index --ignore-table=[DBNAME].cache --ignore-table=[DBNAME].cache_block --ignore-table=[DBNAME].cache_content --ignore-table=[DBNAME].cache_filter --ignore-table=[DBNAME].cache_form --ignore-table=[DBNAME].cache_menu --ignore-table=[DBNAME].cache_mollom --ignore-table=[DBNAME].cache_page --ignore-table=[DBNAME].cache_pathdst --ignore-table=[DBNAME].cache_pathsrc --ignore-table=[DBNAME].cache_views | gzip > [/path_to_file/DBNAME].data.sql.gz;

Omitir aquellas tablas que contengas cache_:

mysqldump -u [USERNAME] -p [DBNAME] --no-create-info --ignore-table=[DBNAME].search_index --ignore-table=[DBNAME].cache% | gzip > [/path_to_file/DBNAME].data.sql.gz;

Eliminar las tablas, para realizar un import limpia:

mysqldump -u [USERNAME] -p [DBNAME] --add-drop-table | gzip > [/path_to_file/DBNAME].sql.gz

Referencia: http://codex.wordpress.org/Backing_Up_Your_Database

Recuperar partición raid 1 en Ubuntu

Bueno antes de nada tenemos que saber que una unidad esta mal, como es esto posible pues ejecutando lo siguiente:

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
312174976 blocks [2/1] [_U]
[==========>..........] recovery = 54.1% (168931264/312174976) finish=47.6min speed=50123K/sec
md0 : active raid1 sda1[0] sdb1[1]
393472 blocks [2/2] [UU]
unused devices: <none>

*Este caso se esta recuperando la unidad.

La parte md1 no esta bien ya que se que la unidad sdb2 no esta sincronizada.

Si realizamos esta consulta veremos los errores que nos devuelve:

dmesg | grep md

Recuperar unidad

Actualización: en Debian mdadm esta en /sbin/mdadm

sudo /sbin/mdadm /dev/md1 -a /dev/sdb2
mdadm: re-added /dev/sdb2

Y consultamos el estado:

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
312174976 blocks [2/1] [_U]
[============>........] recovery = 62.5% (195145600/312174976) finish=36.6min speed=53148K/sec
md0 : active raid1 sda1[0] sdb1[1]
393472 blocks [2/2] [UU]
unused devices: <none>

También se puede consultar de la siguiente forma:

mdadm --detail /dev/md1

Referencia:

http://osl.ull.es/node/174

http://ubuntuforums.org/showthread.php?t=43408

Howto: crear backups de MySQL automáticas con cron

Como mas de una vez en los desarrollos hemos tenido que realizar backups de las bases de datos, esta vez proponemos el automatizar dicha tarea.

Primero deberemos crear nuestro script que lo realizaremos en Bash, de daremos permisos para que se pueda ejecutar y posteriormente le crearemos un cron en crontab para que se ejecute cada x tiempo. Es necesario el probar que se ejecuta el script y de que al menos en una ocasion realiza la copia correctamente para asegurar su buen funcionamiento.

Crear el script:

sudo nano backup_mysql

Añadimos lo siguiente:


# Backup de la base de datos de mysql nombre_base_datos
fecha=$(date +%Y%m%d)
mysqldump -u usuario -p clave nombre_base_datos > fichero_$fecha.sql
gzip fichero_$fecha.sql

Las copias las realizamos y la comprimimos en gzip.

Le añadimos permisos de ejecución al script:

chmod +x backup_mysql

Ahora añadiremos el script al cron para que se realice con x periodicidad, el formato del cron es el siguiente:

[minutos] [hora] [día] [mes] [dia_de_semana] [comando]

Ejecutamos:

crontab -e

Y en mi caso utilizamos la opción 3, utilizar el editor nano:

0 2 * * 6 /home/keopx/backup_mysql

Esto hace que los sabados a las 2:00 de la mañana realice una copia, esta opción la podremos modificar en caso de que sea necesario. A esto se le podría añadir la opción de hacer las copias de forma remota almacenándolas en otros dispositivos.

Mysqldump

Como ya os imaginareis Mysqldump es una herramienta para realizar copias de seguridad y restauración de la misma.

Comentare algunas de las características mas básicas a la hora de realizar dichas tareas.

Realizar backup de una sola base de datos:

mysqldump -u root -p nombre_base_de_datos > fichero.sql

Restaurar esa base de datos, haríamos lo siguiente:

mysql -u root -p nombre_base_de_datos < fichero.sql

Si queremos realizar un backup de todas las bases de datos:

mysqldump -u root -p --all-databases > fichero.sql

Y si solo queremo hacer backup de un par de bases de datos:

mysqldump -u root -p --databases base_datos1 base_datos2 > fichero.sql

Para realizar backup de una sola tabla, dentro de una base de datos:

mysqldump -u root -p base_datos tabla > fichero.sql

Para saber mas:

mysqldump --help

Backups:

Realizar copias de

/var/lib/mysql

De esta forma copiaremos todos los ficheros de MySQL de forma que podremos restaurar todos los ficheros, también se podría realizar una backup de los ficheros de configuración que están en

/etc/mysql/

Automatizar las tareas de backup: para ello bastaría con configurar el cron que solicite el script que hemos generado para que realice las operaciones necesarias.