我有 DB InnoDb innodb_db_1
。我已经打开了 innodb_file_per_table。
如果我转到 var/lib/mysql/innodb_db_1/
,我会找到文件 table_name.ibd、table_name.frm、db.opt
。
现在,我正在尝试将这些文件复制到另一个数据库,例如复制到 innodb_db_2
(var/lib/mysql/innodb_db_2/
) 但没有任何反应。
但如果我的数据库是 MyIsam,我可以用这种方式复制,一切正常。
通过复制InnoDb DB的文件来移动DB有什么建议?
最佳答案
即使您使用 file-per-table,表也会在/var/lib/mysql/ibdata1 中保留一些数据和元数据。因此,您不能只将 .ibd 文件移动到新的 MySQL 实例。
您必须备份和恢复您的数据库。您可以使用:
mysqldump,包含在 MySQL 中,可靠但速度慢。
mydumper ,一个社区贡献的 mysqldump 替代品,它支持压缩和并行执行以及其他简洁的功能。
Percona XtraBackup ,它是免费的,可以执行 InnoDB 的高速物理备份(也支持其他存储引擎)。建议这样做,以最大程度地减少对实时操作的干扰,并且在您的数据库很大的情况下也是如此。
回复你的评论:
不,您不能只复制 .ibd 文件。您不能关闭对 ibdata1 的要求。此文件包括一个数据字典,您可以将其视为一本书的目录。它告诉 InnoDB 您有哪些表,以及它们位于哪个物理文件中。
如果您只是将一个 .ibd 文件移动到另一个 MySQL 实例中,这不会将它添加到该实例的数据字典中。所以 InnoDB 不知道要查看新文件,也不知道它与哪个逻辑表相关。
如果您想要解决方法,您可以ALTER TABLE mytable ENGINE=MyISAM
,将该文件及其 .frm 移动到另一个实例,然后 ALTER TABLE mytable ENGINE=InnoDB
将其改回。请记住在移动 MyISAM 文件之前FLUSH TABLES WITH READ LOCK
。
但是这些步骤不适合初学者。除非您知道自己在做什么,否则使用备份和还原方法会安全得多。我正在努力为您省去一些悲伤。
关于mysql - 移动 InnoDb 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20237058/