InnoDB表磁盘空间消耗所有HDD空间

时间:2017-05-09 07:06:22

标签: mysql database optimization mariadb

背景

我安装了MariaDB服务器,其中一些表使用MyISAM,其中一些使用InnoDB。 InnoDB有利于减少查询时间,因为它是多核的。我把一些巨大的表改成了InnoDB。

然后我发现我的硬盘正在使用越来越多的空间。我检查了我的CentOS 7 Linux,发现ibdata1占用了我的硬盘空间。而且我知道如果我需要缩小我需要的空间来将MySQL服务器完全转储到.sql文件中,然后删除所有数据库。之后,停止MySQL服务器并删除ibdata1文件。此外,将innodb_file_per_table设置为my.cnf。最后,将sql导回服务器。

一切顺利,直到我发现这个问题。

问题

我实时检查我的新HDD使用情况,并且我意识到该表现在使用名称与表名相同的.ibd文件。这是巨大的!完成导入后,硬盘使用率甚至比以前更差。我试过OPTIMIZE TABLE获取一个750MB的文件,看看它是否可以缩小尺寸但没有运气。我还有一个14.8GB的InnoDB表,但我没有另外14.8GB的MySQL来优化我的表,我不认为它可以减少使用。

附件

目前my.cnf

[mysqld]
local-infile            = 0
max_connections         = 32768
long_query_time         = 5
query_cache_type        = ON
query_cache_size        = 200M
tmp_table_size          = 2M
max_heap_table_size     = 64M
myisam_sort_buffer_size = 64M
table_open_cache        = 4096
thread_concurrency      = 28
sort_buffer_size        = 16M
read_buffer_size        = 16M
join_buffer_size        = 16M

innodb_file_per_table
innodb_flush_method     = O_DIRECT
innodb_log_file_size    = 1G
innodb_buffer_pool_size = 4G
innodb_read_io_threads  = 7
innodb_write_io_threads = 7

我现在能做什么?

1 个答案:

答案 0 :(得分:1)

简短回答:InnoDB表(和索引)使用的磁盘空间大约是MyISAM所需的磁盘空间的2倍-3倍。这是可以忍受的。

答案很长:

如果您没有一堆备用磁盘空间,那么转换到InnoDB最终会耗尽空间,无论file_per_table等等。

  • innodb_file_per_table = OFF:所有后续 CREATEdALTERed表的所有数据和索引都会进入文件ibdata1。那个文件只会增长;它不能缩小。

  • innodb_file_per_table = ON:所有后续 CREATEdALTERed表的所有数据和索引都会转到.ibd个文件中表的名称。通常,这是更好的方法,因为从长远来看,它可以实现更好的维护。

无论哪种方式,都会占用相似数量的磁盘空间。

其他问题:

  • query_cache_size = 200M伤害表现;不要超过大约50M。
  • InnoDB和MyISAM都能够使用多个CPU - 但每个连接只能使用一个CPU 。另一方面,MyISAM执行“表锁定”,因此并发性较低。 (这可能让你误以为这是一个CPU问题。)
  • 部分ALTERs和所有OPTIMIZEs复制了表格。因此,在操作期间,您需要足够的磁盘空间来存储表的额外副本。使用ibdata1时,这将扩展但不合同,即该文件的大小。使用.ibd,空间将返回给操作系统。
  • ALTEROPTIMIZE可能会也可能不会缩小表格和索引的大小(并增加Data_free)。 OPTIMIZE几乎从未对InnoDB有用。
  • 其他tips on converting to InnoDB
  • 我倾向于将“小”表放入ibdata1而不是file_per_table。但这很麻烦 - 我必须提前思考。