能跑通的mysqldump备份脚本需以#!/bin/bash开头,显式定义db_user、db_password等变量,用date生成时间戳,mysqldump结合gzip压缩输出,检查退出码,创建备份目录并赋权,添加find清理7天前文件,并支持crontab定时执行与基础校验。

Linux 数据库定时备份,核心是用 mysqldump 生成转储文件,再通过 Shell 脚本封装逻辑、加时间戳、设权限,并用 crontab 定时触发。不依赖图形界面,纯命令行即可落地,关键在路径、凭证、压缩和清理四点稳住。
写一个能跑通的 mysqldump 备份脚本
脚本必须显式声明解释器、定义变量、处理错误,并确保输出可压缩、可归档:
- 开头固定写
#!/bin/bash,避免执行失败 - 数据库连接参数单独定义:用户名(
DB_USER)、密码(DB_PASSWORD)、主机(DB_HOST)、库名(DB_NAME),密码不硬编码在命令中更安全(可用配置文件或环境变量) - 用
date +%Y%m%d_%H%M生成带时分的时间戳,例如backup_20260617_1640.sql.gz - 转储命令推荐组合:
mysqldump -u"$DB_USER" -p"$DB_PASSWORD" -h"$DB_HOST" "$DB_NAME" | gzip > "$backup_dir/$filename" - 执行后检查退出码:
if [ $? -ne 0 ]; then echo "Dump failed"; exit 1; fi - 备份目录提前创建并赋权:
mkdir -p "$backup_dir",确保脚本用户有写入权限
让脚本每天自动运行
crontab 是最直接可靠的定时方案,注意执行环境与日志记录:
- 用
sudo crontab -e编辑 root 级任务,避免权限不足导致mysqldump拒绝连接 - 在 crontab 文件开头显式设置
PATH,比如PATH=/usr/local/bin:/usr/bin:/bin,防止找不到mysqldump或gzip - 示例:每天凌晨 2:30 执行,日志追加到
/var/log/mysql-backup.log30 2 * * * /path/to/mysql_backup.sh >> /var/log/mysql-backup.log 2>&1 - 确认
crond服务已启用:systemctl is-active crond应返回active
自动清理旧备份,防止磁盘打满
备份文件积累很快,脚本末尾加一句 find 就能控制保留周期:
- 按修改时间删:保留最近 7 天的
.sql.gz文件find "$backup_dir" -name "*.sql.gz" -mtime +7 -delete - 更稳妥的做法是先预览:
find "$backup_dir" -name "*.sql.gz" -mtime +7 -print,确认无误再加-delete - 若备份文件名含完整时间戳(如
backup_20260610_*.sql.gz),也可用ls -t | tail -n +8 | xargs rm -f按文件名排序删除 - 建议把
$backup_dir设在独立挂载点(如/backup),避免撑爆系统盘
验证备份是否真正可用
只看文件生成不代表能恢复,每次备份后应做轻量校验:
- 检查归档可读性:
gunzip -t "$backup_file"或zcat "$backup_file" | head -n 5 - 抽样解压结构:
zcat "$backup_file" | head -n 20 | grep -E "^(CREATE|INSERT)",确认含建表与数据语句 - 记录大小和行数:
du -h "$backup_file"和zcat "$backup_file" | wc -l,连续多日对比,异常骤降可能漏库 - 定期抽一个备份做还原测试(如导入到测试库),这是唯一能证明备份有效的动作











