Como me gusta trabajar en scripts les comparto un script diseñado por mi para que alivie sus necesidades. Si encuentran algun bug me avisan y recuerden que deben ajustarlo a sus necesidades, aún voy a liberar una nueva versión donde pregunte si el respaldo es nfs o no, si lo es, que se pase por parámetro el ip remoto, por ahora es estático y se debe comentar la parte donde se monta el nfs remoto en caso de no tener uno:
#!/bin/bash
Scripts_path="/Scripts"
femail="webmaster@dominio.ejemplo.test"
temail="soporte@dominio.ejemplo.test"
#Aqui va el ip del servidor nfs donde se ha de montar el respaldo
ipnfs="192.168.1.20"
dest="/backup"
host="localhost"
port=3306
user="backup"
password="U2FsdGVkX18WWIZ2IUg2hs+E8UWC82jp9jml40ruOJM="
hostname=$(hostname)
tool_mode="xtrabackup"
error_log=/var/log/$(echo $tool_mode)-backupm.log
lock_file=/tmp/$(echo $tool_mode)-backupm.lck
main_path="$dest/$hostname/$tool_mode"
last_full_backup="$main_path/last_full_backup.txt"
incremental_reg_backup="$main_path/incremental_reg_backup.txt"
history_full_backup="$main_path/history_full_backup.txt"
history_incremental_reg_backup="$main_path/history_incremental_reg_backup.txt"
function montar(){
montado=$(cat /etc/mtab | grep backup | wc -l)
if let "montado==0";then
echo "Mounting $ipnfs:/nfs/dbserver on $dest" >> $error_log 2>&1
mount -t nfs $ipnfs:/nfs/dbserver $dest
fi
}
function desmontar(){
montado=$(cat /etc/mtab | grep backup | wc -l)
if let "montado==1";then
echo "Unmounting $ipnfs:/nfs/dbserver on $dest" >> $error_log 2>&1
umount $dest
fi
}
function chk_files(){
if [[ ! -d $main_path ]];then
mkdir -pv $main_path >> $error_log 2>&1
fi
if [[ ! -f $last_full_backup ]];then
echo "Creating $last_full_backup" >> $error_log 2>&1
> $last_full_backup
fi
if [[ ! -f $incremental_reg_backup ]];then
echo "Creating $incremental_reg_backup" >> $error_log 2>&1
> $incremental_reg_backup
fi
}
function do_backup(){
host=$3
port=$4
user=$5
password=$(echo $6 | openssl enc -aes-128-cbc -a -d -salt -pass pass:wtf)
if [[ ! -f "$lock_file" ]];then
> $lock_file
fi
if [[ "$( cat $lock_file )" != "$(date +%Y%m%d)" ]];then
##########################################################
# Tomamos la fecha y ordenador al que el backup pertenece.
Yr=$(date +"%Y")
Mh=$(date +"%m")
Dy=$(date +"%d")
day=$(echo "$Yr$Mh$Dy")
let $folder "folder=(Mh-1)%3"
echo $day > $lock_file
echo " day $day --- folder $folder --- month $Mh" >> $error_log 2>&1
echo "---------------- $(date +"%Y/%m/%d - %H:%M:%S") ----------------" >> $error_log 2>&1
backup_path="$main_path/monthly/$folder"
if [[ ! -d $backup_path ]];then
mkdir -pv $backup_path >> $error_log 2>&1
fi
#If force yes then delete
if [[ "$2" == "1" ]]; then
if [[ -d $backup_path ]]; then
rm -rfv $backup_path >> $error_log 2>&1
fi
else
if [[ -d $backup_path ]]; then
error="La carpeta existe y no se hace nada use la opcion -(f) para forzar el respaldo!\n"
print "%s" "$error" >> $error_log 2>&1
print "%s" "$error"
exit 1
fi
fi
initialt=$(date +"%H:%H:%S")
if [[ ! -d $dest/files ]];then
mkdir -pv $dest/files >> $error_log 2>&1
fi
echo "---------------- [$day / $initialt] - [Backup of files and Scripts] ----------------" >> $error_log 2>&1
tar -czpf $dest/files/etc.tar.gz /etc/ >> $error_log 2>&1
tar -czpf $dest/files/Scripts.tar.gz $Scripts_path >> $error_log 2>&1
printf "Last Script runned on %d and stored in folder %s\n" "$day" "$backup_path" >> $main_path/date.txt
echo "---------------- [$day / $initialt] - [Initial Backup] ----------------" >> $error_log 2>&1
xtrabackup -u $user -p $password --backup --datadir=/var/lib/mysql/ --target-dir=$backup_path >> $error_log 2>&1
finalt=$(date +"%H:%H:%S")
echo "---------------- [$day / $finalt] - [Final Backup] ----------------" >> $error_log 2>&1
cat $last_full_backup >> $history_full_backup
echo "$day [$initialt - $finalt] | $backup_path" > $last_full_backup
echo "Cleaning old week backup" >> $error_log 2>&1
while read weekline;do
weekfolder=$(echo $weekline | awk '{print $6}' )
if [ -d $weekfolder ];then
rm -rfv $weekfolder >> $error_log 2>&1
fi
done < $history_incremental_reg_backup
#Updateing incremental registry
cat $incremental_reg_backup >> $history_incremental_reg_backup
> $incremental_reg_backup
rm $lock_file
fi
}
> $error_log
option=""
force=1
nfs_option=1
flag1=0
flag2=0
print_usage() {
backup_path="$main_path/monthly/[0-2]"
echo "Modo de empleo: $0.sh [-F|--force] [N|--noforce] [-T|--timestamp] [-O|--notimestamp] [-U|--user=\$user] [-P|--port=\$port] [-H|--host=\$host] [-p|--password=\$password] [--no_nfs] [-h|--help]
Realiza un respaldo completo de la base de datos usando el PATH $backup_path
Las opciones validas son:
-F|--force Forzar la carpeta destino si existe reescribe
-H|--host=\$host Nombre del servidor a conectarse para el respaldo (default=dbserver)
-N|--noforce Si la carpeta destino existe no reescribe
-O|--notimestamp Escribe directamente en $backup_path sin estampado de tiempo
-P|--port=\$port Puerto a conectarse para el respaldo (default=3306)
-T|--timestamp Agrega al $backup_path un directorio \$Y-\$m-\$d-\$H-\$M-\$s
-U|--user=\$user Usuario con el que se conectara al servidor para hacer el respaldo (default=backup)
-h|--help Imprime esta ayuda
--no_nfs No intenta montar directorio de respaldo
-p|--password=\$password Password para la autenticacion.
Las opciones por defectos son --force y --notimestamp
OPTIONS: -[F|H|N|O|P|T|U|h|p]
" >&2
}
while [[ "$1" != "" ]]; do
case $1 in
-F|--force)
if let "flag1==0";then
let $force "force=1"
let $flag1 "flag=1"
fi
;;
-N|--noforce)
if let "flag1==0";then
let $force "force=0"
let $flag1 "flag=1"
fi
;;
--no_nfs)
nfs_option=0
;;
-T|--timestamp)
if let "flag2==0";then
option=""
let $flag2 "flag2=1"
fi
;;
-O|--notimestamp)
if let "flag2==0";then
option="--no-timestamp "
let $flag2 "flag2=1"
fi
;;
-U)
user=$2
shift
;;
-P)
port=$2
shift
;;
-H)
host=$2
shift
;;
-p)
password=$(echo $2 | openssl enc -aes-128-cbc -a -salt -pass pass:wtf)
shift
;;
--user=*)
user=$(echo $1 | awk -F= '{print $2}')
;;
--port=*)
port=$(echo $1 | awk -F= '{print $2}')
;;
--host=*)
host=$(echo $1 | awk -F= '{print $2}')
;;
--password=*)
password=$(echo $1 | awk -F= '{print $2}' | openssl enc -aes-128-cbc -a -salt -pass pass:wtf)
;;
-h|\?|--help)
print_usage
exit 0
;;
*)
printf "Comando $1 no reconocido, favor consulte ($0 -h) para ver las opciones aceptadas.\n"
#print_usage
exit 1
;;
esac
shift
done
if [[ "$flag2" == "0" && "$option" == "" ]];then
option="--no-timestamp"
fi
if let "nfs_option==1";then
montar
fi
chk_files
do_backup $option $force $host $port $user $password
#if let "nfs_option==1";then
# desmontar
#fi
No hay comentarios:
Publicar un comentario