Shell编程实战案例自动备份双副本数据库前言前面我们系统学习了Shell基础语法、变量、判断、循环、重定向、文本三剑客等理论知识想要真正把Shell用在运维自动化场景必须落地实战脚本。数据库定时备份是运维最常用、刚需最高的自动化场景本文基于完整可运行的sql-backup.sh脚本实现本地备份远程共享存储双副本、自动压缩、日志记录、30天旧备份自动清理、屏蔽报错信息搭配定时任务实现无人值守每日备份。全文拆解脚本每一行代码含义、运行前后效果、脚本校验步骤、踩坑要点零基础也能直接复制部署。一、本案例核心实现功能自动获取当前时间戳备份文件按时间命名区分每一次备份使用mysqldump导出MySQL数据库完整数据打包压缩备份文件节省磁盘空间本地留存一份备份通过rsync同步至NFS共享存储实现双副本防丢失自动清理本地30天以上过期备份文件避免磁盘占满全程生成备份日志方便后续排查故障屏蔽执行过程中无用报错信息控制台输出干净配合crontab定时任务实现每天凌晨自动执行无需人工操作。二、前置核心知识点回顾脚本会用到1. Shell变量规则脚本核心基础变量定义变量名值等号两侧不能有空格值含空格必须用引号包裹单引号所见即所得不解析$变量双引号识别$、转义符等特殊字符变量名不能以数字开头不能使用if/for/while等Bash关键字获取命令输出赋值变量两种写法# 推荐写法兼容性更好shijian$(date%y%m%d%H%M)# 老式反引号写法数字1左侧符号区别于单引号shijiandate%y%m%d%H%Mdate时间格式说明%y两位年份、%m月份、%d日期、%H小时、%M分钟。2. 脚本高频工具命令说明命令作用脚本用途mysqldumpMySQL官方数据库导出备份工具导出指定库SQL文件tar -czf创建gzip压缩包压缩备份sql减少占用rsync文件增量同步工具同步备份到远程NFS共享存储find -mtime 30查找30天前修改的文件筛选过期备份文件xargs rm -rf接收管道结果批量删除文件自动清理过期备份2/dev/null错误输出黑洞屏蔽报错过滤无关告警日志追加写入文件持续记录备份日志3. 补充概念/dev/nullLinux虚拟黑洞写入其中的数据会直接丢弃NFS共享存储服务器挂载的远端磁盘用来存放第二份备份防止本地磁盘损坏丢失数据crontabLinux系统定时任务实现脚本定时自动运行。三、完整可运行备份脚本 sql-backup.sh#!/bin/bash# 脚本名称sql-backup.sh# 功能MySQL数据库双副本自动备份脚本# 版本V1.0# 创建日期2026-07-08# 1. 定义时间变量生成时间戳年日月时分shijian$(date%y%m%d%H%M)# 2. 自定义配置项可根据自己服务器修改db_userroot# 数据库用户名db_pwd123456# 数据库密码db_nametest_db# 需要备份的数据库名local_back_dir/beifen# 本地备份存放目录log_file/shell/beifen.log# 日志文件路径remote_dir/mnt/nfs_share# NFS共享存储挂载目录# 3. 创建本地备份目录不存在则新建mkdir-p${local_back_dir}# 4. 数据库导出备份屏蔽无关错误输出mysqldump -u${db_user}-p${db_pwd}${db_name}${local_back_dir}/sql-${shijian}.sql2/dev/null# 5. 压缩SQL备份文件生成压缩包tar-czf${local_back_dir}/yasuo-${shijian}.tar.gz${local_back_dir}/sql-${shijian}.sql2/dev/null# 6. 本地备份同步到NFS共享存储双副本留存rsync-az${local_back_dir}/yasuo-${shijian}.tar.gz${remote_dir}/2/dev/null# 7. 自动清理本地30天前的所有备份文件find${local_back_dir}-mtime30-name*.tar.gz|xargsrm-rf2/dev/null# 8. 写入操作日志记录本次备份时间echo【${shijian}】数据库${db_name}备份执行完成压缩包yasuo-${shijian}.tar.gz${log_file}四、逐行代码详细拆解运行效果演示1. 脚本头部Shebang与注释#!/bin/bash# 脚本名称sql-backup.sh# 功能MySQL数据库双副本自动备份脚本# 版本V1.0# 创建日期2026-07-08代码含义#!/bin/bash为Shebang指定使用Bash解释器执行脚本注释仅做说明不会被程序执行方便后续维护。运行效果无输出仅作为脚本标识缺少该行会导致部分系统执行异常。2. 时间变量定义shijian$(date%y%m%d%H%M)代码含义使用$()执行date命令将生成的时间字符串赋值给变量shijian运行示例当前时间2026年07月08日15点30分变量值为2607081530作用备份文件携带时间戳不会覆盖历史备份方便区分每一次备份。3. 自定义配置变量db_userrootdb_pwd123456db_nametest_dblocal_back_dir/beifenlog_file/shell/beifen.logremote_dir/mnt/nfs_share代码含义统一存放所有可修改参数后续更换数据库、备份路径仅修改此处不用改动业务逻辑变量使用示例${db_name}会自动替换为test_db易错点变量赋值等号两侧不能加空格路径含空格必须加双引号。4. 创建备份目录mkdir-p${local_back_dir}代码含义mkdir -p递归创建目录目录不存在自动新建已存在不会报错运行效果系统自动生成/beifen文件夹避免导出数据库时因目录不存在报错。5. mysqldump导出数据库mysqldump -u${db_user}-p${db_pwd}${db_name}${local_back_dir}/sql-${shijian}.sql2/dev/null代码拆解-u指定数据库用户-p后跟数据库密码 文件名将导出的数据库数据覆盖写入sql文件2/dev/null屏蔽命令执行过程中所有标准错误信息运行前后效果执行前/beifen无sql文件执行后生成sql-2607081530.sql完整数据库备份文件风险提示密码明文写脚本存在安全隐患生产环境建议使用MySQL配置文件隐藏密码。6. tar打包压缩备份文件tar-czf${local_back_dir}/yasuo-${shijian}.tar.gz${local_back_dir}/sql-${shijian}.sql2/dev/null参数解释-c创建压缩包-zgzip压缩-f指定压缩包名称运行效果在备份目录生成yasuo-2607081530.tar.gz压缩包相比原始sql文件体积大幅缩小。7. rsync同步至NFS共享存储双副本核心rsync-az${local_back_dir}/yasuo-${shijian}.tar.gz${remote_dir}/2/dev/null参数解释-a归档模式保留文件权限属性-z传输时压缩节省网络流量运行效果本地压缩包同步到/mnt/nfs_share共享目录本地远端两份备份防止本地磁盘损坏丢失数据前置要求服务器需提前挂载NFS共享存储否则同步失败。8. findxargs自动清理30天旧备份find${local_back_dir}-mtime30-name*.tar.gz|xargsrm-rf2/dev/null代码拆解find 目录 -mtime 30筛选30天前修改的压缩包文件30代表超过30天不是近30天|管道符将find查询到的文件列表传递给后面命令xargs rm -rf批量删除筛选出的过期备份运行效果本地目录中超过30天的备份压缩包自动清除避免磁盘空间持续占满。9. 日志追加记录echo【${shijian}】数据库${db_name}备份执行完成压缩包yasuo-${shijian}.tar.gz${log_file}代码含义追加写入日志文件不会清空原有日志运行效果打开/shell/beifen.log可看到完整备份记录示例【2607081530】数据库test_db备份执行完成压缩包yasuo-2607081530.tar.gz对比提醒如果使用会直接清空日志文件日志记录必须使用。五、脚本完整部署验证步骤步骤1创建脚本文件使用vim新建脚本文件vimsql-backup.sh将上面完整代码复制粘贴进去保存退出。步骤2赋予脚本执行权限Linux新建文本文件默认无执行权限直接运行会报Permission deniedchmodx sql-backup.sh步骤3手动执行脚本测试功能./sql-backup.sh步骤4逐项校验备份结果验证要点查看本地备份目录确认压缩包按时间命名ls-alh/beifen/预期输出存在yasuo-2607081530.tar.gz格式压缩包检查NFS共享存储确认文件同步成功cd/mnt/nfs_sharels查看日志文件确认备份记录完整cat/shell/beifen.log测试过期清理逻辑可修改-mtime 1测试1天前文件删除find/beifen-mtime30-name*.tar.gz六、配置定时任务crontab实现自动备份手动执行仅用于测试生产环境搭配定时任务实现每日凌晨自动备份。编辑定时任务列表crontab-e添加规则每天凌晨2点执行备份脚本02* * * /shell/sql-backup.sh时间格式说明分 时 日 月 周0 2 * * *代表每日02:00执行查看当前定时任务crontab-l注意事项定时任务执行时环境变量和终端不同脚本路径建议写绝对路径脚本必须提前添加执行权限chmod x。七、实操易错点避坑总结知识点易错点解决方案变量定义等号两侧添加空格脚本直接报错严格遵循变量值无空格时间变量反引号与单引号混淆时间获取失败获取命令输出优先使用$()mysqldump备份密码明文存脚本存在安全风险生产环境使用my.cnf配置文件隐藏密码日志写入使用覆盖日志历史记录丢失日志统一使用追加写入过期文件清理-mtime 30理解为近30天文件30代表30天之前小于30天不会删除错误输出2/dev/null全程屏蔽报错故障无法排查调试脚本时临时删除2/dev/null上线再添加crontab定时脚本无执行权限导致定时不运行部署脚本后必须执行chmod x授权rsync同步NFS未挂载同步文件缺失提前配置挂载开机自动挂载共享存储八、实战脚本整体总结变量定义与调用是本脚本核心所有路径、数据库信息统一用变量管理易维护2/dev/null屏蔽无用报错提升脚本运行稳定性控制台输出整洁日志持久化记录每次备份行为出现备份失败、丢失问题时可快速追溯本地共享存储双副本备份降低数据丢失风险自动清理过期文件管控磁盘占用结合crontab定时任务实现7×24小时无人值守数据库备份完全替代人工手动备份操作。拓展思考你可以基于这个基础脚本自主扩展功能备份失败发送邮件/企业微信告警增加数据库大小判断超大库分库备份增加备份文件MD5校验验证压缩包完整性区分工作日、周末设置不同备份保留周期。
Shell编程实战案例:自动备份双副本数据库
发布时间:2026/7/9 4:01:28
Shell编程实战案例自动备份双副本数据库前言前面我们系统学习了Shell基础语法、变量、判断、循环、重定向、文本三剑客等理论知识想要真正把Shell用在运维自动化场景必须落地实战脚本。数据库定时备份是运维最常用、刚需最高的自动化场景本文基于完整可运行的sql-backup.sh脚本实现本地备份远程共享存储双副本、自动压缩、日志记录、30天旧备份自动清理、屏蔽报错信息搭配定时任务实现无人值守每日备份。全文拆解脚本每一行代码含义、运行前后效果、脚本校验步骤、踩坑要点零基础也能直接复制部署。一、本案例核心实现功能自动获取当前时间戳备份文件按时间命名区分每一次备份使用mysqldump导出MySQL数据库完整数据打包压缩备份文件节省磁盘空间本地留存一份备份通过rsync同步至NFS共享存储实现双副本防丢失自动清理本地30天以上过期备份文件避免磁盘占满全程生成备份日志方便后续排查故障屏蔽执行过程中无用报错信息控制台输出干净配合crontab定时任务实现每天凌晨自动执行无需人工操作。二、前置核心知识点回顾脚本会用到1. Shell变量规则脚本核心基础变量定义变量名值等号两侧不能有空格值含空格必须用引号包裹单引号所见即所得不解析$变量双引号识别$、转义符等特殊字符变量名不能以数字开头不能使用if/for/while等Bash关键字获取命令输出赋值变量两种写法# 推荐写法兼容性更好shijian$(date%y%m%d%H%M)# 老式反引号写法数字1左侧符号区别于单引号shijiandate%y%m%d%H%Mdate时间格式说明%y两位年份、%m月份、%d日期、%H小时、%M分钟。2. 脚本高频工具命令说明命令作用脚本用途mysqldumpMySQL官方数据库导出备份工具导出指定库SQL文件tar -czf创建gzip压缩包压缩备份sql减少占用rsync文件增量同步工具同步备份到远程NFS共享存储find -mtime 30查找30天前修改的文件筛选过期备份文件xargs rm -rf接收管道结果批量删除文件自动清理过期备份2/dev/null错误输出黑洞屏蔽报错过滤无关告警日志追加写入文件持续记录备份日志3. 补充概念/dev/nullLinux虚拟黑洞写入其中的数据会直接丢弃NFS共享存储服务器挂载的远端磁盘用来存放第二份备份防止本地磁盘损坏丢失数据crontabLinux系统定时任务实现脚本定时自动运行。三、完整可运行备份脚本 sql-backup.sh#!/bin/bash# 脚本名称sql-backup.sh# 功能MySQL数据库双副本自动备份脚本# 版本V1.0# 创建日期2026-07-08# 1. 定义时间变量生成时间戳年日月时分shijian$(date%y%m%d%H%M)# 2. 自定义配置项可根据自己服务器修改db_userroot# 数据库用户名db_pwd123456# 数据库密码db_nametest_db# 需要备份的数据库名local_back_dir/beifen# 本地备份存放目录log_file/shell/beifen.log# 日志文件路径remote_dir/mnt/nfs_share# NFS共享存储挂载目录# 3. 创建本地备份目录不存在则新建mkdir-p${local_back_dir}# 4. 数据库导出备份屏蔽无关错误输出mysqldump -u${db_user}-p${db_pwd}${db_name}${local_back_dir}/sql-${shijian}.sql2/dev/null# 5. 压缩SQL备份文件生成压缩包tar-czf${local_back_dir}/yasuo-${shijian}.tar.gz${local_back_dir}/sql-${shijian}.sql2/dev/null# 6. 本地备份同步到NFS共享存储双副本留存rsync-az${local_back_dir}/yasuo-${shijian}.tar.gz${remote_dir}/2/dev/null# 7. 自动清理本地30天前的所有备份文件find${local_back_dir}-mtime30-name*.tar.gz|xargsrm-rf2/dev/null# 8. 写入操作日志记录本次备份时间echo【${shijian}】数据库${db_name}备份执行完成压缩包yasuo-${shijian}.tar.gz${log_file}四、逐行代码详细拆解运行效果演示1. 脚本头部Shebang与注释#!/bin/bash# 脚本名称sql-backup.sh# 功能MySQL数据库双副本自动备份脚本# 版本V1.0# 创建日期2026-07-08代码含义#!/bin/bash为Shebang指定使用Bash解释器执行脚本注释仅做说明不会被程序执行方便后续维护。运行效果无输出仅作为脚本标识缺少该行会导致部分系统执行异常。2. 时间变量定义shijian$(date%y%m%d%H%M)代码含义使用$()执行date命令将生成的时间字符串赋值给变量shijian运行示例当前时间2026年07月08日15点30分变量值为2607081530作用备份文件携带时间戳不会覆盖历史备份方便区分每一次备份。3. 自定义配置变量db_userrootdb_pwd123456db_nametest_dblocal_back_dir/beifenlog_file/shell/beifen.logremote_dir/mnt/nfs_share代码含义统一存放所有可修改参数后续更换数据库、备份路径仅修改此处不用改动业务逻辑变量使用示例${db_name}会自动替换为test_db易错点变量赋值等号两侧不能加空格路径含空格必须加双引号。4. 创建备份目录mkdir-p${local_back_dir}代码含义mkdir -p递归创建目录目录不存在自动新建已存在不会报错运行效果系统自动生成/beifen文件夹避免导出数据库时因目录不存在报错。5. mysqldump导出数据库mysqldump -u${db_user}-p${db_pwd}${db_name}${local_back_dir}/sql-${shijian}.sql2/dev/null代码拆解-u指定数据库用户-p后跟数据库密码 文件名将导出的数据库数据覆盖写入sql文件2/dev/null屏蔽命令执行过程中所有标准错误信息运行前后效果执行前/beifen无sql文件执行后生成sql-2607081530.sql完整数据库备份文件风险提示密码明文写脚本存在安全隐患生产环境建议使用MySQL配置文件隐藏密码。6. tar打包压缩备份文件tar-czf${local_back_dir}/yasuo-${shijian}.tar.gz${local_back_dir}/sql-${shijian}.sql2/dev/null参数解释-c创建压缩包-zgzip压缩-f指定压缩包名称运行效果在备份目录生成yasuo-2607081530.tar.gz压缩包相比原始sql文件体积大幅缩小。7. rsync同步至NFS共享存储双副本核心rsync-az${local_back_dir}/yasuo-${shijian}.tar.gz${remote_dir}/2/dev/null参数解释-a归档模式保留文件权限属性-z传输时压缩节省网络流量运行效果本地压缩包同步到/mnt/nfs_share共享目录本地远端两份备份防止本地磁盘损坏丢失数据前置要求服务器需提前挂载NFS共享存储否则同步失败。8. findxargs自动清理30天旧备份find${local_back_dir}-mtime30-name*.tar.gz|xargsrm-rf2/dev/null代码拆解find 目录 -mtime 30筛选30天前修改的压缩包文件30代表超过30天不是近30天|管道符将find查询到的文件列表传递给后面命令xargs rm -rf批量删除筛选出的过期备份运行效果本地目录中超过30天的备份压缩包自动清除避免磁盘空间持续占满。9. 日志追加记录echo【${shijian}】数据库${db_name}备份执行完成压缩包yasuo-${shijian}.tar.gz${log_file}代码含义追加写入日志文件不会清空原有日志运行效果打开/shell/beifen.log可看到完整备份记录示例【2607081530】数据库test_db备份执行完成压缩包yasuo-2607081530.tar.gz对比提醒如果使用会直接清空日志文件日志记录必须使用。五、脚本完整部署验证步骤步骤1创建脚本文件使用vim新建脚本文件vimsql-backup.sh将上面完整代码复制粘贴进去保存退出。步骤2赋予脚本执行权限Linux新建文本文件默认无执行权限直接运行会报Permission deniedchmodx sql-backup.sh步骤3手动执行脚本测试功能./sql-backup.sh步骤4逐项校验备份结果验证要点查看本地备份目录确认压缩包按时间命名ls-alh/beifen/预期输出存在yasuo-2607081530.tar.gz格式压缩包检查NFS共享存储确认文件同步成功cd/mnt/nfs_sharels查看日志文件确认备份记录完整cat/shell/beifen.log测试过期清理逻辑可修改-mtime 1测试1天前文件删除find/beifen-mtime30-name*.tar.gz六、配置定时任务crontab实现自动备份手动执行仅用于测试生产环境搭配定时任务实现每日凌晨自动备份。编辑定时任务列表crontab-e添加规则每天凌晨2点执行备份脚本02* * * /shell/sql-backup.sh时间格式说明分 时 日 月 周0 2 * * *代表每日02:00执行查看当前定时任务crontab-l注意事项定时任务执行时环境变量和终端不同脚本路径建议写绝对路径脚本必须提前添加执行权限chmod x。七、实操易错点避坑总结知识点易错点解决方案变量定义等号两侧添加空格脚本直接报错严格遵循变量值无空格时间变量反引号与单引号混淆时间获取失败获取命令输出优先使用$()mysqldump备份密码明文存脚本存在安全风险生产环境使用my.cnf配置文件隐藏密码日志写入使用覆盖日志历史记录丢失日志统一使用追加写入过期文件清理-mtime 30理解为近30天文件30代表30天之前小于30天不会删除错误输出2/dev/null全程屏蔽报错故障无法排查调试脚本时临时删除2/dev/null上线再添加crontab定时脚本无执行权限导致定时不运行部署脚本后必须执行chmod x授权rsync同步NFS未挂载同步文件缺失提前配置挂载开机自动挂载共享存储八、实战脚本整体总结变量定义与调用是本脚本核心所有路径、数据库信息统一用变量管理易维护2/dev/null屏蔽无用报错提升脚本运行稳定性控制台输出整洁日志持久化记录每次备份行为出现备份失败、丢失问题时可快速追溯本地共享存储双副本备份降低数据丢失风险自动清理过期文件管控磁盘占用结合crontab定时任务实现7×24小时无人值守数据库备份完全替代人工手动备份操作。拓展思考你可以基于这个基础脚本自主扩展功能备份失败发送邮件/企业微信告警增加数据库大小判断超大库分库备份增加备份文件MD5校验验证压缩包完整性区分工作日、周末设置不同备份保留周期。