需求:mysql定时全量备份数据库和每天增量备份数据库以及备份文件夹并压缩上传到FTP服务器
一、数据库工作准备
1、数据库执行如下命令后Log_bin为OFF的话,需要修改为ON(修改方式自行百度)
2、修改My.ini文件
[mysqld]
server_id=1
log_bin=“mysql-bin”
max_binlog_size=1024M
3、重启mysql,任务管理器服务里重启mysql或使用命令
4、初始化日志信息(执行一次即可)
Cmd执行如下命令,路径根本本地调整:
mysqldump -uroot -proot --flush-logs --delete-master-logs --lock-all-tables --all-databases > F:\mysqlbackup01\20230531-add.sql
5、验证:操作数据后,查看mysql的Data文件夹,出现如下文件说明成功(在2、中可修改文件名称)
二、python脚本处理代码(多进程)
注:根据需求选择代码逻辑,本代码只是个人使用例子
# -*- coding: utf-8 -*-
import os, shutil, datetime, time, zipfile
from multiprocessing import Process
from time import sleep
from ftplib import FTP
# 全量备份sql路径,每周执行一次
full_mysql_path = r'E:\ProgramData\MySQL\1'
# 增量备份路径,每天一次
increment_mysql_path = r'E:\ProgramData\MySQL\2'
# 配置mysql的Data目录
dir = r'E:\ProgramData\MySQL\MySQL Server 5.7\Data'
# 配置versiondata文件夹目录
folder_path = r'H:\111\20230509\server\VersionData'
# FTP连接信息
FTP_HOST = '192.168.10.182' #ftp所在机器的IP
FTP_USER = 'FTPGD' #用户名
FTP_PASS = 'LOVE123456' #密码
current_time = datetime.datetime.now().strftime('%Y%m%d')
day_time = datetime.datetime.now().strftime('%H')
Satur_day = time.strftime("%A")
# 全量备份函数,每周六0点定时备份
def cz_part_one():
while True:
# 判断是否为周六和要备份的目录是否已存在
path_tf = os.path.exists(full_mysql_path + '\\' + current_time + '.sql')
if Satur_day == 'Wednesday' and path_tf == False:
# 生成全量备份sql文件
os.system("mysqldump -uroot -proot --skip-opt --all-databases > {0}\\{1}.sql".format(full_mysql_path,
current_time))
# 本地路径和文件信息
FILE_NAME = current_time + '.sql'
# zip压缩文件到当前路径
zip_file = zipfile.ZipFile('QuanL-' + current_time + '.zip', 'w')
zip_file.write(os.path.join(full_mysql_path, FILE_NAME))
zip_file.close()
# 上传文件到FTP
ftp = FTP(FTP_HOST)
ftp.login(user=FTP_USER, passwd=FTP_PASS)
ftp.cwd('./') # 切换到FTP远程目录
with open('QuanL-' + current_time + '.zip', 'rb') as f:
ftp.storbinary('STOR ' + 'QuanL-' + current_time + '.zip', f)
# 删除本地压缩文件
os.remove('QuanL-' + current_time + '.zip')
# 关闭FTP连接
ftp.quit()
else:
print("已存在该日期全量SQL文件:" + full_mysql_path + '\\' + current_time + '.sql')
sleep(60)
# 增量量备份函数,每天23点定时备份数据库和versiondata文件夹
def cz_part_two():
while True:
# 判断是否为当天的23点和要备份的目录是否已存在
path_zl = os.path.exists(increment_mysql_path + '\\' + current_time)
if day_time == str(11) and path_zl == False:
file_lists1 = os.listdir(dir)
print(file_lists1)
file_lists_dd = []
for i in file_lists1:
if 'mysql-bin' in i:
file_lists_dd.append(i)
file_lists_dd.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn)
if not os.path.isdir(dir + "\\" + fn) else 0)
file_new_dd = file_lists_dd[-1] # 要生成的sql文件名
file_luj_dd = os.path.join(dir, file_lists_dd[-1])
print(file_luj_dd)
increment_copy_path = increment_mysql_path + '\\{0}\\{1}'.format(current_time, file_new_dd)
print(increment_copy_path)
os.mkdir(r'{0}\{1}'.format(increment_mysql_path, current_time))
shutil.copyfile(file_luj_dd, increment_copy_path)
os.system("mysqlbinlog --no-defaults {0} > {1}.sql".format(increment_copy_path, increment_copy_path))
# 定义允许的文本文件类型
text_extensions = ['.txt', '.json', '.sql']
Complete_route = [{folder_path: 'Versiondata-'}, {increment_mysql_path: 'Zliang-'}]
for i in range(2):
fell = Complete_route[i]
keys = [key for key in fell.keys()][0]
values = [values for values in fell.values()][0]
# 打开压缩文件
with zipfile.ZipFile(str(values) + current_time + '.zip', 'w',
compression=zipfile.ZIP_DEFLATED) as zip_file:
# 遍历目录下的所有文件
for root, dirs, files in os.walk(str(keys)):
for file in files:
file_path = os.path.join(root, file)
# 判断文件是否为文本文件
if os.path.splitext(file_path)[1] in text_extensions:
with open(file_path, 'rb') as f:
# 将文本文件写入到压缩文件中
zip_file.writestr(os.path.relpath(file_path, str(keys)), f.read())
# 上传文件到FTP
ftp = FTP(FTP_HOST)
ftp.login(user=FTP_USER, passwd=FTP_PASS)
ftp.cwd('./') # 切换到FTP远程目录
with open(str(values) + current_time + '.zip', 'rb') as f:
ftp.storbinary('STOR ' + str(values) + current_time + '.zip', f)
# 关闭FTP连接
ftp.quit()
# 删除本地压缩文件
os.remove(str(values) + current_time + '.zip')
else:
print("已存在该日期增量SQL文件和VersionData文件:" + increment_mysql_path + '\\' + current_time)
sleep(60)
if __name__ == "__main__":
Process(target=cz_part_one).start()
Process(target=cz_part_two).start()
三、数据库还原
CMD执行如下命令即可:
注:先还原全量,再还原增量,同时还原versiondata文件夹
source F:\backup\20230531-Increase\zengliang.sql