mysql5.7数据库表空间释放
  UReG4QD8JsyE 2023年11月02日 38 0

mysql5.7数据库表空间释放

应用环境:表存在longblob类型字段存储了pdf等图片,占用了大的存贮空间需要清理。

测试数据库版本:mysql5.7.41

搜集mysql表空间释放方法

1、drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2、truncate table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度; 3、delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 (应该是做了特别处理,也比较合理),InnoDB 不会释放磁盘空间; 4、对于delete from table_name where xxx带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间; 5、delete操作以后使用optimize table table_name 会立刻释放磁盘空间。不管是innodb还是myisam 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。 6、delete from表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。

涉及工作表信息不便列出,假设库名:testdata 表名:students 列名:id, name, age, pdf, bz

方案一:optimize对表进行优化,可以回收表空间与提高I/O性能。

情况一:

InnoDB引擎的表分为共享表空间和独享表空间表,可以通过show variables like 'innodb_file_per_table'来查看是否开启独享表空间。 独享表空间的表是无法进行optimize操作的, 因为独享表空间的表当数据删除时会重组索引并释放对应的空间。

mysql>show variables like 'innodb_file_per_table';

+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| innodb_file_per_table | ON |

+-----------------------+-------+

ON是独享表空间 备注:测试发现执行optimize table students释放了表空间,根据条件删除和写入空值,并没有释放表空间。

情况二:

mysql>show variables like 'innodb_file_per_table';

+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| innodb_file_per_table | OFF |

+-----------------------+-------+

OFF是共享表空间。这个时候可以在mysql的datadir路径下看到一个非常大的文件ibdata1,这称此个文件存储了所有InnoDB表的数据与索引。 对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。

设置存pdf文件字段为null update students set pdf = null;

重建表并锁表 optimize table students;

注意:OPTIMIZE TABLE运行过程中,MySQL会锁定表,并且会先重建表,要用剩余足够的表空间。

方案二:使用复制表、删除表释放表空间方案。

复制表: create table students_copy (like students); 插入新表 insert into students_copy(id,name,age,bz) select id,name,age,bz from students; 删除表 drop table able students; 修改表名称 rename table able students_copy to able students;

备注:删除操作需谨慎有条件的请先做好备份。

  1. 由于共享表空间所有表的数据与索引都存放于ibddata1文件中,随着数据量的增长会导致该文件越来越大。超过10G的时候查询速度就非常慢,因此在编译的时候最好开启独享表空间。因为mysql默认是关闭了独享表空间,下面有两个解决方案
  2. 方案一:先逻辑备份所有的数据库,将配置文件中innodb_file_per_table参数=1,再将备份导入
  3. 方案二:只要修改innodb_file_per_table参数,然后将需要修改的所有innodb的表都运行一遍 alter table table_name engine=innodb;即可使用第二种方式修改后,原来库中的表中的数据会继续存放于ibdata1中,新建的表才会使用独立表空间

如果对您有所帮助请《点赞》、《收藏》、《转发》,您的支持是我持续更新的动力,有疑问请留言

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: nginx 小纪 下一篇: CI/CD持续测试的未来...
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  eHipUjOuzYYH   2023年12月10日   12   0   0 mysqlsqlUser
  eHipUjOuzYYH   2023年12月07日   14   0   0 数据乐观锁redis
  jnZtF7Co41Wg   2023年12月09日   15   0   0 客户端服务端数据
  9JCEeX0Eg8g4   2023年12月11日   19   0   0 mysql配置文件
UReG4QD8JsyE