【问题标题】:InnoDB table diskspace consuming all HDD spaceInnoDB 表磁盘空间消耗所有 HDD 空间
【发布时间】:2017-10-07 09:07:28
【问题描述】:

背景

我安装了 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

我现在能做什么?

【问题讨论】:

  • 如果问题是 mysql 特定的,为什么还要使用 sql-server 标签?

标签: mysql database optimization mariadb


【解决方案1】:

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

长答案:

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

  • 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。但这很麻烦——我必须提前考虑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2020-08-28
    • 2016-11-13
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多