数据库备份shell脚本

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库备份shell脚本

数据库备份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函数,检查备份是否成功,并上传备份文件到指定的服务器。
  • 删除临时文件

相关文章
|
2天前
|
监控 Unix Shell
shell脚本编程学习
shell脚本编程
22 12
|
5天前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
8天前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
25 2
|
16天前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
25 8
|
29天前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
43 17
|
29天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
36 12
|
27天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
36 8
|
28天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
2月前
|
关系型数据库 MySQL Shell
MySQL数据库一键安装脚本,适合任何版本
MySQL数据库一键安装脚本,适合任何版本
38 2
|
2月前
|
运维 监控 Shell
自动化运维之宝:编写高效的Shell脚本
【8月更文挑战第31天】在运维的世界里,Shell脚本是一把瑞士军刀,它让日常任务变得简单而高效。本文将通过浅显易懂的语言和实际案例,带你领略Shell脚本的魅力,并教你如何打造属于自己的自动化工具箱。无论你是初学者还是资深运维,这篇文章都将为你打开一扇窗,让你看到不一样的风景。让我们一起探索Shell脚本的世界吧!
下一篇
无影云桌面