定时任务 crontab + Shell 脚本组合大法,让你的数据库自动化无压力(教程+代码)

定时任务 crontab + Shell 脚本组合大法,让你的数据库自动化无压力(教程+代码)

奥黛丽·逐爱者
2025-06-18 / 0 评论 / 2 阅读 / 正在检测是否收录...
点击上方“IT咸鱼”,关注博主
图片
有问题私信嘀嘀作者哦!
每天分享技术栈,开发工具

环境说明

  • 操作系统:AlmaLinux 8.x
  • 数据库:MySQL 部署在 Docker 容器中
  • 目录结构:假定把脚本统一放在 ~/scripts

二、准备工作:创建脚本存放目录

  1. 登录到你的主服务器(master)

    ssh dba@master.example.com
  2. 创建专属目录

    mkdir-p ~/scripts
    cd ~/scripts
    • -p
      :不存在就创建;
    • cd
      :进入目录。
  3. 确认目录权限

    ls-ld ~/scripts

    输出应类似:

    drwxr-xr-2 dba dba 4096May2510:00/home/dba/scripts

三、Shell 脚本示例:MySQL 备份脚本

目标:每天凌晨 2 点自动备份主库并保留最近 7 天的备份。

脚本名称:backup_mysql.sh

#!/bin/bash
#
# backup_mysql.sh —— 自动备份 MySQL 主库
# 环境:AlmaLinux + Docker
# 说明:依赖 docker、gzip、mysqldump
#

# —— 一、基本变量定义 —— 
# 容器名称或 ID
CONTAINER_NAME="mysql-master"
# 备份存放目录
BACKUP_DIR="/home/dba/scripts/backups"
# 保留天数
RETENTION_DAYS=7
# 时间戳
DATE=$(date +"%F_%H%M")

# —— 二、命令检查 —— 
forcmdindocker mysqldump gzip;do
command-v$cmd>/dev/null 2>&1
if[$?-ne0];then
echo "错误:未检测到命令 $cmd,请安装后重试!"
exit1
fi
done

# —— 三、创建备份目录 —— 
mkdir -p "$BACKUP_DIR"
if[$?-ne0];then
echo "错误:创建目录 $BACKUP_DIR 失败!"
exit 1
fi

# —— 四、执行备份 —— 
BACKUP_FILE="$BACKUP_DIR/mysql_backup_${DATE}.sql.gz"
echo "[$(date +"%F %T")] 开始备份:$BACKUP_FILE"
dockerexec$CONTAINER_NAME\
    mysqldump -uroot -p'your_password' --all-databases \
|gzip>"$BACKUP_FILE"

if[$?-eq0];then
echo"[$(date +"%F %T")] 备份完成!"
else
echo"[$(date +"%F %T")] 备份失败!"
exit1
fi

# —— 五、清理过期备份 —— 
echo"[$(date +"%F %T")] 开始清理 $RETENTION_DAYS 天前的备份"
find"$BACKUP_DIR"-type f -name"mysql_backup_*.sql.gz"\
-mtime +$RETENTION_DAYS-print-delete

echo"[$(date +"%F %T")] 清理完成!"

注意

  • command -v cmd:检查命令是否安装;

  • docker exec:进入容器执行;

  • find … -mtime +N:查找 N 天前的文件;

  • 如果你看到 bash: command: 未找到命令,说明系统中没有安装对应命令:

    # 例如安装 docker
    sudo dnf install-ydocker
    # 或者安装 gzip
    sudo dnf install-ygzip

四、配置 crontab:让脚本自动跑起来

  1. 打开 crontab 编辑器

    crontab-e
    • 第一次会让你选择编辑器,推荐 vim或 nano
  2. 添加定时任务在文件末尾新增一行:

    02***/home/dba/scripts/backup_mysql.sh>>/home/dba/scripts/backup.log2>&1

    含义:

    • 0 2 * * *
      :每天 02:00 执行
    • >> backup.log 2>&1
      :将标准输出和错误输出都追加到 backup.log
  3. 保存并退出

    • vim
      ESC→ :wq→ 回车
    • nano
      Ctrl+O→ 回车 → Ctrl+X
  4. 查看 crontab 是否生效

    crontab-l

    会列出刚才添加的任务。

    图片

五、常见错误排查

错误提示
原因 & 解决方案
bash: backup_mysql.sh: 未找到命令
- 脚本没有可执行权限:chmod +x backup_mysql.sh- 路径写错,检查全路径
docker: 未找到命令
- Docker 未安装或未加入 PATH:sudo dnf install docker- 需注销后重登
mysqldump: command not found
- 容器内没安装 mysql-client:在 Dockerfile 中添加 yum install -y mysql
permission denied
- 目录权限不足:chmod -R 755 ~/scripts
找不到脚本
- crontab 中路径不对:务必写绝对路径

六、“官方”示意图支持

官方文档示意:crontab 字段含义来源:Linux 手册


图片
crontab 字段官方示意图

七、进阶玩法 & 注意事项

  1. 邮件通知:在脚本末尾加

    mail -s"MySQL 备份报告 $(date +'%F')" you@example.com < backup.log
  2. 主从同步检查:可以写一个脚本 check_replication.sh,通过 SHOW SLAVE STATUS判断延迟。

  3. 集中化日志管理:把 backup.log发送到日志服务器或 ELK。

  4. 安全:不要把数据库密码写在脚本里,推荐使用 .my.cnf或 docker secret


八、小结

  • 脚本编写
    :变量、命令检查、错误退出、日志记录
  • 定时执行
    :crontab 配置、日志重定向
  • 排查技巧
    command -v、全路径、权限
  • 环境依赖
    :AlmaLinux + Docker + GNU 工具

只要照着示例改一改、跑一跑,你的数据库自动备份就稳稳当当了!


如果你还有问题,欢迎在后台留言!(脚本为服务器复制可能有空格问题

一行一行教你搞定 Shell 脚本基础,别再死记硬背了

END

如果看到这里,说明你喜欢这篇文章,请荐、转发、点赞。同时 标星(置顶)本博主可以第一时间接受到博文推送。私信说出你想要的资源给你安排!!! 

图片

👆长按上方二维码 2 秒

说出你想要的资源


我知道你 “在看图片

0

评论 (0)

取消