MySQL设置定时自动备份,mysqldump脚本

MySQL数据一旦丢失,恢复成本极高,手动备份又容易忘记。
本文教你用mysqldump写一个备份脚本,再通过crontab设置定时自动备份,让数据库每天在指定时间自动导出并保留最近N天,零基础也能跟着完成。

环境确认与准备工作

开始前,确认服务器上已安装MySQL客户端和crontab服务。
登录Linux终端,依次执行:

mysql --version
crontab -l

第一条应显示MySQL版本信息,第二条若提示“no crontab for root”表示当前用户没有定时任务,属于正常。

接着创建备份目录和日志目录,并确保MySQL运行用户(通常是mysql)有写入权限:

mkdir -p /backup/mysql
chown mysql:mysql /backup/mysql
chmod 750 /backup/mysql

注意:不要将备份文件放在MySQL数据目录内,避免磁盘写满影响数据库运行。

编写mysqldump备份脚本

/usr/local/bin下新建脚本文件:

vim /usr/local/bin/mysql_backup.sh

写入以下内容(根据实际情况替换用户名、密码和数据库名):

#!/bin/bash
# MySQL自动备份脚本
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER="backup_user"
DB_PASS="YourStrongPassword"
DB_NAME="your_database"
RETENTION_DAYS=7

mysqldump -u${DB_USER} -p${DB_PASS} --single-transaction --routines --triggers ${DB_NAME} | gzip > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz

if [ $? -eq 0 ]; then
  echo "$(date) backup success" >> ${BACKUP_DIR}/backup.log
else
  echo "$(date) backup failed" >> ${BACKUP_DIR}/backup.log
fi

find ${BACKUP_DIR} -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete

保存后赋予执行权限:

chmod +x /usr/local/bin/mysql_backup.sh

关键参数说明

  • --single-transaction:对InnoDB表进行一致性快照,不锁表。
  • --routines --triggers:同时备份存储过程和触发器。
  • gzip:压缩备份文件,节省磁盘空间。

配置crontab实现定时自动备份

执行crontab -e,在文件末尾添加一行,表示每天凌晨2点30分执行备份:

30 2 * * * /bin/bash /usr/local/bin/mysql_backup.sh

保存退出后,用crontab -l确认任务已写入。

避坑提醒

  • 脚本中必须使用绝对路径,crontab的环境变量与登录shell不同。
  • 若MySQL密码包含特殊字符,建议使用--defaults-extra-file方式读取配置文件,避免转义问题。
  • 确保/backup所在分区有足够空间,建议单独挂载数据盘。

验证备份是否生效

等待定时时间到达,或手动执行一次脚本:

/usr/local/bin/mysql_backup.sh

然后检查备份目录:

ls -lh /backup/mysql/
cat /backup/mysql/backup.log

如果看到.sql.gz文件且日志显示backup success,说明备份正常。
还可以尝试解压并导入到测试库,确认文件可恢复:

gunzip -c /backup/mysql/your_database_*.sql.gz | mysql -u root -p test_db

判断标准:备份文件大小不应为0,且每日生成新文件,旧文件按保留天数自动清理。

常见问题与处理

备份文件为空或报错“Access denied”
检查备份用户是否有SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, RELOAD等权限,
可用root执行GRANT授权。

crontab任务不执行:查看系统日志/var/log/cronjournalctl -u crond,确认crond服务是否运行。

磁盘空间不足:调整RETENTION_DAYS值,或增加磁盘监控告警。

备份时间过长:对于大库,可考虑--quick参数或分库备份,避免影响业务。

按照以上步骤,你就能用mysqldump脚本和crontab实现MySQL定时自动备份。
建议首次配置后手动触发一次,确认备份文件可正常恢复,再交由定时任务运行。
遇到异常时,优先检查权限、路径和日志,多数问题都能快速定位。

分享到:
上一篇
Nginx upstream负载均衡
下一篇
MySQL数据库碎片清理,优化大表性能
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意