MySQL Delete 后,如何快速释放磁盘空间
一、起因:收到运维需求需要清理两张监控告警的日志表,数据删除之后,发现磁盘空间并未释放。
二、分析:InnoDB 数据库在使用 delete 进行删除操作的时候,只会将已经删除的数据标记为删除,并没有把数据文件删除,因此并不会彻底的释放空间。这些被删除的数据会被保存在一个链接清单中,当有新数据写入的时候,MySQL 会重新利用这些已删除的空间进行再写入。
三、解决:官方推荐可以使用 OPTIMIZE TABLE 命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。
语法如下:
1 2 | OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL ] TABLE tbl_name [, tbl_name] ... |
注释:OPTIMIZE TABLE 将重新组织表数据和相关索引数据的物理存储空间,减少存储空间并提高I/O访问效率。对每个表所做的影响取决于该表所使用的存储引擎。该命令对视图无效。
四、举例说明:
1.查看优化前表占用空间大小:
1 2 3 4 | root@dbs00 13:58:46:monitor$ ls -alth total 7.1G -rw-r ----- 1 mysql mysql 5.1G Nov 21 13:59 job_status_trace_log.ibd -rw-r ----- 1 mysql mysql 1.2G Nov 21 13:58 job_execution_log.ibd |
2.使用OPTIMIZE 命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | system@localhost 14:22: [monitor]> optimize table job_execution_log; + ---------------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | + ---------------------------+----------+----------+-------------------------------------------------------------------+ | monitor.job_execution_log | optimize | note | Table does not support optimize, doing recreate + analyze instead | | monitor.job_execution_log | optimize | status | OK | + ---------------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (1.09 sec) system@localhost 14:23: [monitor]> optimize table job_status_trace_log; + ------------------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | + ------------------------------+----------+----------+-------------------------------------------------------------------+ | monitor.job_status_trace_log | optimize | note | Table does not support optimize, doing recreate + analyze instead | | monitor.job_status_trace_log | optimize | status | OK | + ------------------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (1.13 sec) |
3.查看优化之后的磁盘空间占用大小:
1 2 3 4 | root@dpsvstadbs00 14:25:10:monitor$ ls -alth total 868M -rw-r ----- 1 mysql mysql 368K Nov 21 14:26 job_exect_log.ibd -rw-r ----- 1 mysql mysql 17M Nov 21 14:26 job_trace_log.ibd |
4.可以使用SQL 语句查看表占用空间的大小(默认M为单位)
1 2 3 4 5 6 7 | system@localhost 17:52: [monitor]> select table_name,(data_length+index_length)/1048576,table_rows from information_schema.tables where t able_schema= 'monitor' and table_name= 'job_status_trace_log' ;<br><br>+ ----------------------+------------------------------------+------------+ | table_name | (data_length+index_length)/1048576 | table_rows | + ----------------------+------------------------------------+------------+ | job_trace_log | 9.0625 | 10401 | + ----------------------+------------------------------------+------------+ 1 row in set (0.00 sec) |
补充:
1、对于 InnoDB 存储引擎 MySQL,OPTIMIZE 命令,将会被映射为 ALTER TABLE ... FORCE,并将重建表,更新索引统计信息,释放未使用的索引空间,这就意味着在一定程度上 OPTIMIZE 操作会造成一定的表阻塞(具体可以参加官网)。
2、OPTIMIZE 操作会锁表,所以最好不要在高峰期使用。
3、OPTIMIZE 操作相当于物理删除,一旦删除,恢复就很麻烦,所以最好使用逻辑删除,也不要经常使用,每月一次就够了
官网地址:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html
posted on 2018-11-21 17:56 狂奔中社会主义酸菜 阅读(9124) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!