最可靠轻量的MySQL备份方式是subprocess调用mysqldump,因其原生支持事务锁、压缩、忽略表、视图及字符集元数据处理,避免Python手动导出的内存溢出、编码错误和元数据遗漏问题。

直接用 subprocess 调用 mysqldump 是最可靠、最轻量的方式,不依赖第三方库,也避开 Python MySQL 驱动对大导出的内存和超时限制。
为什么不用 Python 连接 MySQL 后逐表导出?
因为 mysqldump 原生支持锁表控制(--single-transaction)、压缩(--compress)、忽略特定表(--ignore-table),且能正确处理视图、存储过程、字符集元数据——Python 手动拼 SQL 或 fetchall 生成 SQL 容易漏掉这些细节,还可能因 BLOB 字段或长文本触发内存溢出或编码错误。
常见错误现象:UnicodeEncodeError、导出 SQL 缺少 CREATE DATABASE、恢复时报 Unknown collation: 'utf8mb4_0900_ai_ci'。
- 务必在命令中显式指定
--default-character-set=utf8mb4 - 加
--skip-lock-tables(InnoDB 下推荐用--single-transaction) - 避免在 Python 中用
os.system(),改用subprocess.run()并捕获stderr
如何用 subprocess 安全调用 mysqldump 并捕获失败?
关键不是“能不能跑”,而是“失败时能否立刻知道原因”。mysqldump 出错不会抛异常,只返回非零退出码 + 错误信息到 stderr。
实操建议:
- 用
subprocess.run(),设check=False,再手动检查result.returncode -
stderr必须重定向为subprocess.PIPE,否则日志丢失 - 密码不要写在命令行(会泄露到
ps和 shell history),改用配置文件~/.my.cnf - 示例命令片段:
mysqldump --defaults-file=/home/user/.my.cnf --single-transaction --routines --triggers --events --default-character-set=utf8mb4 mydb > /backup/mydb_20240520.sql
定时执行该脚本的三种可行方式及取舍
Linux 下首选 cron,Windows 下用任务计划程序;不推荐 Python 自带的 schedule 库——进程挂掉就停,无持久化、无错误通知、不支持分布式。
使用场景与坑:
-
cron:确保脚本开头有#!/usr/bin/env python3,且PATH包含mysqldump(常需在 crontab 里加PATH=/usr/local/bin:/usr/bin:/bin) - 备份路径权限问题:cron 以用户身份运行,但可能没写入
/backup的权限,建议用绝对路径并chown明确归属 - 每天保留 7 天备份:
find /backup -name "mydb_*.sql" -mtime +7 -delete放在 dump 后执行
真正容易被忽略的是字符集一致性——本地 MySQL 配置、mysqldump 命令、目标服务器恢复时的 mysql 客户端三者必须统一用 utf8mb4,否则中文变 ? 或导入失败。别信“默认一样”,查 mysql --version 和 mysqldump --version 的输出,版本差一个大号就可能默认字符集不同。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











