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