我有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文件来移动数据库有哪些建议?
答案 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 DATABASE
和CREATE 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.
执行该程序的条件是:
在我的情况下,我不得不移动整个150Gb MySql数据库(最大的表有aprox。60Gb)。制作sqldump并将它们加载回来不是一个选择(太慢)。
所以我做的是我对mysql数据库(mysql doc)进行了“冷备份”,然后将文件移动到另一台计算机。
此处描述了移动数据库后的步骤dba stackexchange。
我正在写这篇文章,因为(假设你能够遵循上述条件)这是迄今为止移动(大)MySql InnoDb的最快(最简单的最简单)方法,而且还没人提到它。