gpt4 book ai didi

mysql - ibdata1 中有多少可用空间

转载 作者:行者123 更新时间:2023-11-30 21:25:31 25 4
gpt4 key购买 nike

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

最佳答案

这是一个例子:

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。因此,如果您在单个事务中更新或删除大量数据,它会扩展 ibdata1。当事务提交并且不再需要旧行版本的副本时,空间将被释放。但如您所知,ibdata1 永远不会收缩。

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

关于mysql - ibdata1 中有多少可用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59287351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com