mysql - 移动 InnoDb 数据库

标签 mysql innodb myisam

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

相关文章:

mysql - 将 MySQL InnoDB 数据库移动到单独的驱动器

mysql - 如何在 MyISAM 中没有指定引擎的情况下导入 mysqldump

mysql - 用户访问被拒绝(NodeJS 和 MySQL)

php - 来自数据库列的随机值,但在 Laravel 中仅出现一次

mysql - 使用 24GB 服务器的 MySQL 内存不足

mysql - MySQL 的默认 ON DELETE 行为是什么?

mysql - 从不同的表中选择字段

php - 在一个 sql 查询中选择最大值和最小值

mysql - 如何像 MyISAM 一样快速地将数据导入 InnoDB 表

mysql - MySQL 5.7中MyISAM和InnoDB存储引擎之间的当前差异是什么?