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/cron或journalctl -u crond,确认crond服务是否运行。
磁盘空间不足:调整RETENTION_DAYS值,或增加磁盘监控告警。
备份时间过长:对于大库,可考虑--quick参数或分库备份,避免影响业务。
按照以上步骤,你就能用mysqldump脚本和crontab实现MySQL定时自动备份。
建议首次配置后手动触发一次,确认备份文件可正常恢复,再交由定时任务运行。
遇到异常时,优先检查权限、路径和日志,多数问题都能快速定位。