今天要进行MySQL的数据迁移,所以把数据库通过mydumper工具备份的文件解压后,通过myloader进行导入
但是导入的时间出现这个报错:
** (myloader:766): CRITICAL **: the specified directory is not a mydumper backup
非常奇怪,明明以往导数据都是通过myloader命令可以导入成功的,现在竟然是报错说这个目录不是mydumper的备份文件 查看myloader的源代码,如下
char *p= g_strdup_printf("%s/metadata", directory);
if (!g_file_test(p, G_FILE_TEST_EXISTS)) {
g_critical("the specified directory is not a mydumper backup\n");
exit(EXIT_FAILURE);
}
判断目录下如果 metadata 文件不存在,则异常退出,而我发现备份目录下却有一个 .metedata 文件,注意是有.前缀的,在linux系统下表示是隐藏文件
于是对比了一下mydumper的版本:
myloader -V
myloader 0.6.2, built against MySQL 5.5.21
而原备份文件的机器是 myloader 0.2.3,表示两个版本不相同, 所以我第一反应是把旧机器的 /usr/local/bin/目录下的 mydumper\myloader 文件直接cp到新机器
再用myloader的话,可以导入成功,问题解决。
后面想了一下,再查看旧版本的 myloader
源码,发现判断文件是否存在是 .metadata ,即旧版本导出的隐藏文件,在新版本中已经不需要隐藏的, 可能是作者觉得没必要隐藏该文件,而且隐藏文件会有一个隐患是容易 cp 不完整,cp默认不拷贝隐藏文件,必须通过 cp -a 才能完整拷贝。
所以,如果用myloader新版程序导入旧版本的备份,可以把备份目录下的 .metadata文件改名为 metadata,也可以导入成功
mv .metadata metadata