日常开发中,数据库备份是必备操作。手动备份不仅麻烦,还容易忘 —— 用 Python 写个自动化脚本,搭配定时任务,就能实现 “无人值守” 的 MySQL 备份,省心又可靠。
一、实现思路
- 用
subprocess模块调用 MySQL 自带的mysqldump工具,生成数据库备份文件; - 给备份文件命名(包含时间戳,避免重名);
- 可选:将备份文件压缩(节省空间);
- 搭配系统定时任务(比如 Linux 的 crontab),实现定时自动执行。
二、准备工作
- 确保环境已安装 Python(3.x 版本);
- MySQL 已安装
mysqldump工具(一般随 MySQL 一起安装); - 知道 MySQL 的用户名、密码、数据库名,以及备份文件要存放的目录。
三、Python 脚本代码实现
python
运行
import subprocess import time import os import zipfile # ---------------------- 配置项(根据你的实际情况修改) ---------------------- MYSQL_USER = "root" # MySQL用户名 MYSQL_PASSWORD = "your_pwd" # MySQL密码 MYSQL_DB = "test_db" # 要备份的数据库名 BACKUP_DIR = "/opt/mysql_backup" # 备份文件存放目录 # -------------------------------------------------------------------------- # 1. 创建备份目录(如果不存在) if not os.path.exists(BACKUP_DIR): os.makedirs(BACKUP_DIR) # 2. 生成备份文件名(包含时间戳,格式:数据库名_年-月-日_时-分-秒.sql) timestamp = time.strftime("%Y-%m-%d_%H-%M-%S") backup_filename = f"{MYSQL_DB}_{timestamp}.sql" backup_filepath = os.path.join(BACKUP_DIR, backup_filename) # 3. 调用mysqldump执行备份 try: # 拼接mysqldump命令(注意:密码直接写在命令里有安全风险,生产环境建议用配置文件) cmd = f"mysqldump -u{MYSQL_USER} -p{MYSQL_PASSWORD} {MYSQL_DB} > {backup_filepath}" # 执行命令 subprocess.run(cmd, shell=True, check=True) print(f"数据库备份成功!文件路径:{backup_filepath}") except subprocess.CalledProcessError as e: print(f"备份失败:{e}") exit(1) # 4. (可选)压缩备份文件(用zip格式) zip_filename = f"{backup_filepath}.zip" with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: zipf.write(backup_filepath, arcname=backup_filename) # 压缩后删除原sql文件(可选) os.remove(backup_filepath) print(f"文件压缩成功!压缩包路径:{zip_filename}")
四、脚本使用说明
- 修改代码中的配置项(用户名、密码、数据库名、备份目录);
- 运行脚本:
python3 mysql_backup.py,执行后去备份目录看是否生成了压缩包; - 定时执行(以 Linux 为例):
- 打开 crontab 编辑:
crontab -e; - 添加定时任务(比如每天凌晨 2 点执行):bash
运行
0 2 * * * /usr/bin/python3 /path/to/your/mysql_backup.py >> /var/log/mysql_backup.log 2>&1
- (解释:
0 2 * * *代表每天 2 点,后面是脚本路径,最后把日志输出到指定文件)
五、注意事项
- 密码安全:脚本里直接写密码有风险,生产环境可以把 MySQL 用户名 / 密码写在
~/.my.cnf配置文件中,避免明文暴露; - 备份清理:定期清理旧的备份文件(可以在脚本里加 “删除 7 天前的备份” 逻辑);
- 权限问题:确保执行脚本的用户有 MySQL 的备份权限,以及备份目录的读写权限。