【发布时间】:2019-12-11 22:19:41
【问题描述】:
当 innodb_file_per_table 关闭时,即使您删除表或删除行,ibdata1 也会继续增长,但当您删除表时应该有一些可用空间。
如何知道 ibdata1 中剩余多少可用空间?
真实表数据使用了多少空间,元数据使用了多少空间?
当您执行“删除/删除”操作时,它会将事务日志存储在 ibdata1 中吗?
【问题讨论】:
标签: mysql
当 innodb_file_per_table 关闭时,即使您删除表或删除行,ibdata1 也会继续增长,但当您删除表时应该有一些可用空间。
如何知道 ibdata1 中剩余多少可用空间?
真实表数据使用了多少空间,元数据使用了多少空间?
当您执行“删除/删除”操作时,它会将事务日志存储在 ibdata1 中吗?
【问题讨论】:
标签: mysql
这是一个例子:
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了解详情。
【讨论】: