2013-11-27 26 views
4

我有DB InnoDb innodb_db_1。我打开了innodb_file_per_table。移动InnoDb DB

如果我去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

,该表保持对他们的一些数据和元数据在/ 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

但这些步骤不适合初学者。除非您知道自己在做什么,否则使用备份还原方法会更安全。我试图救你一些悲伤。

+0

但我可以关闭在var/lib/mysql/ibdata1中保留一些值和元数据吗?有没有机会通过文件复制它? – sergio

+0

不知道mydumper和XtraBackup! (每天学习新东西) – Barranka

+0

@sergio数据库损坏了吗?这是你想手动复制文件的原因吗? – Barranka

3

据我所知,“热复制”表格文件是一个非常糟糕的主意(我已经做了两次,并且只是使它与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

+0

呃,但是我遵循这个指示,并没有帮助我。 – sergio

+0

感谢您关于备份和恢复的链接! – sergio

2

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

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

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

在MySQL 5.6之前,引入了transportable tablespaces,这不是受支持的操作。如果您使用的是MySQL 5.6,则链接为您提供了有关如何工作的信息。

的选择:

  • 使用mysqldump [options] database_name > dumpfile.sql没有--databases选项,这将倾倒在指定的数据库中的表,但将省略任何DATABASE命令(DROP DATABASECREATE DATABASEUSE),部分或全部基于指定选项的组合,通常将其添加到转储文件中。然后你可以用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;,复制他们结束了,然后改变一切回到InnoDB。不是最好的想法,因为你将失去所有的外键声明,并且必须将它们添加回原始表,但它是一种替代方案。

1

有一个简单的过程,从PC上移动整个Mysql的InnoDB的PC机B.

的条件来执行的程序是:

  1. 你需要有innodb_file_per_table选项设置
  2. 你需要能够使数据库

的关闭在我的情况我不得不移动整个150Gb MySql数据库(最大的桌子有aprox。 60GB)。制作sqldumps并加载它们不是一个选项(太慢)。

所以我做了什么是我做了一个“冷备份”的mysql数据库(mysql doc),然后简单地将文件移动到另一台计算机。

移动数据库后要做的步骤在这里描述dba stackexchange。因为(假设您能够遵循上述条件),这是迄今为止移动(大)MySql InnoDb最快(最简便)的方法,但没有人提到它。