在Django项目日常运维中,数据库备份是保障数据安全的核心环节,尤其对于存储了用户数据、业务配置等关键信息的项目,定期备份能有效避免数据丢失带来的损失。本文将以MySQL数据库为例,介绍如何用Python编写脚本实现Django数据库的自动dump备份与定时归档。

环境准备与前置说明
本文示例基于以下环境:Django项目使用MySQL作为数据库,服务器系统为Linux,已安装MySQL客户端工具,且Django项目的数据库配置信息可以从settings.py中获取。如果是其他数据库如PostgreSQL,只需替换对应的dump命令即可,整体逻辑一致。
编写数据库备份核心脚本
首先我们需要编写一个Python脚本,实现读取Django配置、调用dump命令生成备份文件、归档备份文件的功能。
1. 读取Django项目数据库配置
为了避免硬编码数据库信息,我们可以从Django的settings.py中读取数据库配置,脚本需要和Django项目在同一环境运行,或者手动指定DJANGO_SETTINGS_MODULE。
import os
import sys
import time
import subprocess
from datetime import datetime
# 设置Django环境,替换为你的Django项目路径和settings模块
sys.path.append("/path/to/your/django/project")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
import django
django.setup()
from django.conf import settings
def get_db_config():
# 获取Django配置的数据库信息,默认取default数据库
db_config = settings.DATABASES.get("default")
return {
"host": db_config.get("HOST", "localhost"),
"port": db_config.get("PORT", 3306),
"user": db_config.get("USER"),
"password": db_config.get("PASSWORD"),
"database": db_config.get("NAME")
}
2. 实现dump备份与文件归档
接下来编写备份函数,调用MySQL的mysqldump命令生成备份文件,并按照日期归档到指定目录。
def backup_database():
db_config = get_db_config()
# 备份文件存储根目录,可自定义
backup_root = "/data/django_db_backup"
# 按日期创建归档子目录
date_str = datetime.now().strftime("%Y%m%d")
backup_dir = os.path.join(backup_root, date_str)
os.makedirs(backup_dir, exist_ok=True)
# 备份文件名,包含时间戳避免重复
timestamp = datetime.now().strftime("%H%M%S")
backup_file = os.path.join(backup_dir, f"{db_config['database']}_{timestamp}.sql")
# 构建mysqldump命令,注意密码参数如果有特殊字符需要特殊处理
dump_cmd = [
"mysqldump",
f"-h{db_config['host']}",
f"-P{db_config['port']}",
f"-u{db_config['user']}",
f"-p{db_config['password']}",
db_config["database"]
]
try:
# 执行dump命令,将输出写入备份文件
with open(backup_file, "w", encoding="utf-8") as f:
result = subprocess.run(dump_cmd, stdout=f, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
print(f"数据库备份成功,文件路径:{backup_file}")
return backup_file
else:
print(f"数据库备份失败,错误信息:{result.stderr}")
return None
except Exception as e:
print(f"执行备份过程出现异常:{str(e)}")
return None
添加备份文件过期清理功能
为了避免备份文件占用过多磁盘空间,我们可以添加过期文件清理逻辑,比如只保留最近7天的备份文件。
import shutil
def clean_old_backup(keep_days=7):
backup_root = "/data/django_db_backup"
current_time = time.time()
# 遍历备份根目录下的所有子目录
for root, dirs, files in os.walk(backup_root):
for dir_name in dirs:
dir_path = os.path.join(root, dir_name)
# 获取目录的修改时间,超过保留天数的删除
if os.path.getmtime(dir_path) < current_time - keep_days * 86400:
shutil.rmtree(dir_path)
print(f"已删除过期备份目录:{dir_path}")
整合脚本并设置定时任务
将上述功能整合到主函数中,然后可以通过Linux的crontab设置定时执行,实现自动备份。
1. 整合主函数
def main():
# 执行备份
backup_file = backup_database()
if backup_file:
# 备份成功后清理过期文件
clean_old_backup(keep_days=7)
if __name__ == "__main__":
main()
2. 设置定时任务
在Linux服务器上执行crontab -e命令,添加定时任务,比如每天凌晨2点执行备份脚本:
0 2 * * * /usr/bin/python3 /path/to/your/backup_script.py >> /var/log/django_backup.log 2>&1
上述配置表示每天凌晨2点执行备份脚本,执行日志输出到/var/log/django_backup.log中,方便后续排查问题。
注意事项
- 如果数据库密码包含特殊字符,直接拼接在
-p参数后可能报错,建议将密码配置到MySQL的配置文件中,或者在命令执行时通过环境变量传入。 - 不同数据库的dump命令不同,PostgreSQL使用
pg_dump,SQLite可以直接复制数据库文件,只需替换对应的备份命令即可。 - 生产环境建议将备份文件同步到远程存储,避免服务器磁盘故障导致备份文件丢失。
- 定期验证备份文件的有效性,可以偶尔恢复备份文件到测试环境,确认数据完整可用。