chan

朝生暮死不足笑 但悲百年不足道

【Linux|crontab实践】数据库定时备份


使用的命令如下

50 * * * * /usr/bin/python3 /home/user/backup_mysql.py >> /home/user/backup.log 2>&1

解释:每个小时的50分开始执行此命令

———————————————————————————

python脚本如下

import os
import time
from datetime import datetime

# MySQL 配置
MYSQL_USER = 'root'           # MySQL 用户名
MYSQL_PASSWORD = '123456'  # MySQL 密码
MYSQL_DATABASE = 'gx_day16'  # 要备份的数据库名称

# 备份文件存储路径
BACKUP_DIR = '/home/user/mysql_backups'  # 修改为本地备份目录

# 远程服务器配置
REMOTE_SERVER = '8.138.2.44'          # 目标服务器IP或域名
REMOTE_USER = 'root'              # 目标服务器用户名
REMOTE_DIR = '/home/remote_user/backups'  # 目标服务器存储目录

# 确保本地备份目录存在
if not os.path.exists(BACKUP_DIR):
    os.makedirs(BACKUP_DIR)

# 生成备份文件名(带时间戳)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_filename = f"{MYSQL_DATABASE}_backup_{timestamp}.sql"
backup_filepath = os.path.join(BACKUP_DIR, backup_filename)

# 执行 mysqldump 命令备份
try:
    print("开始备份数据库...")
    dump_command = f"mysqldump -u {MYSQL_USER} -p'{MYSQL_PASSWORD}' {MYSQL_DATABASE} > {backup_filepath}"
    os.system(dump_command)
    print(f"备份完成,文件保存到: {backup_filepath}")
except Exception as e:
    print(f"备份失败:{str(e)}")

# 同步备份文件到远程服务器
try:
    print("同步备份文件到远程服务器...")
    sync_command = f"scp {backup_filepath} {REMOTE_USER}@{REMOTE_SERVER}:{REMOTE_DIR}"
    os.system(sync_command)
    print(f"同步完成:{REMOTE_SERVER}:{REMOTE_DIR}")
except Exception as e:
    print(f"同步失败:{str(e)}")

# 可选:删除超过7天的本地备份文件
#try:
#    print("清理过时的本地备份文件...")
#    now = time.time()
#    for file in os.listdir(BACKUP_DIR):
#        file_path = os.path.join(BACKUP_DIR, file)
#        if os.stat(file_path).st_mtime < now - 7 * 86400:  # 文件修改时间超过7天
#            os.remove(file_path)
#            print(f"删除旧备份文件: {file_path}")
#except Exception as e:
#    print(f"清理失败:{str(e)}")


在/var/log中查看执行情况

Dec 18 10:50:01 hcss-ecs-dd47 CROND[6568]: (root) CMD (/usr/bin/python3 /home/user/backup_mysql.py >> /home/user/backup.log 2>&1 )

解释

从日志内容可以看出,系统在 2024年12月18日 10:50:01 执行了一条由 CROND 调度的任务。任务是由用户 root 运行的,执行的命令是:

/usr/bin/python3 /home/user/backup_mysql.py >> /home/user/backup.log 2>&1

解释:

  1. 任务内容:运行 /home/user/backup_mysql.py 这个 Python 脚本。
  2. 日志输出:将脚本的标准输出和错误输出都重定向到 /home/user/backup.log 文件中(通过 >>2>&1)。
  • >> 表示追加模式写入日志文件,不会覆盖已有内容。
  • 2>&1 表示把标准错误(stderr)重定向到标准输出(stdout)。

如果这个任务是你设置的,可以检查 backup_mysql.py 脚本的内容,确保它正确实现了 MySQL 数据库的备份逻辑,并确认 /home/user/backup.log 是否记录了脚本的执行信息(比如成功与否、错误日志等)。

如需进一步排查问题,可以:

  1. 查看日志文件 /home/user/backup.log
  2. 检查脚本 backup_mysql.py 是否有问题。
  3. 确认 crontab 的调度是否按照预期运行。

———————————————————————————————

再到本地计算机的/home/user下查看相关执行日志文件

可以看出,提示远程的备份服务器提示没有这个目录和文件,优化我们的python代码

import os
import time
from datetime import datetime

# MySQL 配置
MYSQL_USER = 'root'           # MySQL 用户名
MYSQL_PASSWORD = '123456'     # MySQL 密码
MYSQL_DATABASE = 'gx_day16'   # 要备份的数据库名称

# 备份文件存储路径
BACKUP_DIR = '/home/user/mysql_backups'  # 本地备份目录

# 远程服务器配置
REMOTE_SERVER = '8.138.2.44'          # 目标服务器IP或域名
REMOTE_USER = 'root'                  # 目标服务器用户名
REMOTE_DIR = '/home/remote_user/backups'  # 目标服务器存储目录

# 确保本地备份目录存在
os.makedirs(BACKUP_DIR, exist_ok=True)

# 生成备份文件名(带时间戳)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_filename = f"{MYSQL_DATABASE}_backup_{timestamp}.sql"
backup_filepath = os.path.join(BACKUP_DIR, backup_filename)

# 执行 mysqldump 命令备份
try:
    print("开始备份数据库...")
    dump_command = f"mysqldump -u {MYSQL_USER} -p'{MYSQL_PASSWORD}' {MYSQL_DATABASE} > {backup_filepath}"
    os.system(dump_command)
    print(f"备份完成,文件保存到: {backup_filepath}")
except Exception as e:
    print(f"备份失败:{str(e)}")

# 确保远程目录存在并同步备份文件到远程服务器
try:
    print("检查并创建远程目录...")
    # 使用 SSH 创建远程目录
    create_dir_command = f"ssh {REMOTE_USER}@{REMOTE_SERVER} 'mkdir -p {REMOTE_DIR}'"
    os.system(create_dir_command)
    print(f"远程目录已确认:{REMOTE_DIR}")
    
    print("同步备份文件到远程服务器...")
    sync_command = f"scp {backup_filepath} {REMOTE_USER}@{REMOTE_SERVER}:{REMOTE_DIR}"
    os.system(sync_command)
    print(f"同步完成:{REMOTE_SERVER}:{REMOTE_DIR}")
except Exception as e:
    print(f"同步失败:{str(e)}")

# 可选:删除超过7天的本地备份文件
try:
    print("清理过时的本地备份文件...")
    now = time.time()
    for file in os.listdir(BACKUP_DIR):
        file_path = os.path.join(BACKUP_DIR, file)
        if os.path.isfile(file_path) and os.stat(file_path).st_mtime < now - 7 * 86400:  # 文件修改时间超过7天
            os.remove(file_path)
            print(f"删除旧备份文件: {file_path}")
except Exception as e:
    print(f"清理失败:{str(e)}")
-----------------------------------------------------------------

同时,将crontab命令修改为每10分钟执行一次

————————————————————-

10分钟后

完结撒花,完美

评论
还没有评论
    发表评论 说点什么