Answers:
InnoDB的体系结构要求使用四种基本类型的信息页面
默认情况下,禁用innodb_file_per_table。这将导致所有四种信息页面类型都进入一个名为ibdata1的文件。许多人试图通过制作多个ibdata文件来分散数据。这可能导致数据页和索引页碎片。
这就是为什么我经常建议使用默认的ibdata1文件清理InnoDB基础架构,而仅此而已。
由于InnoDB所处的基础架构,因此复制非常危险。有两个基本基础架构
随着innodb_file_per_table禁用,所有这些类型的InnoDB的信息生活ibdata1中内。ibdata1之外的任何InnoDB表的唯一表现是InnoDB表的.frm文件。一次复制所有InnoDB数据需要复制所有/ var / lib / mysql。
复制单个InnoDB表是完全不可能的。您必须使用MySQL转储来提取表的转储,以作为数据及其对应的索引定义的逻辑表示。然后,您可以将该转储加载到同一台服务器或另一台服务器上的另一个数据库中。
随着innodb_file_per_table启用,表中的数据及其索引住在数据库文件夹旁边的.frm文件。例如,对于表db1.mytable,该InnoDB表在ibdata1之外的表现为:
/var/lib/mysql/db1/mytable.frm
/var/lib/mysql/db1/mytable.ibd
ibdata1
db1.mytable的所有元数据仍然驻留在ibdata1中,并且绝对没有办法解决。重做日志和MVCC数据仍然与ibdata1一起存在。
关于表碎片,这是ibdata1发生的情况:
ALTER TABLE db1.mytable ENGINE=InnoDB;
或收缩db1.mytablesOPTIMIZE TABLE db1.mytable;
。这导致/var/lib/mysql/db1/mytable.ibd在物理上较小,没有碎片。ALTER TABLE db1.mytable ENGINE=InnoDB;
或收缩db1.mytables,OPTIMIZE TABLE db1.mytable;
因为它驻留在ibdata1中。实际上运行这两个命令,可使表连续且读写更快。不幸的是,这发生在ibdata1的末尾。这使ibdata1快速增长。我的InnoDB清理帖子中已完全解决了这一问题。如果您只想复制.frm和.ibd文件,那么您就很容易受到伤害。仅当且仅当您可以确保.ibd文件的表空间ID与ibdata1文件的元数据中的表空间ID项完全匹配时,才可以复制InnoDB表的.frm和.ibd 文件。
我在DBA StackExchange中写了两篇有关此表空间ID概念的文章
这是有关在表空间ID不匹配的情况下如何将任何.ibd文件重新附加到ibdata1的绝佳链接:http : //www.chriscalender.com/ ? tag=innodb-error-tablespace-id-in-file 。读完这篇文章后,您应该立即意识到复制.ibd文件简直是疯狂。
对于InnoDB,您只需要进行一些操作即可
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
制作一个InnoDB表的副本。
如果要将其迁移到另一个数据库服务器,请使用mysqldump。
关于混合所有数据库中的所有InnoDB表,我实际上可以看到这样做的智慧。在我的雇主的DB / Web托管公司中,我有一个MySQL客户端,该客户端在一个数据库中具有一个表,该表的约束映射到同一MySQL实例中另一个数据库中的另一个表。通过一个通用的元数据存储库,它使跨多个数据库的事务支持和MVCC可操作性成为可能。
您可以通过将innodb-file-per-table添加到cnf中来切换InnoDB以按文件存储表。
Innodb实际上只是在乎基本的数据页面。实际上,您可以将InnoDB设置为仅使用没有文件系统的原始块设备!http://dev.mysql.com/doc/refman/5.5/en/innodb-raw-devices.html
存储文件表很方便,例如可以通过优化更轻松地重新获得使用的空间。
即使每个表都有文件,您也不能如此轻松地复制ibd文件,因为InnoDB是事务性的,并将有关其状态的信息存储在全局共享的ibdata / log文件中。
这并不是说它无法完成。如果表处于脱机状态,则可以丢弃/导入表空间,并在http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html周围复制.idbs。
这是默认行为,但不是强制性的。从MySQL文档开始,使用每表表空间:
默认情况下,所有InnoDB表和索引都存储在系统表空间中。或者,您可以将每个InnoDB表及其索引存储在其自己的文件中。此功能称为“多个表空间”,因为在此设置生效时创建的每个表都有自己的表空间。
至于为什么,原因可能是两个引擎(MyISAM和InnoDB)的体系结构不同。例如,在InnoDB中,您不能仅将.ibd文件复制到另一个数据库或安装中。说明(在同一页面上):
.ibd文件的可移植性注意事项
您不能像MyISAM表文件一样在数据库目录之间自由移动.ibd文件。存储在InnoDB共享表空间中的表定义包括数据库名称。表空间文件中存储的事务ID和日志序列号在数据库之间也有所不同。