,")[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
#保留最后一个备份中的binlog,以及其后面的binlog,这部分binlog会在还原的时候用到
if (int(binlog.split(".")[-1]) >= int(backup_position_binlog_file.split(".")[-1])):
binlog_files_for_restore.append(binlog)
binlog_file_count = 0
#第一个文件,从上最后一个差异备份的position位置开始,最后一个文件,需要stop_at到指定的时间
for binlog in binlog_files_for_restore:
if not os.path.isdir(binlog):
#binlog物理文件的最后修改时间
binlog_file_updatetime = datetime.datetime.strptime(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.stat(binlog_path+"/"+binlog).st_mtime)),'%Y-%m-%d %H:%M:%S')
#判断binlog的生成时间,是否大于stop_at,对于修改时间大于stop_at的日志,需要全部还原,不需要stop_at指定截止点
if stop_at_time > binlog_file_updatetime :
if (binlog_file_count < 1):
if (len(binlog_files_for_restore) == 1):
# 找到差异备份之后的第一个binlog,需要根据差异备份的position,来过来第一个binlog文件
restore_commond = '''mysqlbinlog {0} --skip-gtids=true --start-position={1} --stop-datetime="{2}" | mysql mysql -h{3} -u{4} -p{5} -P{6}''' \
.format(binlog, backup_position, stop_at, host, u