可靠的MySQL备份需封装脚本并正确配置crontab:设置变量、创建目录、mysqldump加--single-transaction、压缩与清理旧文件;注意权限、PATH、密码安全(用~/.my.cnf)、日志记录及非交互环境测试。
用 crontab 定时备份 MySQL 数据库,核心是写好备份脚本 + 正确配置定时任务。关键点在于权限、路径、环境变量和错误处理,很多失败是因为脚本在 cron 环境下执行时找不到命令或连不上数据库。
不要把

/home/user/bin/backup_mysql.sh):#!/bin/bash # 设置变量(按需修改) DB_USER="root" DB_PASS="your_password" DB_NAME="myapp" BACKUP_DIR="/home/user/backups/mysql" DATE=$(date +%Y%m%d_%H%M%S)创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
执行备份(加 --single-transaction 避免锁表,适合 InnoDB)
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction "$DB_NAME" > "$BACKUP_DIR/${DBNAME}$DATE.sql"
可选:压缩备份文件节省空间
gzip "$BACKUP_DIR/${DBNAME}$DATE.sql"
可选:只保留最近 7 天的备份
find "$BACKUP_DIR" -name "${DBNAME}*.sql.gz" -mtime +7 -delete
chmod +x /home/user/bin/backup_mysql.sh
/home/user/bin/backup_mysql.sh,确认生成文件且无报错~/.my.cnf),避免密码明文出现在脚本或进程列表中用当前用户(如非 root,推荐用数据库操作用户)编辑定时任务:
crontab -e
30 2 * * * /home/user/bin/backup_mysql.sh >> /home/user/logs/backup_mysql.log 2>&1
>> 把标准输出追加到日志;2>&1 把错误也一起记录,便于排查mysqldump:可在脚本开头加上 PATH=/usr/local/bin:/usr/bin:/bin,或使用绝对路径(如 /usr/bin/mysqldump)$(date +\%Y\%m\%d) 并转义很多备份“看似运行了”,实则静默失败。重点关注这几项:
sudo tail -f /var/log/syslog | grep CRON(Ubuntu/Debian)或 sudo journalctl -u cron -f
which mysqldump 查看实际路径)env -i /bin/bash --noprofile --norc /home/user/bin/backup_mysql.sh)~/.my.cnf 权限必须是 600,且属主匹配CREATE TABLE 开头,不是空文件或报错内容提升稳定性和运维效率的小技巧:
curl 推送状态)mysql -Nse "SHOW DATABASES" 动态获取库名,循环备份mydumper 替代 mysqldump(支持多线程、更细粒度控制),适合大库