如何在MariaDB 10.1.10中获取数据库表的实时大小
MariaDB 10.1.10 无SSH权限下实时获取表大小可行方案
方案1:优化原生统计字段实时性
原有sum(data_length + index_length)精度不足的核心原因是InnoDB默认对information_schema.TABLES的统计数据做了缓存,不会实时刷新,可通过两种方式优化:
- 临时对单表同步最新统计:查询前对目标表执行
ANALYZE TABLE 库名.表名;,执行完成后再查询TABLES表即可拿到实时大小,该操作对小表几乎无性能影响,大表会产生短暂元数据锁。 - 全局开启元数据查询自动刷新统计:如果有全局参数修改权限,执行
SET GLOBAL innodb_stats_on_metadata = ON;,后续所有查询information_schema的操作都会自动拉取最新统计数据,无需手动执行ANALYZE TABLE,该配置会对高频查询系统表的场景带来轻微性能损耗,可按需调整。
查询语句示例:
SELECT table_schema AS 数据库名, table_name AS 表名, ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 表大小_MB FROM information_schema.TABLES WHERE table_schema NOT IN ('information_schema','mysql','performance_schema','sys') GROUP BY table_schema, table_name;
方案2:直接读取InnoDB内核页计数(实时性最高)
MariaDB 10.1.10已支持INNODB_SYS_TABLES和INNODB_SYS_INDEXES系统表,直接读取InnoDB内核维护的页计数计算表大小,无需依赖缓存的统计信息,实时性远高于方案1,无需修改参数也无需手动执行ANALYZE TABLE。
查询语句示例:
SELECT SUBSTRING_INDEX(t.NAME, '/', 1) AS 数据库名, SUBSTRING_INDEX(t.NAME, '/', -1) AS 表名, ROUND(SUM(i.N_PAGES) * @@innodb_page_size / 1024 / 1024, 2) AS 表大小_MB FROM information_schema.INNODB_SYS_TABLES t INNER JOIN information_schema.INNODB_SYS_INDEXES i ON t.TABLE_ID = i.TABLE_ID WHERE t.NAME NOT LIKE 'mysql/%' AND t.NAME NOT LIKE 'information_schema/%' GROUP BY t.NAME;
注意事项
- 方案2统计的是表占用的物理页总大小,包含碎片和预留空间,和实际磁盘占用完全一致;如果需要统计有效数据大小,可将
i.N_PAGES替换为i.N_PAGES - i.N_RESERVED计算。 - 两种方案都无需SSH登录服务器,也无需安装Percona相关插件,完全适配MariaDB 10.1.10版本。
内容的提问来源于stack exchange,提问作者Wilson Edwards
相关产品推荐
相关产品推荐

