【问题标题】:how many free space are there within ibdata1ibdata1 中有多少可用空间
【发布时间】:2019-12-11 22:19:41
【问题描述】:

innodb_file_per_table 关闭时,即使您删除表或删除行,ibdata1 也会继续增长,但当您删除表时应该有一些可用空间。 如何知道 ibdata1 中剩余多少可用空间?
真实表数据使用了多少空间,元数据使用了多少空间?
当您执行“删除/删除”操作时,它会将事务日志存储在 ibdata1 中吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这是一个例子:

    mysql> show table status like 'mytable'\G
    *************************** 1. row ***************************
               Name: mytable
             Engine: InnoDB
            Version: 10
         Row_format: Dynamic
               Rows: 2049
     Avg_row_length: 16663
        Data_length: 34144256 <-- space in the clustered index (that is, the data)
    Max_data_length: 0
       Index_length: 81920    <-- space in secondary indexes
          Data_free: 4194304  <-- space in full free extents 
    

    data_free 总是 1MB 的倍数。这是因为它不计算空闲空间,除非它是 64 个连续空闲页面的范围。可能有更多的可用空间,少量隐藏在部分完整的范围中,但实际上没有办法报告这些。

    data_free 报告表占用的表空间中的可用空间量。对于启用 innodb_file_per_table 时定义的表,可用空间用于相应的表空间。对于共享系统表空间或通用表空间的表,每个表都会报告data_free,但信息是重复的。它们都描述了同一个共享表空间中的空闲空间,所以不要总结。

    你也可以这样检查:

    mysql> select * from information_schema.files where file_id = 0\G
    *************************** 1. row ***************************
                 FILE_ID: 0
               FILE_NAME: ./ibdata1
               FILE_TYPE: TABLESPACE
         TABLESPACE_NAME: innodb_system
           TOTAL_EXTENTS: 76
             EXTENT_SIZE: 1048576
               DATA_FREE: 34603008
                     ...
    

    同样,请注意 data_free 是扩展区大小的精确倍数。不报告不连续范围内的可用空间。

    mysql> select 34603008 / 1024 / 1024;
    +------------------------+
    | 34603008 / 1024 / 1024 |
    +------------------------+
    |            33.00000000 |
    +------------------------+
    

    当您删除时,已删除行的副本存储在“撤消表空间”中。如果您为 DELETE 回滚事务,则会恢复行。在旧版本的 InnoDB 中,撤消表空间始终是 ibdata1。因此,如果您在单个事务中对大量数据进行了 UPDATE 或 DELETE,它将扩展 ibdata1。当事务提交并且不再需要旧行版本的副本时,空间将被释放。但如您所知,ibdata1 永远不会缩小。

    在现代版本的 MySQL 中,撤消表空间位于单独的文件中,而不是 ibdata1。因此,如果撤消表空间变得太大,您可以定期截断它。阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html了解详情。

    【讨论】:

    • 当我执行“select * from information_schema.files where file_id = 0\G”时什么也没显示,我做错了吗?
    • 并且由于磁盘中只剩下几 GB 的空间,我想做很多删除/删除以释放一些空间以进一步插入数据。那会有帮助吗?或者“删除/删除”操作将在 ibdata1 中使用更多空间
    • 我从 MySQL 5.7.28 得到了上面的例子。不同版本的 MySQL 可能会以不同的方式实现此信息。
    • DROP 不会向 ibdata1 添加更多空间。 DELETE 可能,因为它可以回滚,因此它必须将旧数据复制到某处。 ibdata1 中可能有可用空间可供使用,或者如果没有,它将扩展 ibdata1。对于你的情况,我无法预测。
    • 此时,我将在另一台服务器上设置一个副本,确保它使用 innodb_file_per_table,然后按照dev.mysql.com/doc/refman/8.0/en/replication-setup-slaves.html 中的说明从主服务器(您的当前实例)并将其导入副本。
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 2015-08-13
    • 2011-09-13
    • 2013-01-18
    • 2019-02-18
    • 2019-06-10
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多