MySQL定时备份是保障数据安全的基础手段,核心思路是利用mysqldump工具把数据库导出为SQL文件,再交给系统定时任务周期性执行。相比商业备份方案,这种组合零成本、易排查,适合绝大多数中小业务。下面直接进入配置环节。

一、备份前的基础准备
在开始写备份脚本之前,需要先确认MySQL服务运行状态以及拥有导出权限的账号。通常不建议在脚本里直接使用root账号,而是创建一个仅具备SELECT和LOCK TABLES权限的备份专用用户,降低密码泄露带来的风险。
创建备份用户的SQL如下,其中backup_user只能从本机连接,并且仅能读取所有库表。实际生产中请根据库范围收紧权限,例如只授权特定数据库。
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password'; GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;
另外要选定备份文件存放目录,建议单独挂载一块磁盘或分区,避免系统盘写满导致数据库异常。目录权限应设为只有执行备份的用户可写,例如 /data/mysql_backup,权限700。
二、编写全量备份脚本
全量备份指每次把整个实例或指定库导出成文件。它的优点是恢复简单,缺点是占用空间大、耗时随数据增长而增加。对于日增量不大的业务,每天一次全量是完全可行的。
下面是一段Bash备份脚本示例,使用mysqldump的--single-transaction参数保证InnoDB一致性,并用gzip压缩减少体积。文件名带上日期,方便后续清理和追溯。
#!/bin/bash # MySQL自动全量备份脚本 BACKUP_DIR=/data/mysql_backup MYSQL_USER=backup_user MYSQL_PASS=strong_password DATE=$(date +%Y%m%d_%H%M%S) # 导出所有数据库并压缩 mysqldump -u$MYSQL_USER -p$MYSQL_PASS --single-transaction --routines --events --all-databases | gzip > $BACKUP_DIR/full_$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
脚本中--routines和--events确保存储过程和事件也被导出。若只备份单个库,把--all-databases换成具体库名即可。注意密码写在命令行可能被ps进程列表看到,更安全的做法是使用配置文件.my.cnf并设600权限,脚本里只写--defaults-extra-file。
三、用crontab配置定时任务
Linux自带的cron服务最适合做这种周期性调度。通过crontab -e编辑当前用户的任务表,添加一行指定每天凌晨两点执行上面的脚本。时间表达式格式为分 时 日 月 周。
以下配置表示每日02:00运行备份脚本,并重定向输出到日志,避免邮件骚扰。请确保脚本有可执行权限(chmod +x)。
0 2 * * * /bin/bash /data/mysql_backup/backup.sh >> /data/mysql_backup/cron.log 2>&1
配置完成后可用crontab -l查看,也可手动执行一次脚本验证产出文件。若系统启用了SELinux,还需放行备份目录的读写上下文,否则cron可能静默失败。
四、备份校验与过期清理
只生成文件不算完事,还得确认文件能正常恢复。简单的校验方式是用gzip -t检查压缩包完整性,以及定期在测试库做source导入演练。很多故障源于备份了空文件或锁表失败。
清理策略同样关键,不然磁盘迟早被撑爆。可以在脚本末尾加一段保留最近七天的逻辑,或者单独写清理脚本由cron调用。下面示例删除修改时间超过七天的备份:
# 清理七天前的备份
find $BACKUP_DIR -name "full_*.sql.gz" -mtime +7 -exec rm -f {} ;
对于数据量极大、全量备份窗口过长的场景,可改为每周全量加每日binlog增量,但恢复链路会变复杂。选型时应在运维成本与恢复目标之间权衡。
五、常见误区与注意事项
一个常见误区是认为mysqldump会锁全表,其实对InnoDB加--single-transaction后是通过快照读实现无锁一致性,仅MyISAM仍需读锁。另一误区是把备份文件放在数据库同一块盘,一旦磁盘损坏备份也跟着丢失。
此外,cron环境变量很少,脚本里尽量用绝对路径调用mysqldump和gzip,或者在脚本头部export PATH。最后,备份密码不要明文进版本库,可用运维密钥管理或文件权限控制替代。