数据库备份shell脚本

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 数据库备份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函数,检查备份是否成功,并上传备份文件到指定的服务器。
  • 删除临时文件

相关文章
|
4月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
480 9
|
4月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
422 2
|
7月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
299 60
|
4月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
6月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
788 0
|
8月前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
415 20
|
8月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
235 17
|
8月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
481 3
|
4月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
183 3
|
4月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。