频道栏目
首页 > 资讯 > 其他综合 > 正文

1.4T的mysql表删除-雪藤六-51CTO博客

19-05-06        来源:[db:作者]  
收藏   我要投稿

mysql生产库上有张表,原本是每月迁移删除,由于上级数据补全统计的需求,一直延迟迁移了将近一年,表文件增到的1.4T,迁移删除历史数据后,表文件占1.4T空间,数据及索引文件大小800G,表内剩余空间600G。服务器磁盘总量2.2T,占比已达到87%,所以考虑释放大表的表空间,减小磁盘占比。

????因为表文件太大,服务器剩余磁盘空间不足,所以alter table engine时,需要新建临时表,磁盘会崩,不予考虑。


参考别的文章后确定采用如下执行方案:


0. 备份表数据。

1. rename table xx to xx_1;

2. create table xx like xx_1;(这一步是考虑动态变更时,生产上有新数据写入,如果新表需要保留部分数据,就先写入数据,后采用重命名的方法,另外:需要注意原来的用户是否有新表操作权限)

3. os 层建立硬链接(linux层面文件会变成两个硬链接指向同一个文件块,总磁盘占比布标。如果用软连接会导致第四步执行时是删除实际文件,导致IO暴增,服务报警甚至崩溃)?

4. drop table xx;(在第三步的基础上,删除原来的表文件,实际是删除原来的文件名(硬链接))

5. os 层循环truncate数据文件。


这里再稍作解释:

1.有个InnoDB表prod_table,先把表重新命名,防止还有应用在使用表

rename table prod_table to example_table;

2.只创建表结构,不含数据

create table prod_table like example_table;

3.对100G的ibd数据文件做个硬链接

#sudo ls ?-lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm

-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd

#sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk

#sudo ls ?-lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm

-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd

-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk


4.干掉大表,这个过程会比较快,因为有硬链接文件

DROP TABLE example_table;

#sudo ls ?-lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk

5.使用truncate命令收缩文件,从100G开始,每次缩减1G,停2秒,继续,直到文件只剩1G,最后使用rm命令删除剩余的部分(实际生产中这个每次减少的值,取决于分给mysql的内存)

#for i in `seq 100 -1 1 `; do sleep 2; sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk; done

#?${i}G是指将原来的文件大小缩小到${i}G,如果这个值赋值错了,IO压力也会暴增

#sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;




相关TAG标签
上一篇:db2全库完整性检查和小工具记录-plsql0基础学习笔记-51CTO博客
下一篇:索引设计规范-梁十八的博客-51CTO博客
相关文章
热门专题推荐 vmware win7激活工具 win10激活工具 excel word office激活 小马激活工具 重装系统 数据恢复 u盘启动工具
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站