应使用 mysqldump 做定时备份而非 python 拼 sql:mysqldump 官方推荐、支持结构/视图/存储过程;配合 crontab 定时、企业邮箱发告警邮件、带时间戳命名与自动清理,并校验文件完整性及磁盘空间。

用 mysqldump 做定时备份,别在 Python 里拼 SQL 命令
Python 本身不直接导出 MySQL 全库数据,mysqldump 是官方推荐、稳定可靠的命令行工具。硬用 mysql-connector-python 或 pymysql 逐表查再写文件,容易漏结构、丢索引、不兼容视图/存储过程,还可能因超时中断。
实操建议:
- 确保服务器已安装
mysqldump(通常随 MySQL Server 一起安装),执行which mysqldump验证路径 - 用系统用户(如
mysqlbackup)而非 root 运行备份脚本,该用户只需SELECT和LOCK TABLES权限 - 命令示例:
mysqldump -h127.0.0.1 -u$user -p$password --single-transaction --routines --triggers --events $dbname | gzip > /backup/db_$dbname_$(date +\%Y\%m\%d_\%H\%M).sql.gz -
--single-transaction对 InnoDB 安全,但对 MyISAM 无效;若混用引擎,改用--lock-all-tables
用 smtplib 发邮件时,避免被当垃圾邮件
直接调 smtplib.SMTP 发信,如果没配好认证或发件头,90% 概率进收件方垃圾箱,甚至被拒收。
实操建议:
- 优先用企业邮箱 SMTP(如腾讯企业邮、阿里云邮件推送),别用个人 QQ/163 邮箱——它们对脚本发信限制极严
- 必须设置
From和Reply-To为同一域名下的邮箱,且该域名需配置 SPF、DKIM 记录 - 邮件正文用
MIMEText,编码设为utf-8;附件用MIMEApplication,不要用 base64 手动编码 - 示例关键段:
msg = MIMEMultipart()<br>msg["From"] = "backup@yourcompany.com"<br>msg["To"] = "admin@yourcompany.com"<br>msg["Subject"] = Header(f"MySQL 备份完成 - {dbname}", "utf-8")<br>part = MIMEApplication(open(backup_file, "rb").read())<br>part.add_header("Content-Disposition", f"attachment; filename={os.path.basename(backup_file)}")<br>msg.attach(part)
用 crontab 而不是 Python 的 schedule 做定时
schedule 库依赖 Python 进程常驻,一旦脚本异常退出或服务器重启,备份就停了,且无法精确控制运行用户和环境变量。
实操建议:
- 用
crontab -e编辑指定用户的定时任务,例如每天凌晨 2 点:0 2 * * * /usr/bin/python3 /opt/scripts/mysql_backup.py >> /var/log/mysql_backup.log 2>&1 - 务必在 crontab 中显式声明
PATH和必要环境变量,比如:PATH=/usr/local/bin:/usr/bin:/bin - Python 脚本开头加
#!/usr/bin/env python3,并chmod +x,避免 crontab 找不到解释器 - 日志重定向必须分开 stdout 和 stderr(
>>和2>&1),否则失败时看不到错误信息
备份文件命名和清理要带时间戳与保留策略
不带时间戳的文件名(如 backup.sql)会导致覆盖,而无限堆积又会撑爆磁盘——这是线上事故高发点。
实操建议:
- 文件名必须含完整时间戳,推荐格式:
db_name_20240520_0200.sql.gz(年月日_时分),方便按字典序排序和查找 - 清理逻辑写在脚本末尾,用
find /backup -name "db_*\.sql\.gz" -mtime +7 -delete删除 7 天前的文件 - 备份前先检查磁盘剩余空间:
df -h /backup | awk 'NR==2 {print $5}' | sed 's/%//',低于 20% 就跳过本次并邮件告警 - 每次备份后校验 gzip 文件完整性:
gzip -t $file,失败则立即发紧急邮件,不继续后续流程
备份脚本真正难的不是写几行代码,而是让每次执行都可预期:路径权限对不对、磁盘够不够、网络断没断、邮箱能不能收。这些细节不提前压一遍,出问题时根本没法快速定位。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











