问题背景:最近某个数据库服务器磁盘告警,在数据库内查询information_schema.tables查看数据库一共占用了8个T左右的空间,但是在服务器上通过du命令查看数据库文件夹占用了18个T(14T的数据文件和4T的备份文件),显然很奇怪,各种搜索以后,下文应该可以解释清楚该现象

原文作者:Peter Zaitsev

翻译作者:管长龙

原文:https://www.percona.com/blog/2016/01/26/finding_mysql_table_size_on_disk/

翻译:https://segmentfault.com/a/1190000020241551

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA .TABLES 中提供这些信息吗?没那么简单!

这个看似简单的问题实际上在 MySQL 中非常复杂。MySQL 支持许多存储引擎(其中一些根本不在磁盘上存储数据),这些存储引擎通常都以不同的布局存储数据。例如,InnoDB 存储引擎为 MySQL 5.7 提供了三种“基本”布局,其中包含 row_formats 和两种可压缩的种类。

简化一下:我们如何在磁盘上查找存储在其自己的表空间中的 InnoDB 表的表大小(前提是 innodb_file_per_table = 1 )。

在我们得到答案之前,先展示通过 sysbench 运行预先获得的图表(批量数据插入表):

此图显示了从 INFORMATION_SCHEMA .TABLES 获取的 data_lengthindex_length 所定义的表大小。可以预期,随着数据的增多,表格会跳跃增长(有时会增加 10GB 或更多)。

该图表与磁盘上数据的变化方式不匹配,它逐渐增长(如预期):

-rw-r----- 1 mysql mysql 220293234688 Jan 25 17:03 sbtest1.ibd
-rw-r----- 1 mysql mysql 220310011904 Jan 25 17:03 sbtest1.ibd
-rw-r----- 1 mysql mysql 222499438592 Jan 25 17:07 sbtest1.ibd

正如我们从这个实验中看到的那样,MySQL 并没有真正的实时维护 data_lengthindex_length 的值,而是定期刷新它们 - 而且不规则地刷新它们。图表的后半部分一些数据刷新变得更加规律。这与图表的第一部分不同,后者似乎每次有 10% 的行更改时,就更新一次统计信息。问题是,还有其他的值。例如 table_rowsdata_freeupdate_time ,它们也是实时更新的。

要在 MySQL 5.7获取 information_schema 获取到更准确的实时信息,需要做两件事:

  • 禁用 innodb_stats_persistent
  • 启用 innodb_stats_on_metadata

这两者都会带来严重的代价。

禁用持久性统计信息意味着每次服务器启动时 InnoDB 都必须刷新统计信息,这代价很大,并且可能会在重新启动之间产生不稳定的查询计划。那有没有更好的办法呢?事实证明有。

可以通过 INNODB_SYS_TABLESPACES 查看表空间信息表以查看实际文件大小。与 index_lengthdata_length 不同,INNODB_SYS_TABLESPACES 实时更新,无需特殊配置:

mysql> select * from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES where name='sbinnodb/sbtest1' G
*************************** 1. row ***************************    SPACE: 42    NAME: sbinnodb/sbtest1    FLAG: 33FILE_FORMAT: Barracuda    ROW_FORMAT: Dynamic    PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0    SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096    FILE_SIZE: 245937209344
ALLOCATED_SIZE: 245937266688
1 row in set (0.00 sec)

使用这个表的好处是,它还处理新功能 “InnoDB 页压缩”,正确显示了 file_size (磁盘上的逻辑文件大小)和 allocated_size(为此文件分配的空间,并且可以显着缩小)之间的区别。

最后,让我们看一下不同的 InnoDB 压缩方式如何影响 information_schema 中提供的信息。

mysql> select * from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES where name='sbinnodb/testcomp' G
*************************** 1. row ***************************    SPACE: 48    NAME: sbinnodb/testcomp    FLAG: 33    FILE_FORMAT: Barracuda    ROW_FORMAT: Dynamic    PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0    SPACE_TYPE: Single
FS_BLOCK_SIZE: 4096    FILE_SIZE: 285212672
ALLOCATED_SIZE: 113004544
1 row in set (0.00 sec)

如果您使用旧的 InnoDB 压缩(InnoDB 表压缩),您将看到 data_lengthindex_length 中显示的压缩数据大小作为结果。例如,avg_row_length 将远低于您的预期。

