2011-12-09 19 views
5

Necesito un script que haga automáticamente una copia de seguridad de una base de datos MySql. Sé que ya hay muchos posts y scripts sobre este tema, pero aquí es donde el mío difiere.Copia de seguridad automática de la base de datos MySQL en el servidor de Linux

  1. La secuencia de comandos debe ejecutarse en la máquina que aloja la base de datos MySql (es una máquina Linux).
  2. Las copias de seguridad se deben guardar en el mismo servidor en el que se encuentra la base de datos.
  3. Se debe realizar una copia de seguridad cada 30 minutos.
  4. Cuando una copia de seguridad es anterior a una semana, se elimina a menos que sea la primera copia de seguridad creada esa semana. es decir, de estas copias de seguridad backup_1_12_2010_0-00_Mon.db, backup_1_12_2010_0-30_Mon.db, backup_1_12_2010_1-00_Mon.db ... backup_7_12_2010_23-30_Sun.db etc. solo se guarda backup_1_12_2010_0-00_Mon.db.

¿Alguien tiene algo similar o alguna idea de por dónde empezar?

+11

** NUNCA ** coloque la copia de seguridad en la máquina de producción. Si su servidor de producción muere, su copia de seguridad también se habrá ido. – ajreal

Respuesta

7

Haciendo casi lo mismo que muchas personas.

  1. El guión tiene que ejecutar en la máquina que aloja la base de datos MySQL (Es una máquina Linux).
    => Crea una fiesta o Perl script local (o lo que sea) "miscript" en este equipo "A"

  2. Las copias de seguridad deben guardarse en el mismo servidor que la base de datos está activada.
    => en el script "myscript", solo puede usar mysqldump. Desde la copia de seguridad local, puede crear un tarball que envíe a través de scp a su máquina remota. Finalmente, puede colocar su secuencia de comandos de respaldo en el crontab (crontab -e).

Algunos consejos y funciones para empezar, ya que no a publicar toda mi guión, no lo hace totalmente el truco, pero no muy lejos:

#!/bin/sh 
... 
MYSQLDUMP="$(which mysqldump)" 
FILE="$LOCAL_TARBALLS/$TARBALL/mysqldump_$db-$SNAPSHOT_DATE.sql" 
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE && $GZIP $GZ_COMPRESSION_LEVEL $FILE 

function create_tarball() 
{ 
local tarball_dir=$1 
tar -zpcvf $tarball_dir"_"$SNAPSHOT_DATE".tar.gz" $tarball_dir >/dev/null 
return $? 
} 

function send_tarball() 
{ 
local PROTOCOLE_="2" 
local IPV_="4" 
local PRESERVE_="p" 
local COMPRESSED_="C" 
local PORT="-P $DESTINATION_PORT" 
local EXECMODE="B" 

local SRC=$1 
local DESTINATION_DIR=$2 
local DESTINATION_HOST=$DESTINATION_USER"@"$DESTINATION_MACHINE":"$DESTINATION_DIR 

local COMMAND="scp -$PROTOCOLE_$IPV_$PRESERVE_$COMPRESSED_$EXECMODE $PORT $SRC $DESTINATION_HOST &" 

echo "remote copy command: "$COMMAND 
[[ $REMOTE_COPY_ACTIVATED = "Yes" ]] && eval $COMMAND 

} 

continuación para eliminar los archivos mayores de "fecha", puede mirar hombre encontrar y centrarse en el mtime y más nuevas opciones.

Editar: como se dijo anteriormente, no hay un interés particular en hacer una copia de seguridad local, excepto un archivo temproray para poder enviar un tarball fácilmente y eliminarlo cuando se envíe.

6

Puede hacer casi todo esto con una tarea programada de una línea configurado para ejecutarse cada 30 minutos:

mysqldump -u<user> -p<pass> <database> > /path/to/dumps/db.$(date +%a.%H:%M).dump 

Esto creará una base de datos de volcado cada 30 minutos, y cada semana va a empezar a sobrescribir el anterior vertederos de la semana.

Luego tenga otro cronjob que se ejecute una vez a la semana y que copie el volcado más reciente en una ubicación separada donde está guardando instantáneas.

13

respuesta: Un cron

Descripción:

intente crear un archivo con este something.sh:

#!/bin/sh 
mysqldump -u root -p pwd --opt db1.sql > /respaldosql/db1.sql 
mysqldump -u root -p pwd --opt db2.sql > /respaldosql/db2.sql 
cd /home/youuser/backupsql/ 
tar -zcvf backupsql_$(date +%d%m%y).tgz *.sql 
find -name '*.tgz' -type f -mtime +2 -exec rm -f {} \; 

Dar el permiso adecuado para el archivo

chmod 700 mysqlrespaldo.sh 

o

sudo chmod 700 something.sh 

y luego crear un cron con

crontab -e 

configurarlo como

**0 1 * * *** /home/youruser/coolscripts/something.sh 

Recuerde que los números o caracteres '*' tienen esta estructura:

Minutes (range 0-59) 
Hours (0-23) 
Day of month (1-31) 
Month (1-12) 
Day of the week (0-6 being 0=Domingo) 
Absolute path to script or program to run 
+3

De hecho, soltaría el script (o un enlace simbólico a él) en una de las carpetas /etc/cron.daily si su distribución lo admite en lugar de agregar específicamente una línea al crontab maestro. – Nick

+0

@Nick Aquí hay un +1 para usted. – Alfabravo

5

Crear un script como el siguiente:

#!/bin/bash 
mysqldump -u username -p'password' dbname > /my_dir/db_$(date+%m-%d-%Y_%H-%M-%S).sql 
find /mydir -mtime +10 -type f -delete 

Reemplazar nombre de usuario, contraseña y el directorio de copia de seguridad (mi_dir). Guardarlo en un directorio (shell_dir) como filename.sh

programarlo para que se ejecute todos los días usando crontab -e gustaría:

30 8 * * * /shell_dir/filename.sh 

Esto ejecutará todos los días a las 8:30 AM y copia de seguridad de la base de datos. También elimina la copia de seguridad que es anterior a 10 días. Si no quieres hacer eso, simplemente borra la última línea del script.

1

Mi preferencia es para AutoMySQLBackup que viene con Debian. Es realmente fácil y crea copias de seguridad diarias, que se pueden configurar. Además, almacena una copia de seguridad semanal y luego una mensual también.

¡He tenido esto funcionando por un tiempo y es muy fácil de configurar y usar!

Cuestiones relacionadas