如何压缩或限制MySQL ibdata1数据文件

我们的应用程序是有大量的数据和充满插入和删除。 所以在3周内,ibdata1文件达到了30GB。 所以我想我们可以限制ibdata1文件的大小,并将variablesinnodb_data_file_path更改为“ibdata1:10M:autoextend:max:32G”。

一旦文件达到32 GB,它连续抛出错误,如表中填充每个插入语句。

请帮我解决这个问题,以压缩或限制数据文件的大小。

因为我们需要运行我们的应用程序多年。

我build议将InnoDB表存储在不同的文件中,每个表一个文件。 它可以更容易地pipe理它们,并查看哪些表占用最多的存储空间。 将以下内容放在/etc/mysql/my.cnf (或者你的系统上的任何地方) [mysqld]部分:

innodb_file_per_table 

之后,很容易识别使用太多空间的表格。 然后,您需要定期(一天一次,每月一次,无论如何)重新创build有问题的表格:

 ALTER TABLE tablename ENGINE=InnoDB; 

这将需要相当长的时间在大桌子上运行。 它将从头开始重新创build表文件,这将消除碎片和漏洞,从而增加文件大小。 当ALTER TABLE正在运行时,它使用所需磁盘容量的两倍。 我不知道你是否可以这样做,除非你在“文件每桌”模式下运行。

UPDATE

我想补充说,为了摆脱现有的“所有表的单个文件”InnoDB ibdata1文件,您需要执行以下操作:

  1. 用mysqldump导出所有的InnoDB表
  2. closuresmysqld
  3. 把“innodb_file_per_table”这一行放到你的my.cnf中
  4. rm ibdata * ib_logfile *在您的mysql数据目录中
  5. 启动mysqld
  6. 导入您在步骤1备份的数据

要在特定的表上启用压缩,您必须:

  • innodb_file_per_table设置为ON
  • innodb_file_format设置为Barracuda
  • 重新启动MySQL并重新创build表空间。
  • 使用ALTER TABLE name ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;更改表定义ALTER TABLE name ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;

Barracuda行格式由MySQL 5.5或MySQL 5.1与InnoDB插件支持 。

压缩ibdata1非常重要的一个具体原因。

什么进入ibdata1? 四件事:

  • 表数据
  • 表索引
  • 表元数据
  • MVCC(Multiversioning并发控制)数据

你将需要做两件事情:

  • 通过分离数据和索引来清理ibdata1(我在2010年10月29日2011 2月4日回答了相同types的问题)。 这与@ snap的答案类似,但是由于@snap在这个问题中首先提到了这个方法 ,所以他应该得到赞誉(接受他的答案)。
  • 从innodb_data_file_path中删除这个32G的上限。 它应该读取“ibdata1:10M:autoextend”(这是默认值)

警告

innodb_data_file_path应该是默认的原因可以追溯到ibdata1中存储的内容。 即使您删除了@snap指定的所有数据和索引,表格元数据和MVCC数据仍然被写入ibdata1。 如果有大量的DDL命令(CREATE TABLE,DROP TABLE,ALTER TABLE等等),表元数据仍然可以使ibdata1增长。 如果有大量的事务处理,每个事务处理大量数据的快照,MVCC Data仍然可以使ibdata1增长。 因为ibdata1就是这种情况,所以最好尽可能的精简和平均。 因此,让innodb_data_file_path = ibdata1:10M:autoextend在/etc/my.cnf

顺便说一句:从我+1的@snap !!!

这是一个很好的指导张贴在这里彻底的解释和解决scheme:

https://stackoverflow.com/questions/3927690/howto-clean-a-mysql-innodb-storage-engine/4056261#4056261