移动InnoDb DB

时间:2013-11-27 08:14:25

标签: 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_2var/lib/mysql/innodb_db_2/),但没有任何反应。

但如果我的数据库是MyIsam,我可以这样复制,一切都可以。

通过复制InnoDb DB文件来移动数据库有哪些建议?

4 个答案:

答案 0 :(得分:4)

即使使用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

但这些步骤不适合初学者。使用备份和放大器会更加安全。恢复方法,除非你知道你在做什么。我试图为你节省一些悲伤。

答案 1 :(得分:2)

据我所知,“热拷贝”表文件是一个非常糟糕的主意(我已经完成了两次,只能使它与MyISAM表一起使用,而且我之所以这样做只是因为我别无选择)

我的个人推荐是:使用mysqldump。在你的shell上:

mysqldump -h yourHost -u yourUser -pYourPassword yourDatabase yourTable > dumpFile.sql

要将数据从转储文件复制到shell上的另一个数据库:

mysql -h yourHost -u yourUser -pYourPassword yourNewDatabase < dumpFile.sql

检查:mysqldump — A Database Backup Program


如果您坚持手动复制InnoDB文件,请阅读:Backing Up and Recovering an InnoDB Database

答案 2 :(得分:2)

您可以整天复制MyISAM表(安全地,只要它们被刷新并锁定或服务器停止)但您无法使用InnoDB执行此操作,因为两个存储引擎处理表和表空间的方式截然不同。

  • MyISAM通过迭代为数据库命名的目录中的文件来自动发现表。

  • InnoDB有一个存储在系统表空间(ibdata1)中的内部数据字典。表格不仅必须一致,.ibd文件中的标识符必须与数据字典内部存储的标识符相匹配。

在MySQL 5.6之前,随着transportable tablespaces的引入,这不是受支持的操作。如果您使用的是MySQL 5.6,该链接将为您提供有关其工作原理的信息。

备选方案:

  • 使用mysqldump [options] database_name > dumpfile.sql 而不使用 --databases选项,它会将表转储到指定的数据库中,但会省略任何DATABASE命令({{ 1}},DROP DATABASECREATE DATABASE),基于指定选项的组合,部分或全部通常会添加到转储文件中。然后,您可以使用USE

  • 导入此内容
  • mysql [options] < dumpfile.sql CREATE TABLE db2.t1 LIKE db1.t1;(对于每个表;您必须重新添加任何外键约束)

  • 每个表上的
  • INSERT INTO db2.t1 SELECT * FROM db1.t1;,将其更改为ALTER TABLE,然后使用MyISAM刷新并锁定表,将其复制,然后将所有内容更改回FLUSH TABLES WITH READ LOCK; }。不是最好的主意,因为你将丢失所有外键声明,并且必须将它们添加回原始表格,但它是另一种选择。

答案 3 :(得分:1)

有一个简单的过程可以将整个Mysql InnoDB从PC A移动到PC B.

执行该程序的条件是:

  1. 您需要设置innodb_file_per_table选项
  2. 您需要能够关闭数据库
  3. 在我的情况下,我不得不移动整个150Gb MySql数据库(最大的表有aprox。60Gb)。制作sqldump并将它们加载回来不是一个选择(太慢)。

    所以我做的是我对mysql数据库(mysql doc)进行了“冷备份”,然后将文件移动到另一台计算机。

    此处描述了移动数据库后的步骤dba stackexchange

    我正在写这篇文章,因为(假设你能够遵循上述条件)这是迄今为止移动(大)MySql InnoDb的最快(最简单的最简单)方法,而且还没人提到它。