如果在 MySQL 5.7 中使用新的 InnoDB 压缩(InnoDB 页压缩),您将看到与文件大小相对应的值,而不是如 information_schema 中所示的分配大小。

结论

回答一个微不足道的问题“这个表在磁盘上占用了多少空间?” 在 MySQL 中真的不是一个简单的问题 - 显而易见的数据,可能会得到错误的答案。

查看 INFORMATION_SCHEMA .INNODB_SYS_TABLESPACES 以获取 InnoDB 表的实际文件大小值。

mysql多大_mysql的innodb表到底占用多大的空间?相关推荐

  1. 一个Java对象到底占用多大内存?

    最近在调研MAT和VisualVM源码实现,遇到一个可疑问题,两者计算出来的对象大小不一致,才有了这样疑惑. 一个Java对象到底占用多大内存? 为了复现这个问题,准备了4个最简单类: class A ...

  2. java string占用内存_Java中String到底占用多大的内存空间?

    写在前面 对于Java中的String类占用多大的内存空间这个问题,是最近面试中问的比较多的一个问题.很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有 ...

  3. java占用内存多大_[转帖]一个Java工具到底占用多大内存?

    一个Java工具到底占用多大内存? https://www.jianshu.com/p/194b745884a5 最近在调研MAT和VisualVM源码实现,遇到一个可疑问题,两者盘算出来的工具巨细不 ...

  4. mysql 把表的值用来计算_mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  5. 一个mysql可以存多少数据类型_mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  6. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

    ##状况描述 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决 ...

  7. mysql创建数据库时候同时创建表空间_MySQL 创建InnoDB表空间_编程学问网

    15.2.5. 创建InnoDB表空间 假设你已经安装了MySQL,并且已经编辑了选项文件,使得它包含必要的InnoDB配置参数.在启动MySQL之前,你应该验证你为InnoDB数据文件和日志文件指定 ...

  8. MySQL(九):InnoDB 表空间(Tables)

    本节着重分析一下表空间,通过本节我们将清楚以下几个问题: 1.什么是表空间(Tablespace)? 2.InnoDB 存储引擎有哪些表空间(Tablespace)? 3.InnoDB 存储引擎中的表 ...

  9. mysql字段约束_mysql数据库之表操作及字段约束条件

    一.存储引擎 二.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id name age sex 1 li 12 male 2 liu ...

最新文章

  1. spring Bean自动装配
  2. 为什么三维重建才是计算机视觉的最终归宿?
  3. 时间序列(四)ARIMA模型与差分
  4. Module 'matplotlib' has no 'contourf' member 使用Python导入matplotlib模块报错
  5. 计算机应用基础模块2客观题答案 文档,计算机应用基础网上形考答案模块2 Word 2010 文字处理系统客观题答案(精).doc...
  6. hot编码 字符one_Python机器学习:特征编码的两种方式
  7. 解决Pycharm无法使用已经安装Selenium的问题
  8. “租房帮”产品体验报告
  9. openresty入门与配置了解
  10. 【LeetCode】【数组】题号:*697,相同度的最短连续子数组
  11. 【树叶分类】基于matlab GUI BP神经网络植物叶片识别分类【含Matlab源码 916期】
  12. [数理统计-逐步回归]国内旅游收入回归
  13. (Python2.7.x) Systrace 使用的坑,出现 ImportError: No module named XXX
  14. TestProject Python SDK入门
  15. clustalw序列比对_序列比对和构建进化树(clustalw和phylip)
  16. cf950f Curfew
  17. 简单的c语言递归算法题,一天一个算法题-简单的-递归-计算a+aa+aaa+...+aaaa...a的数值...
  18. 【操作系统】BIOS篇
  19. Adobe系列软件彻底清理方法(手动删除)
  20. 团队项目-初步分工与计划安排

热门文章

  1. BrupSuite渗透测试笔记(十一)
  2. PHP中foreach详细分析—一般数组与对象数组
  3. android 学习随笔十七(服务 )
  4. linux学习笔记十四:安装SAMBA(Server Message Block)
  5. Struts2文件上传方式与上传失败解决方式
  6. 解决目录和tgz文件等不显示相应颜色
  7. 主题:windows 如何查看端口占用情况?
  8. 8088/8086的功能结构
  9. NativeXml (1):下载、安装、测试
  10. 面试八股文最新版出炉!一周肝了15个新篇章……