Answers:
这是多年来作为MySQL DBA和DBA StackExchange处理过的最有争议的主题之一。
要说得客气一点,根本就没有其他的办法来缩小ibdata1中。随着innodb_file_per_table禁用,每次运行时间OPTIMIZE TABLE
上的InnoDB表,ibdata1中迅速成长。使用丢弃的数据DROP TABLE
并且DROP DATABASE
它们不能回滚,因为它们是DDL,而不是DML。我相信Oracle和MSSQL可以回滚DDL。MySQL无法做到这一点。
ibdata1中驻留了几类信息
使用innodb_file_per_table=1
将允许您使用在ibdata1外部创建的表数据和表索引来创建新表。您可以使用ALTER TABLE ... ENGINE=InnoDB;
或提取仍在ibdata1内的任何表,OPTIMIZE TABLE
但这会在ibdata1中留下很大的未使用空间。
尽管如此,您仍必须清理InnoDB基础结构。我已经写了StackExchange帖子,介绍如何以及为什么这样做:
May 21, 2012
:MySQL数据库相对于转储文件有多大?Apr 01, 2012
:建议使用innodb_file_per_table吗?Mar 25, 2012
:为什么InnoDB将所有数据库存储在一个文件中?Feb 04, 2011
:MySQL InnoDB-innodb_file_per_table缺点?Oct 29, 2010
:如何:清洁mysql InnoDB存储引擎?您只需要转储数据,再重新加载一次,再也无需再次访问此问题。OPTIMIZE TABLE
之后运行,确实会缩小.ibd
任何InnoDB表的表空间文件。
如果您不在my.cnf默认文件中使用以下设置,则InnoDB仅将所有InnoDB表存储在ibdata1中:
innodb_file_per_table = 1
DROP TABLE(和DROP DATABASE)不能回滚。
这不是您不能缩小ibdata1的原因。
这是一个简短的解释,但是ibdata1除了表数据之外还包含InnoDB内部。据我了解,要缩小它,需要对其进行碎片整理,这不是受支持的操作。