linux 使用crontab 及python 定时备份mysql
新建目录 /opt/db_backup,vim db_backup.py
写入以下绿色程序:
!/usr/bin/env python3
import os
import shutil
import subprocess
from datetime import datetime
import glob
配置部分
DATABASES = {
'mysql': {
'user': 'root',
'password': 'xxxxx',
'databases': ['osdb', ] # 要备份的数据库列表,此处可以添加多个文件
},
# 可以添加其他数据库类型,如postgresql等
}
BACKUP_ROOT = '/var/backups/databases' # 备份存储根目录
MAX_BACKUPS = 3 # 每个数据库保留的备份数量
def create_backup_dir():
"""创建备份目录"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_dir = os.path.join(BACKUP_ROOT, timestamp)
os.makedirs(backup_dir, exist_ok=True)
return backup_dir
def backup_mysql(db_config, backup_dir):
"""备份MySQL数据库"""
user = db_config['user']
password = db_config['password']
for db_name in db_config['databases']:
backup_file = os.path.join(backup_dir, f'{db_name}.sql.gz')
try:
# 使用mysqldump备份并压缩
cmd = f'mysqldump -u{user} -p{password} --single-transaction {db_name} | gzip > {backup_file}'
subprocess.run(cmd, shell=True, check=True)
print(f'成功备份MySQL数据库: {db_name} 到 {backup_file}')
except subprocess.CalledProcessError as e:
print(f'备份MySQL数据库 {db_name} 失败: {str(e)}')
# 删除可能不完整的备份文件
if os.path.exists(backup_file):
os.remove(backup_file)
def cleanup_old_backups():
"""清理旧的备份文件,只保留每个数据库最近的MAX_BACKUPS个备份"""
for db_type in DATABASES:
for db_name in DATABASES[db_type]['databases']:
# 查找所有备份目录
backup_dirs = sorted(glob.glob(os.path.join(BACKUP_ROOT, '[0-9]*')))
# 为每个数据库查找备份文件
backups = []
for bdir in backup_dirs:
backup_path = os.path.join(bdir, f'{db_name}.sql.gz')
if os.path.exists(backup_path):
backups.append((bdir, backup_path))
# 按目录时间排序(目录名就是时间戳)
backups.sort(key=lambda x: x[0])
# 删除旧的备份文件(保留目录,只删除数据库文件)
for bdir, backup_path in backups[:-MAX_BACKUPS]:
try:
os.remove(backup_path)
os.rmdir(bdir)
print(f'已删除旧备份文件: {backup_path}')
except OSError as e:
print(f'删除旧备份文件 {backup_path} 失败: {str(e)}')
def main():
# 创建备份目录
backup_dir = create_backup_dir()
# 备份MySQL数据库
if 'mysql' in DATABASES:
backup_mysql(DATABASES['mysql'], backup_dir)
# 可以在这里添加其他数据库类型的备份函数
# 清理旧备份
cleanup_old_backups()
if name == 'main':
main()
2、 在linux 系统中 输入命令
chmod +x /path/to/db_backup.py
mkdir -p /var/log/db_backup
mkdir -p /var/backups/databases
chown -R root:root /var/backups/databases /var/log/db_backup
3、 使用 crontab –e 建立定时任务,以下为每分钟执行一次,设置后,查看日志,/var/log/db_backup/backup.log是否存在问题。
-
-
-
-
- /opt/python362/bin/python3 /opt/db_backup/db_backup.py >> /var/log/db_backup/backup.log 2>&1
0 21 * * * 每天晚上21点
- /opt/python362/bin/python3 /opt/db_backup/db_backup.py >> /var/log/db_backup/backup.log 2>&1
-
-
-
4、 systemctl enable mariadb 设置自动开机启动mariadb
5、 .gz文件的解压缩命令是gzip -d

浙公网安备 33010602011771号