【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
解释:
- 任务内容:运行
/home/user/backup_mysql.py这个 Python 脚本。 - 日志输出:将脚本的标准输出和错误输出都重定向到
/home/user/backup.log文件中(通过>>和2>&1)。
>>表示追加模式写入日志文件,不会覆盖已有内容。2>&1表示把标准错误(stderr)重定向到标准输出(stdout)。
如果这个任务是你设置的,可以检查 backup_mysql.py 脚本的内容,确保它正确实现了 MySQL 数据库的备份逻辑,并确认 /home/user/backup.log 是否记录了脚本的执行信息(比如成功与否、错误日志等)。
如需进一步排查问题,可以:
- 查看日志文件
/home/user/backup.log。 - 检查脚本
backup_mysql.py是否有问题。 - 确认
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分钟后


完结撒花,完美