我有 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/

    10-12 19:03
    查看更多