现象:
数据库的binlog和data放在同一个目录下,使用xtrabackup的copy-back拷贝回原data目录时发现mysqlbin.index内容发生了变化,导致恢复后重启失败
触发条件:
配置文件存在log-bin配置,以及配置存储路径为data目录。
初步分析:
D:\project\percona-xtrabackup-8.0.13\storage\innobase\xtrabackup\src\backup_copy.cc
xtrabackup执行copy-back时会先通过binlog_file_location::find_binlog找到binlog文件和binlog索引文件信息,并存储到binlog_file_location类型的结构体变量(binlog、target)中,主要信息如下:
binlog结构体变量主要通过遍历备份目录更新以上信息,更新后如下所示
更新target结构体变量时,此处仅取了opt_log_bin(/data2/sf/zgj/data8022/mysqlbin)的目录长度,即r.name=/data2/sf/zgj/data8022/ + .000005,也因此返回了一个奇怪的target.name信息。
在拷贝binlog.index时是将binlog.index_name.c_str()的内容拷贝到target.index_path.c_str()中,该过程完成后的binlog.index正常,但后面一步的fixup binlog index,由于binlog和data处于同一目录下,会执行f_index << target.name.c_str() << std::endl;操作,错误的target.name信息将被写入到target.index_path中。