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点

4、 systemctl enable mariadb 设置自动开机启动mariadb
5、 .gz文件的解压缩命令是gzip -d

posted @ 2025-07-26 10:33  清净吉祥祥祥  阅读(19)  评论(0)    收藏  举报