文章目录
- 数据库备份shell脚本
- 变量定义
- FTP 变量定义
- 函数定义
- 主逻辑
数据库备份shell脚本
# var
bak_cmd="--user=bakup --password=123456 --socket=/tmp/mysql.sock --no-timestamp"
full_dir="/db/full_`date +%F`"
incr_dir="/db/incr_`date +%F`"
info="completed OK!"
day=`date +%u`#ftp var
ip="192.168.133.130"
user="bak"
passwd="123456"
ftp_dir="/bakup/db"
loc_dir="`date +%F`"full_bak(){
[ -d ${full_dir} ] || mkdir -p ${full_dir}
innobackupex ${bak_cmd} ${full_dir} &> /tmp/checkbak
}incr_bak(){
[ -d ${incr_dir} ] || mkdir -p ${incr_dir}
innobackupex --incremental ${bak_cmd} ${incr_dir} --incremental-basedir="$1" &> /tmp/checkbak
}check(){
if [ -f /tmp/checkbak ];thenif [ "`tail -1 /tmp/checkbak | awk '{print $3,$4}'`" == "$info" ];thenecho "备份成功" && upload else echo "备份失败"fi
fi
}upload(){/usr/bin/lftp << EOFopen $ip user $user $passwdlcd /db/mirror -R ${bak_name}closequit
EOF
}# Remove backup older than 7 days
find /db/ -depth -type d -mtime +6 -exec rm -rf {} \;# main
if [ $day -eq 7 ];thenbak_name=full_`date +%F`full_bakcheck
elif [ $day -eq 1 ];thenbak_name=incr_`date +%F`incr_bak "/db/full_`date +%F -d '-1 day'`"check
elsebak_name=incr_`date +%F`incr_bak "/db/incr_`date +%F -d '-1 day'`"check
firm -f /tmp/checkbak
这是一个用于数据库备份的 shell 脚本。该脚本使用 innobackupex
工具进行 MySQL 数据库备份,支持全量备份和增量备份。备份完成后,将备份文件上传至远程 FTP 服务器,并删除本地备份文件夹中7天以前的备份文件。以下是每个部分的详细解释:
变量定义
bak_cmd="--user=bakup --password=123456 --socket=/tmp/mysql.sock --no-timestamp"
full_dir="/db/full_`date +%F`"
incr_dir="/db/incr_`date +%F`"
info="completed OK!"
day=`date +%u`
bak_cmd
:用于设置备份时的 MySQL 登录用户、密码、MySQL socket 等参数。full_dir
:用于存放全量备份文件的文件夹路径。文件夹名称包含当前日期。incr_dir
:用于存放增量备份文件的文件夹路径。文件夹名称包含当前日期。info
:备份完成后输出的信息。day
:获取当前是星期几。
FTP 变量定义
ip="192.168.133.130"
user="bak"
passwd="123456"
ftp_dir="/bakup/db"
loc_dir="`date +%F`"
ip
:FTP 服务器的 IP 地址。user
:FTP 登录用户名。passwd
:FTP 登录密码。ftp_dir
:FTP 服务器上备份文件存放的路径。loc_dir
:本地备份文件存放的路径。文件夹名称包含当前日期。
函数定义
full_bak(){
[ -d ${full_dir} ] || mkdir -p ${full_dir}
innobackupex ${bak_cmd} ${full_dir} &> /tmp/checkbak
}incr_bak(){
[ -d ${incr_dir} ] || mkdir -p ${incr_dir}
innobackupex --incremental ${bak_cmd} ${incr_dir} --incremental-basedir="$1" &> /tmp/checkbak
}check(){
if [ -f /tmp/checkbak ];thenif [ "`tail -1 /tmp/checkbak | awk '{print $3,$4}'`" == "$info" ];thenecho "备份成功" && upload else echo "备份失败"fi
fi
}upload(){/usr/bin/lftp << EOFopen $ip user $user $passwdlcd /db/mirror -R ${bak_name}closequit
EOF
}
full_bak
:定义了全量备份函数。该函数首先创建一个存放全量备份文件的文件夹(如果文件夹不存在的话),然后使用innobackupex
工具进行 MySQL 数据库全量备份。备份完成后,将备份信息保存到/tmp/checkbak
文件中。incr_bak
:这个函数用于创建一个增量备份。它首先检查${incr_dir}
目录是否存在,如果不存在,则创建该目录。然后使用innobackupex
命令进行增量备份,并将输出结果存储到/tmp/checkbak
文件中。它还使用--incremental-basedir
参数指定增量备份基于哪个完整备份。check()
: 这个函数用于检查备份是否成功完成。它首先检查/tmp/checkbak
文件是否存在。如果存在,则使用tail
和awk
命令获取输出结果的最后一行,并检查其中的信息是否为$info
。如果是,则表示备份成功,调用upload()
函数将备份上传到 FTP 服务器。否则,表示备份失败。upload()
: 这个函数用于将备份文件上传到 FTP 服务器。它使用lftp
命令实现 FTP 连接和文件传输。具体来说,它首先使用open
命令连接 FTP 服务器,然后使用user
命令指定用户名和密码进行身份验证,使用lcd
命令切换到本地目录,最后使用mirror
命令将备份文件上传到 FTP 服务器上的指定目录中。
主逻辑
# Remove backup older than 7 days
find /db/ -depth -type d -mtime +6 -exec rm -rf {} \;# main
if [ $day -eq 7 ];thenbak_name=full_`date +%F`full_bakcheck
elif [ $day -eq 1 ];thenbak_name=incr_`date +%F`incr_bak "/db/full_`date +%F -d '-1 day'`"check
elsebak_name=incr_`date +%F`incr_bak "/db/incr_`date +%F -d '-1 day'`"check
firm -f /tmp/checkbak
-
这行代码使用
find
命令查找/db/
目录下的子目录,并删除最后一次修改时间在7天之前的所有子目录及其内容。实现一个本地服务器的备份七天循环 -
如果是每周的第七天,则进行全量备份;如果是每天的第一天,则进行增量备份,并以前一天的全量备份作为基准;否则进行增量备份,并以前一天的增量备份作为基准。
备份时,使用
innobackupex
命令进行备份,全量备份时不需要指定基准目录,增量备份时需要指定基准目录。备份完成后会执行check
函数,检查备份是否成功,并上传备份文件到指定的服务器。 -
删除临时文件