Backup en MySQL

Este método es idóneo para servidores que pueden permitirse un downtime en algún momento del dÃa, de este modo programarse el backup mediante CRON a una hora prudente y nadie se enterará de lo ocurrido.
A continuación como backupear y restaurar la base de datos.
Backup de todas las bases de datos:
mysqldump -A -uroot -p'XXXX' > DB.sql mysql -uroot -p'XXXX' < DB.sql
Solo una base de datos:
mysqldump DB -uroot -p'XXXX' > DB.sql mysql -uroot -p'XXXX' < DB.sqlSolo una tabla(se puede restaurar en otra base de datos si es necesario):
mysqldump -u root -p'XXXX' DB TABLA > TABLA.sql mysql -u root -p'XXXX' DB < TABLA.sqlBackUp solo de la estructura:
mysqldump --no-data DB -uroot -p'XXXX' > ESTRUC.sql mysql -u root -p'XXXX' DB < ESTRUC.sqlNOTA: Si solo se quiere restaurar una tabla hay que hacer un workaround grepeando las sentencias de inserción que impliquen dicha tabla.
grep 'INSERT INTO `TABLA`' DB.sql > DB_REDUCED.sql mysql DB -uroot -p'XXXX' < DB_REDUCED.sqlSi andamos cortos de espacio en el servidor MySQL podemos enviar el dump directamente por red:
mysqldump DB -u root -p'XXXX' | gzip -c | ssh root@IP 'cat > ~/DB.sql.gz'
O incluso insertar directamente:
mysqldump DB -uroot -p'XXXX' | ssh root@IP 'cat | mysql DB -uroot -p'XXXX''Si queremos programar el trabajo digamos a las 12:00 de la noche:
crontab -e 00 00 * * * mysqldump -A -uroot -p'XXXX' > DB.sql
Siguiendo con la lÃnea de artÃculos sobre backups en MySQL vamos a explicar como realizar los backups mediante extracción de datos de las tablas ya que mediante el método tradicional es un proceso muy lento.
En este caso vamos a seguir otra estrategia, esta consistirá en bloquear mediante iptables el tráfico a la base de datos y extraer los datos tabla por tabla. Los scripts están pensados para sacar una imagen desde un slave ya existente y enganchar otro slave desde este punto, si quisieramos sacar los datos de un master deberÃamos de modificar la lÃnea SHOW SLAVE STATUS por SHOW MASTER STATUS.
NOTA: Algo muy importante a la hora de sacar una imagen de uno de los servidores es no dumpear ni restaurar las vistas ya que provocarán que el dumpeo lleve mas tiempo y el restore puede terminar rompiendo la intergridad de los datos de la tabla.
Primero filtraremos mediante iptables:
iptables -I INPUT 1 -p tcp --dport 3306 -j REJECT iptables -I OUTPUT 1 -p tcp --sport 3306 -j REJECTEl script de backup será el siguiente:
#! /bin/bash clear echo -e "----------------------------------------" echo -e "| Script BackUp Table based by Kr0m |" echo -e "----------------------------------------" U="root" P="XXXX" PATH="/home/backup/mysql" /bin/mkdir -p $PATH 2>/dev/null /bin/chown -R mysql:mysql $PATH # clean old backup echo -e "-- Removing old backups" /bin/rm -rf $PATH/* echo -e "++ Done" #exit echo -e "-- Stopping Slave syncronization" /usr/bin/mysql -u$U -p$P -sre "stop slave" echo -e "++ Done" /usr/bin/sleep 1 echo -e "-- Getting Master Position" POS=$(/usr/bin/mysql -u$U -p$P -sre "show slave status\G;") echo "$POS" > $PATH/master.pos echo -e "++ Done" echo -e "-- Copying server config file" /bin/cp /etc/mysql/my.cnf $PATH/ echo -e "++ Done" VISTAS=$(/usr/bin/mysql -u$U -p$P mysql -sre "select table_name from information_schema.tables where table_type='VIEW';") for DB in $(/usr/bin/mysql -u$U -p$P -sre 'show databases'); do if [ $DB != "performance_schema" ] && [ $DB != "information_schema" ] && [ $DB != "mysql" ] && [ $DB != "tmp" ]; then echo -e "---------------------" echo -e "-- Dumping structure for database: $DB" /bin/mkdir -p $PATH/$DB /bin/chown -R mysql:mysql $PATH/$DB /usr/bin/mysqldump -u$U -p$P $DB -d --opt > $PATH/$DB/$DB.sql TABLES=$(/usr/bin/mysql -u$U -p$P $DB -sre "show tables" ) for TABLE in $TABLES; do esvista=0 for VISTA in $VISTAS do if [ $TABLE = $VISTA ]; then esvista=1 fi done if [ $esvista = 0 ]; then echo -e "-- Dumping Table: $DB-$TABLE" /usr/bin/mysql -u$U -p$P $DB -sre "set unique_checks=0; set foreign_key_checks=0; select * into outfile '$PATH/$DB/$TABLE.dat' from $TABLE;" echo "++ Done" else echo -e "-- Skiping View: $TABLE done." fi done fi done echo -e "---------------------" esvista=0 echo -e "-- Enabling Slave syncronization" /usr/bin/mysql -u$U -p$P -sre "start slave" echo -e "++ Done"
#! /bin/bash clear echo -e "-----------------------------------------" echo -e "| Script Restore Table based by Kr0m |" echo -e "-----------------------------------------" U="root" P='XXXX' PATH="/home/backup/mysql" echo -e "-- Stopping Slave syncronization" /usr/bin/mysql -u$U -p$P -sre "stop slave" echo -e "++ Done" /usr/bin/sleep 1 for DB in $(/bin/ls -l $PATH|/bin/grep -v 'master.pos'|/usr/bin/awk -F " " '{print$9}'); do if [ $DB != "information_schema" ] && [ $DB != "mysql" ] && [ $DB != "tmp" ]; then echo -e "-- Removing old database" /usr/bin/mysql -u$U -p$P -sre 'DROP DATABASE '$DB';' 2>/dev/null echo -e "-- Creating database" /usr/bin/mysql -u$U -p$P -sre 'CREATE DATABASE '$DB' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' echo -e "-- Restoring structure for database: $DB" /usr/bin/mysql -u$U -p$P $DB < $PATH/$DB/$DB.sql VISTAS=$(/usr/bin/mysql -u$U -p$P mysql -sre "select table_name from information_schema.tables where table_type='VIEW';" ) TABLES=$(/usr/bin/mysql -u$U -p$P $DB -sre "show tables") for TABLE in $TABLES; do esvista=0 for VISTA in $VISTAS do if [ $TABLE = $VISTA ]; then esvista=1 fi done if [ $esvista = 0 ]; then echo -e "-- Restoring Table: $DB-$TABLE" /usr/bin/mysql -u$U -p$P $DB -sre "set unique_checks=0; set foreign_key_checks=0; load data infile '$PATH/$DB/$TABLE.dat' IGNORE into table $TABLE" echo "++ Done" else echo -e "-- Skiping View: $TABLE done." fi done fi echo -e "---------------------" done
iptables -D INPUT 1 iptables -D OUTPUT 1De este modo el backup o la puesta en marcha de otro slave será mucho mas rápida que mediante mysqldump ;)
Backup en MySQL
Reviewed by PDFREEBOOK
on
12:06
Rating:

Post a Comment