数据库备份shell脚本

文章目录

  • 数据库备份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 ];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 文件是否存在。如果存在,则使用 tailawk 命令获取输出结果的最后一行,并检查其中的信息是否为 $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函数,检查备份是否成功,并上传备份文件到指定的服务器。

  • 删除临时文件

你可能感兴趣的:(shell,数据库,mysql,服务器,运维,sql)