linux下mysql的drop table命令不能把表和相关存储信息都删除干净,怎么弄
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下mysql的drop table命令不能把表和相关存储信息都删除干净,怎么弄相关的知识,希望对你有一定的参考价值。
我建立个表,在里面插入20多万数据,占用了linux很多兆,使用drop table命令时,并不能吧所有空间都还原
使用OPTIMIZE TABLE语句可以。OPTIMIZE TABLE语法
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
1. 如果表已经删除或分解了行,则修复表。
2. 如果未对索引页进行分类,则进行分类。
3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。
要重新使用未使用的空间并减小文件的尺寸,则使用OPTIMIZE TABLE语句或myisamchk应用程序重新编排表。OPTIMIZE TABLE更简便,但是myisamchk速度更快。 参考技术A 数据库中的内容被删除之后,空间并不会得到回收,也就是说原来占用的空间还是会被数据库占用,要向回收这些空间需要进行数据库的收缩。但是mysql好像还不支持数据库或者文件级别的收缩。 参考技术B 于在linux下的操作。 参考技术C 于在linux下的操作。
MySQL5.6 CREATE TABLE源码分析
MySQL5.6之前的版本DDL是非原子的。也就是说对于复合的DDL,比如DROP TABLE t1, t2;执行过程中如果遇到server crash,有可能出现表t1被DROP掉了,但是t2没有被DROP掉的情况。即便是一条DDL,比如CREATE TABLE t1(a int);也可能在server crash的情况下导致建表不完整,有可能在建表失败的情况下遗留.frm或者.ibd文件。
从原理流程图中可以看出,create table先创建.frm文件,再调用ha_create_table创建ibd文件,如果创建成功则退出,否则将之前创建的frm文件删除。但是这里就有问题了,如果创建完frm文件后,server挂了,那么frm文件是创建成功了,但是ibd文件没有创建。这就是DDL非原子性导致的后果。
以上是关于linux下mysql的drop table命令不能把表和相关存储信息都删除干净,怎么弄的主要内容,如果未能解决你的问题,请参考以下文章
linux云主机cpu一直很高降不下来,系统日志报nf_conntrack: table full, dropping packet.
MySQL DROP TABLE操作以及 DROP 大表时的注意事项