MySQL数据库空间爆满但实际使用空间远低于磁盘空间
一、问题:阿里云RDS空间突然爆满。
今天阿里云RDS MySQL数据空间突然满了,查了下实际数据占用空间远低于磁盘空间,记录一下解决方法。
二、问题点确认:数据库空间占用查询
1. 查询数据库磁盘空间占用情况(通过查询发现实际使用空间远低于磁盘使用空间)
-- 查询各表占用空间情况
SELECT
table_schema as '数据库',
table_name as '表名',
truncate(data_length/1024/1024, 2) as '数据空间(MB)',
truncate(index_length/1024/1024, 2) as '索引空间(MB)',
truncate(data_free/1024/1024, 2) as '碎片空间(MB)',
table_rows as '表行数'
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY data_length DESC,index_length DESC;
-- 查询各库占用空间情况
SELECT
table_schema as '数据库',
table_name as '表名',
truncate(data_length/1024/1024, 2) as '数据空间(MB)',
truncate(index_length/1024/1024, 2) as '索引空间(MB)',
truncate(data_free/1024/1024, 2) as '碎片空间(MB)',
table_rows as '表行数'
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY data_length DESC,index_length DESC;
2. 查询MySQL表空间数据文件的信息(通过查询发现.ibd占用了大量空间)
SELECT file_name,concat(TOTAL_EXTENTS,'MB') as 'FileSize' FROM INFORMATION_SCHEMA.FILES order by TOTAL_EXTENTS DESC
FTS_00000000000008c6_000000000000111d_INDEX_1~6.ibd是全文索引产生的文件
三、问题解决:优化表空间(对加了全局索引的表进行优化)
执行下面语句进行优化(optimize table语句会导致锁表,建议在业务低峰期操作。)
optimize table <表名>;
1、OPTIMIZE TABLE语句可以重新组织表、索引的物理存储,减少存储空间,提高访问的I/O效率。类似于碎片整理功能
2、另外使用delete语句删除数据时,delete语句只是将记录的位置或数据页标记为了“可复用”,但是磁盘文件的大小不会改变,即表空间不会直接回收。此时您可以通过optimize table语句释放表空间。