mysql磁盘占用查看

磁盘占用分析

在没有权限查看mysql所在磁盘时,当监控发现磁盘空间不足时,如何通过mysql的命令查看当前mysql实例的磁盘占用情况。

binlog

mysql默认不清理binlog日志,当运行一段时间后可能会累计大量的binlog文件。

通过如下命令查看当前binlog占用情况,文件大小单位为字节:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 1549 |
| mysql-bin.000002 | 905 |
| mysql-bin.000003 | 1280 |
| mysql-bin.000004 | 2442 |
| mysql-bin.000005 | 5458 |
| mysql-bin.000006 | 233 |
| mysql-bin.000007 | 4492 |
| mysql-bin.000008 | 925667205 |
| mysql-bin.000009 | 25178685 |
+------------------+-----------+
1
2
3
4
5
6
-- 删除指定日志序号之前的所有二进制日志
PURGE MASTER LOGS TO 'mysql-bin.000003';
-- 删除指定绝对日期之前的所有二进制日志
PURGE MASTER LOGS BEFORE '2020-05-01 00:00:00';
-- 删除指定相对日期之前的所有二进制日志
PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

用户除了可以通过手动删除的方式清除binlog,也可以通过自动过期的方式由mysql自动删除binlog。过期时间由参数expire_logs_days决定,值为0时代表binlog永不过期。

1
2
3
4
5
6
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
1
2
-- 设置binlog7天后自动清理
mysql> set global expire_logs_days=7;

数据文件

查看各个表的数据文件大小使用如下命令:

1
2
3
4
5
6
7
8
-- 查询共享表空间ibdata1,业务表相关个文件大小(不包含redo)
SELECT file_name, concat(TOTAL_EXTENTS,'M') as 'File_size' FROM INFORMATION_SCHEMA.FILES order by TOTAL_EXTENTS DESC;

-- 查询不包含redo类日志的其他文件总大小
SELECT sum(concat(TOTAL_EXTENTS,'M')) as 'File_size' FROM INFORMATION_SCHEMA.FILES;

-- 看是否慢日志比较多,也会占用磁盘
select count(*) from mysql.slow_log;

事实上不建议只通过例如Navicat之类的软件直接查看表的数据大小,因为数据大小经常与实际有出入,如下,通过Navicat查看当前表占用120G的磁盘空间,但通过阿里云控制台查看显示占用了96G的磁盘空间,而事实上通过mysql的文件统计,该表真正占用了150G的磁盘空间。

image

image

image