Este script nos permite hacer dumps a las bases de un servidor Mysql.
La ventaja que posee este script es que cuando se sube una base nueva al servidor, no debemos preocuparnos por el dumps, ya que el script a través de utilizar vectores tiene la capacidad de detectar los cambios automáticamente.
Acá les dejo una somera descripción de su funcionamiento:
1.- Variables para conectar al servidor de Mysql
host="xxx.xxx.xxx.xxx"
user=user
pass=pasword
2.- Genero un vector para los argumentos de Mysql
Vector Argumento (args) de comandos MysqlVectores
Vector lineal (base1 base2 base3)
Posición Elementos del vector 0 1 2
Opcion 1:
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")
Opcion 2:
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --single-transaction ")
3.- Variable para determinar la Fecha y Hora que luego la utilizo para el nombre del dump
datetime=$(date +%Y%m%d)
4.- Variable donde determino el nombre del archivo por el cual después genero el vector
filename=arrays
5- Declaro al vector
declare -a array1
6.- Genero el archivo declarado arriba
mysqlshow ${args[0]} > $filename
7.- Archivo array como lo genera mysqlshow
+--------------------------+
Databases
+--------------------------+
information_schema
base1
base2
base3
.......
+---------------------------+
8.- Variables para el limite inferior y superior del vector
8.1.- Limite inferior del Vector array1
a=0
8.2.- Limite Superior del Vector array1
Cuento las palabras, los sed y el tr los utilizo para sacar los caracteres "+", "|" , el titulo "Database" y la Base "information_schema". La variable counts tiene sentido para utilizar un vector lineal dinámico, gracias al archivo que genero con la consulta que hago con mysqlshow.
counts=(` cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
9.- Leo el archivo y le deleteo todo aquello que no me sirve
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'`)
10.- Genero un vector dinamico
while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime.sql # Permite ver en tiempo real lo que esta haciendo dump
mysqldump ${args[1]} ${array1[$a]} > ${array1[$a]}-$datetime.sql
let a+=1 # Contador que utilizo para recorre el vector
done
echo
exit 0
El script con la "Opción 1" de la variable "args" quedaría así:
#!/bin/bash
declare -a array1
host="xxx.xxx.xxx.xxx"
user=user
pass=password
datetime=$(date +%Y%m%d)
filename=/var/local/arrays
pathbkp=/var/local/dumps
a=0
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")
mysqlshow ${args[0]} > $filename
counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'` )
while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime.sql
mysqldump ${args[1]} ${array1[$a]} > $pathbkp/${array1[$a]}-$datetime.sql
let a+=1
done
echo
exit 0
--------------------------------------------------------------------------------------------------------------------------
Cuarta Version del Script
He realizado una cuarta version, haciendo que los dumps de cada base sean comprimidos en un solo archivo logrando una mejor administracion de espacio en disco, ademas agregue un dump full que tambien se comprime.
El directorio donde queda alojado el archivo tar comprimido de los dumps de la base se denomina
/var/local/dumps/BKPSQL/SQL y el archivo es:
tarBKPSQLFULL-20161104-140201.tar.gz -> 20161104-140201 esto indica fecha y hora de realizado
El directoria donde se guarda el dunps FULL es:
/var/local/dumps/BKPSQL/FULL
y su archivo tar es:
Bases-20161104-085201.tar.gz --> -20161104-085201 esto indica fecha y hora de realizado
SCRIPT
## BEGIN CONFIG ##
datetime=$(date +%Y%m%d-%H%M%S)
host=10.0.48.160
user=dumps
pass='mysql2011'
pathbkp=/var/local/dumps
logdir=$pathbkp/LOG
filename=$logdir/arrays.file
BKPFULL=$pathbkp/BKPSQL/FULL
TMPSQLFULL=$pathbkp/TMPBKPSQL
BKPSQL=$pathbkp/BKPSQL/SQL
TMPSQL=$TMPSQLFULL/SQL
TMPFULL=$TMPSQLFULL/FULL
## END CONFIG ##
## FUNCTION ##
function CrearDirectory(){
if [ ! -d $pathbkp ];
then
mkdir -p $TMPSQLFULL/FULL
mkdir -p $pathbkp/BKPSQL/FULL
mkdir -p $pathbkp/BKPSQL/SQL
chown -R mysql.mysql $pathbkp
chmod -R 755 $pathbkp
touch $pathbkp/LOG/arrays.file
else
mkdir -p $TMPSQLFULL/SQL
mkdir -p $pathbkp/LOG
mkdir -p $pathbkp/BKPSQL
mkdir -p $pathbkp/TMPBKPSQL
chown -R mysql.mysql $pathbkp
chmod -R 755 $pathbkp
touch $pathbkp/LOG/arrays.file
fi
}
function DumpsMysql(){
a=0
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --single-transaction --opt --flush-logs " )
args2="-h $host -u $user -p$pass --single-transaction --events --all-databases"
mysqlshow ${args[0]} > $filename
counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'` )
while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime.sql
mysqldump ${args[1]} ${array1[$a]} > $TMPSQL/${array1[$a]}-$datetime.sql
if [ "$?" != "0" ]; then
echo $TMPSQL/${array1[$a]}-$datetime.sql - $datetime "No se realizo Dumps" >> $logdir/dumps-error.log
else
echo $TMPSQL/${array1[$a]}-$datetime.sql - $datetime "Se realizo Dumps" >> $logdir/dumps-exito.log
fi
let a+=1
done
mysqldump $args2 > $TMPFULL/Bases-$datetime.sql
rm -f $filename
}
function DumpZip(){
tar -zcvf $BKPSQL/tarBKPSQLFULL-$datetime.tar.gz $TMPSQL/*.sql
tar -zcvf $BKPFULL/Bases-$datetime.tar.gz $TMPFULL/Bases-*
#ls -ltr * | grep "tarBKPSQLFULL" | awk '{print $9}' | xargs cp -rpt $TMPSQL/*.sql
rm -rf $TMPFULL/*.sql
rm -rf $TMPSQL/*.sql
}
## END FUNCTIONS ##
CrearDirectory $pathbkp $TMPSQLFULL
DumpsMysql $datetime $filename $TMPSQL
DumpZip $BKPSQL $BKPFULL $datetime $TMPSQL $TMPFULL
exit 0
------------------------------------------------------------------------------------------------------------------------
Tercera Version del SCRIPT
Mejoras:
- No borra mas los dumps anteriores, los diferencia con la hora.
#!/bin/bash
declare -a array1
declare -a counts
## BEGIN CONFIG ##
host=XX.XX.XX.XX
user=dumps
pass='password'
datetime=$(date +%Y%m%d)
timedate=$(date +%T)
pathbkp=/var/local/dumps
filename=$pathbkp/arrays.file
logdir=$pathbkp/LOG/
## END CONFIG ##
a=0
if [ ! -d $pathbkp ]; then
mkdir -p $pathbkp
mkdir -p $logdir
chown -R mysql.mysql $pathbkp
chmod -R 755 $pathbkp
touch $filename
else
touch $filename
fi
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")
mysqlshow ${args[0]} > $filename
counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'` )
while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime-$timedate.sql
mysqldump ${args[1]} ${array1[$a]} > $pathbkp/${array1[$a]}-$datetime-$timedate.sql2>&1
if [ "$?" != "0" ]; then
echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "No se realizo Dumps" >> $logdir/dumps-error.log
else
echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "Se realizo Dumps" >> $logdir/dumps-exito.log
fi
let a+=1
done
rm -f $filename
exit 0
------------------------------------------------------------------------------------------------------------------------
Segunda versión del script.
Mejoras:
- Genera los directorios
- Genera archivos de Logs
- Borra por seguridad el archivo arrays.file
#!/bin/bash
declare -a array1
declare -a counts
## BEGIN CONFIG ##
host=XX.XX.XX.XX
user=dumps
pass='password'
datetime=$(date +%Y%m%d)
timedate=$(date +%T)
pathbkp=/var/local/dumps
filename=$pathbkp/arrays.file
logdir=$pathbkp/LOG/
## END CONFIG ##
a=0
if [ ! -d $pathbkp ]; then
mkdir -p $pathbkp
mkdir -p $logdir
chown -R mysql.mysql $pathbkp
chmod -R 755 $pathbkp
touch $filename
else
touch $filename
fi
args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")
mysqlshow ${args[0]} > $filename
counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'` )
while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime-$timedate.sql
mysqldump ${args[1]} ${array1[$a]} > $pathbkp/${array1[$a]}-$datetime-$timedate.sql2>&1
if [ "$?" != "0" ]; then
echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "No se realizo Dumps" >> $logdir/dumps-error.log
else
echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "Se realizo Dumps" >> $logdir/dumps-exito.log
fi
let a+=1
done
rm -f $filename
exit 0
------------------------------------------------------------------------------------------------------------------------