• 配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)


    备份

    新建一个脚本/root/backup.py,内容如下:

    #!/usr/bin/env python
    #
    -*- coding: utf-8 -*- ''' 脚本作者:昨夜星辰 脚本作用:配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份) 创建日期:2016年9月22日 ''' import os import datetime import subprocess # MySQL服务root用户的密码 password = 'test' # 用于存放备份的目录 path = '/backup' # 备份周期(单位:天) cycle = 30 # 获取当天的日期 today = datetime.date.today() # 获取昨天的日期 yesterday = today + datetime.timedelta(days=-1) # 判断备份目录下的文件数是否等于备份周期,如果是就清空备份目录。 if len(os.listdir(path)) == cycle: os.system('rm -rf %s/*' % path) # 判断备份目录下是否存在以昨天日期命名的目录,如果是就进行增量备份,否则就进行完整备份。 if os.path.isdir('%s/%s' % (path, yesterday)): cmd = 'innobackupex --password=%s --incremental %s --incremental-basedir=%s/%s --no-timestamp' % (password, path, path, yesterday) else: cmd = 'innobackupex --password=%s %s/%s --no-timestamp' % (password, path, today) # 执行备份命令 subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)

    读者请注意根据自身实际情况修改脚本中的path、password、cycle变量。

    执行下面的命令进入crontab的编辑模式:

    crontab -e

    新增以下内容:

    # 每天凌晨2点自动执行数据库备份脚本
    0 2 * * * python /root/python &> /dev/null

     还原

    # -*- coding: utf-8 -*-
    '''
    脚本作者:昨夜星辰
    脚本作用:使用innobackupex命令还原MySQL服务
    创建日期:2016年9月22日
    '''
    
    import os
    import subprocess
    
    # 用于存放备份的目录
    path1 = '/backup'
    
    # MySQL服务的数据目录
    path2 = '/wwwroot/mysql'
    
    # 获取备份目录下的文件并排序
    d_list = sorted(os.listdir(path1))
    
    # 警告信息
    alert_message = '''
    警告!!!
    请检查脚本中的path1、path2变量是否配置正确。
    还原操作需要停止MySQL服务并清空数据目录,在生产环境中操作需谨慎!
    在硬盘空间足够的前提下,建议重命名数据目录,然后再新建一个同名的数据目录。
    
    比如您的数据目录是/data,那么你可以这么做:
    service mysqld stop
    mv /data /data_bak
    mkdir /data
    '''
    print alert_message
    
    # 询问用户是否继续
    while True:
        answer = raw_input('准备好后就输入“Y”继续,或者输入“N”退出:')
        if answer == 'Y':
            break
        elif answer == 'N':
            exit(0)
        else:
            print '输入有误,请重新输入!'
    
    # 打印日期列表的序号和日期
    for i in range(len(d_list)):
        print '%d. %s' % (i, d_list[i])
    
    # 询问用户需要还原的日期的序号,如果用户输错了,就提示并要求用户重新输入。
    while True:
        try:
            SN = int(raw_input('请输入你想还原的日期对应的序号:'))
            if SN not in range(len(d_list)):
                print '输入有误,请重新输入!'
            elif not os.path.isdir('%s/%s' % (path1, d_list[SN])):
                print '输入有误,请重新输入!'
            else:
                break
        except ValueError:
            print '输入有误,请重新输入!'
    
    # 停止MySQL服务
    os.popen('service mysqld stop')
    
    # 清空MySQL服务的数据目录
    os.popen('rm -rf %s/*' % path2)
    
    print
    
    # 如果SN的值为真,那就说明用户选择了增量备份,需要将所有增量备份按顺序合并到完整备份中。
    if SN:
        print '开始合并所有增量备份到完整备份中...'
        for i in range(SN + 1):
            print '正在合并%s的数据...' % d_list[i]
            if i == 0:
                cmd = 'innobackupex --apply-log --redo-only %s/%s' % (path1, d_list[0])
            elif i == SN:
                cmd = 'innobackupex --apply-log %s/%s --incremental-dir=%s/%s' % (path1, d_list[0], path1, d_list[i])
            else:
                cmd = 'innobackupex --apply-log --redo-only %s/%s --incremental-dir=%s/%s' % (path1, d_list[0], path1, d_list[i])
            subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)
    
    print '正在回滚未提交的事务...'
    # 回滚未提交的事务
    cmd = 'innobackupex --apply-log %s/%s' % (path1, d_list[0])
    subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)
    
    print '开始还原...'
    # 开始还原
    cmd = 'innobackupex --copy-back %s/%s' % (path1, d_list[0])
    subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)
    
    # 变更MySQL数据目录的属主和数组
    os.popen('chown -R mysql.mysql %s' % path2)
    
    # 启动MySQL服务
    os.popen('service mysqld start')
    
    print '还原完毕!'

    读者请注意根据自身实际情况修改脚本中的path1、path2变量。

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs
    LeetCode 02.07. Intersection of Two Linked Lists LCCI
    LeetCode 707. Design Linked List
    centos7 mail
    centos7 安装postgresql10
    centos 7 安装 mail
    解决运行docker命令要用sudo的问题
    Linux 命令速记本
    iterm2配置lrzsz
    截取某段时间内的日志
  • 原文地址:https://www.cnblogs.com/yestreenstars/p/5895429.html
Copyright © 2020-2023  润新知