mysql全量备份、增量备份、其他文件备份(Python自动化处理并上传到FTP服务器)



需求: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值