基于Python和Xtrbackup的自动化备份与还原实现(5)

current_backup_begin_time = None
        current_backup_end_time = None
        #比较当前备份的结束时间和stop_at,如果当前备份开始时间小于stop_at并且结束时间大于stop_at,解压缩备份结束
        with open(os.path.join(dest_dir,backup_name,"xtrabackup_info"), 'r') as f:
            for line in f:
                if line and line.split("=")[0].strip()=="start_time":
                    current_backup_begin_time = line.split("=")[1].strip()
                if line and line.split("=")[0].strip()=="end_time":
                    current_backup_end_time = line.split("=")[1].strip()
        #按照stop_at时间点还原的最后一个数据库备份,结束从第一个完整备份开始的解压过程
        if current_backup_begin_time<=stop_at<=current_backup_end_time:
            break

#返回最后一个备份文件,需要备份文件中的xtrabackup_info,解析出当前备份的end_time,从而确认需要哪些binlog
    return backup_name


#根据返回最后一个备份文件,需要备份文件中的xtrabackup_info,结合stop_at,确认需要还原的binlog文件,以及binlog的position信息
def restore_database_binlog(last_backup_file):
    print("################restore data from binlog###################")
    binlog_dir = get_config_value("log-bin")
    if not (backup_dir):
        binlog_dir = get_config_value("log_bin")
    print("cd {0}".format(os.path.dirname(binlog_dir)))

last_backup_file =os.path.join(dest_dir,last_backup_file,"xtrabackup_info")
    #parse backuplog.log and get binlog name and position

backup_position_binlog_file = None
    backup_position = None
    with open(last_backup_file, 'r') as f:
        lines = f.readlines()
        for line in lines:
            if "binlog_pos = filename " in line:
                backup_position_binlog_file = line.replace("binlog_pos = filename ", "").split(",")[0]
                backup_position_binlog_file = backup_position_binlog_file.replace("'", "")
                backup_position = line.replace("binlog_pos = filename ", "").split(",")[1].strip()
                backup_position = backup_position.split(" ")[1].replace("'", "")
                pass
            else:
                continue
        # /usr/local/mysql57_data/mysql8000/log/bin_log/mysql_bin_1300
        binlog_config = get_config_value("log-bin")
        binlog_path = os.path.dirname(binlog_config)
        binlog_files = os.listdir(binlog_path)

#如果没有找到binlog,忽略binlog的还原
        if not binlog_files:
            exit(1)

#对binlog文件排序,按顺序遍历binlog,获取binlog的最后的修改时间,与stop_at做对比,判断还原的过程是否需要某个binlogfile
        binlog_files.sort()

binlog_files_for_restore = []
        # 恢复数据库的指定时间点
        stop_at_time = datetime.datetime.strptime(stop_at, '%Y-%m-%d %H:%M:%S')
        for binlog in binlog_files:
            if (".index" in binlog or "relay" in binlog):
                continue

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8e81d74611b96e8bac99544080a10328.html