数据库备份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 ];then if [ "`tail -1 /tmp/checkbak | awk '{print $3,$4}'`" == "$info" ];then echo "备份成功" && upload else echo "备份失败" fi fi } upload(){ /usr/bin/lftp << EOF open $ip user $user $passwd lcd /db/ mirror -R ${bak_name} close quit EOF } # Remove backup older than 7 days find /db/ -depth -type d -mtime +6 -exec rm -rf {} \; # main if [ $day -eq 7 ];then bak_name=full_`date +%F` full_bak check elif [ $day -eq 1 ];then bak_name=incr_`date +%F` incr_bak "/db/full_`date +%F -d '-1 day'`" check else bak_name=incr_`date +%F` incr_bak "/db/incr_`date +%F -d '-1 day'`" check fi rm -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 ];then if [ "`tail -1 /tmp/checkbak | awk '{print $3,$4}'`" == "$info" ];then echo "备份成功" && upload else echo "备份失败" fi fi } upload(){ /usr/bin/lftp << EOF open $ip user $user $passwd lcd /db/ mirror -R ${bak_name} close quit 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 ];then bak_name=full_`date +%F` full_bak check elif [ $day -eq 1 ];then bak_name=incr_`date +%F` incr_bak "/db/full_`date +%F -d '-1 day'`" check else bak_name=incr_`date +%F` incr_bak "/db/incr_`date +%F -d '-1 day'`" check fi rm -f /tmp/checkbak
- 这行代码使用find命令查找/db/目录下的子目录,并删除最后一次修改时间在7天之前的所有子目录及其内容。实现一个本地服务器的备份七天循环
- 如果是每周的第七天,则进行全量备份;如果是每天的第一天,则进行增量备份,并以前一天的全量备份作为基准;否则进行增量备份,并以前一天的增量备份作为基准。
备份时,使用innobackupex命令进行备份,全量备份时不需要指定基准目录,增量备份时需要指定基准目录。备份完成后会执行check函数,检查备份是否成功,并上传备份文件到指定的服务器。 - 删除临时文件