Answers:
您必须使用innodb_file_per_table,并且需要做一些如何使用InnoDB的当前基础结构进行清理。
我已经看到许多数据库托管客户端设置MySQL并将InnoDB保留为默认状态。这导致系统表空间(更好地称为ibdata1)疯狂增长。
即使切换到innodb_file_per_table,也必须从ibdata1中提取.ibd文件,并且ibdata将永远不会收缩。例如,如果您有一个名为mydb.mytable的表位于ibdata1内,占用了2GB,则要提取该表,您必须执行以下操作:
步骤01)将其添加到/etc/my.cnf
[mysqld]
innodb_file_per_table
步骤02) service mysql restart
步骤03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
这将使文件/var/lib/mysql/mydb/mytable.ibd
不幸的是,更改之前表占用的2GB空间无法回收。我过去写过有关如何以及为何清理InnoDB基础架构的文章:
做出重大更改后,请不要忘记增加innodb_open_files(默认为300)。否则,磁盘访问将非常有限。
关于联接,请确保您具有支持联接条件的正确索引。
在全新安装中使用innodb_file_per_table会导致ibdata1增长非常缓慢,因为所有DDL都在ibdata外部完成。您可以像我之前提到的那样收缩任何InnoDB表,如下所示:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
关于备份,请非常小心地复制.ibd文件。为什么?
每个.ibd文件中都有一个特殊的值,称为tablespace_id。ibdata1中有一个tablespace_id值列表。如果执行过需要删除和重新创建表的表维护,则tablespace_id将变得不同。如果还复制ibdata1,则只能将这样的.ibd文件的副本重新集成到数据库中以供使用。这危及所有其他InnoDB表的tablespace_id。鉴于此,最好执行mysqldump备份,因为mysqldumps是数据的逻辑副本。换句话说,备份与ibdata1的时间点无关,您可以自由地重新加载而不会出现可操作性问题。
同意@RolandoMySQLDBA,但他没有提到:备份。
如果您已经制定了MySQL备份方案,并且没有在文件系统备份策略中包括其.ibd文件,那么这并不是那么重要。但是考虑到将BY BYTES添加到任何innodb表将导致对.ibd表的增量备份,否则,您会发现很快就会用完备份存储。
我有一个完全符合这种情况的应用程序:一些大表和一些小表。
我决定将较小的ibdata1
文件留给自己,而将较大的文件留在自己的文件中。
innodb_file_per_table
为此,我默认情况下处于打开状态,并且仅在将表移动到ibdata1
with 时暂时将其关闭ALTER TABLE
。
ALTER TABLE
他们之后。因此,我的策略是innodb_file_per_table
定期打开并随意关闭它,以便将小桌子移进去ibdata1
,然后再重新打开。