Linux NFS Backup Server
El otro día mostramos como montábamos un recurso NFS en nuestra NAS Synology. Como era para hacer backup de nuestros servidores linux, que llevan WordPress con Apache y Mysql, hoy os enseño como programar scripts para que cada noche se realicen copias, y ante la pérdida de vuestro servidor no perdáis nada.
Separamos el backup para los ficheros del Apache y para las Bases de Datos Mysql:
Creamos una carpeta para los scripts y para las copias en el recurso:
1 |
mkdir /root/scripts |
1 |
mkdir /mnt/nfs/vhosts |
1 |
mkdir /mnt/nfs/bbdd |
SCRIPT APACHE
Creamos el fichero en la carpeta scripts:
1 |
vi /root/scripts/backupvhosts.sh |
Copiamos este contenido:
1 2 3 4 5 6 7 8 9 |
#!/bin/sh cd /mnt/nfs THEDATE=`date +%d%m%y%H%M` cp -a /var/www/vhosts/ /mnt/nfs/vhosts tar -vczf backup_$THEDATE.tar /mnt/nfs/vhosts gzip -9 /mnt/nfs/backup_$THEDATE.tar find /mnt/nfs -name "backup_*" -mtime +5 -type f -print -exec rm {} \; |
Le damos permisos de ejecución:
1 |
chmod a+x /root/scripts/backupvhosts.sh |
SCRIPT BASES DE DATOS (MYSQL)
Creamos el fichero
1 |
vi backup_basesdedatos.sh |
Y le damos este contenido que modificaremos según las bases de datos que tengamos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# Uso: # El script nos hace un listado de todas las base de datos del servidor MySQL # especificado en HOST y crea una copia de seguridad para cada # una de ellas almacenándolas en el directorio especificado en # BACKDIR. Modifique cada variable según sus necesidades. Puede # ejecutar el script de forma manual o como tarea programada HOST='localhost' # # Usuario MySQL # USER='root' # # Contraseña # PASSWD='contraseña' # # Directorio hacia donde se van a guardar las copias de seguridad # BACKDIR='/mnt/nfs/bbdd' # # Añadimos fecha a los ficheros FECHA=$(date +%Y%m%d) # Excluye las bases de datos que contengan las palabras: # backup, bkup, bakup, bckup, bck, salva, copy, prueba # y las que terminan en old. # # Modifique esta opción según sus necesidades # EXCLUDE_PATTERN='b(ac)?kup|salva|bck|^old|old$|copy|prueba' # # Recupera las bases de datos # DBS=$(mysql -u $USER -h $HOST -p$PASSWD -Bse 'show databases' | egrep -v $EXCLUDE_PATTERN) # # Crea las copias de seguridad para cada base de datos # for db in $DBS; do FILE="$BACKDIR/$db.$FECHA.sql.gz" mysqldump --opt -u $USER -p$PASSWD --databases "$db" --lock-tables=false | gzip -9 > "$FILE" done # Guardaremos 5 copias de cada find /mnt/nfs/bbdd/$db.* -mtime +5 -exec rm {} \; |
Podríamos hacer un backup de todas nuestras bases de datos directamente con este script:
1 |
mysqldump -u[usuario] -p[contraseña] --all-databases > /mnt/nfs/bbdd/allbd_$fecha.sql | bzip2 /mnt/nfs/bbdd/allbd_$fecha.sql |
Lo copiamos a la carpeta correspondiente:
1 |
cp /root/scripts/backup_basesdedatos.sh |
Le damos permisos de ejecución:
1 |
chmod a+x /root/scripts/backup_basesdedatos.sh |
Ahora vamos a agregar el script como una rutina del sistema con el cron, para ello digitamos en consola:
1 |
sudo crontab -e |
Y añadimos lo siguiente para que los respaldos se hagan todos los días a las 12:00 de la noche:
1 2 3 |
# m h dom mon dow command 0 0 * * * /root/scripts/backup_basesdedatos.sh 0 0 * * * /root/scripts/backupvhosts.sh |
Comprobamos que el servicio crond está ejecutándose:
[root@SERVIDORBD01 scripts]# /etc/init.d/crond status
Se está ejecutando crond (pid 1510)…
Y le damos permisos en el arranque:
[root@SERVIDORBD01 scripts]# chkconfig crond on
Si se os genera un error de este tipo la solución es editar my.conf, añadir la línea que os muestro, y luego ejecutar un SET:
ERROR: mysqldump: Got errno 32 on write
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@SERVIDORBD01 scripts]# vi /etc/my.cnf <strong>[mysqld] max_allowed_packet = 1G</strong> [root@SERVIDORBD01 scripts]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10389 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql><strong> SET GLOBAL max_allowed_packet = 1024 * 1024 * 1024;</strong> Query OK, 0 rows affected (0.00 sec) mysql> <strong>quit</strong> Bye |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?