在MySQL中有大表需要清理,该表超过100GB,不敢直接delete或者truncate、drop,怕影响业务。
一般情况下(少量数据),不同的场景可以选择不同的方式来做数据删除。
delete命令逐行删除数据,涉及行锁,删除多条数据时性能差.
drop命令会删除表数据及结构、触发器、分区等。
drop命令会持有buffer pool的锁,还涉及ibd磁盘文件的删除。表越大持有锁的时间越长,IO资源消耗越大,会影响在线业务。
truncate命令清除整个表的数据,需要执行人有drop权限。
对于大表的场景,常见的做法:
create table new_table like old_table ;
rename table old_table to old_table_del ;
rename table new_table to old_table;
drop table old_table_del;
rename命令支持多个表,上面2条语句也可以合并成一条:
rename table old_table to old_table_del, new_table to old_table;
最后一步drop表时,采用建立硬链接的方式删除:
ln test.idb test.idb.link
关于硬链接:
具有相同inode节点号的多个文件互为硬链接文件,硬链接文件可以理解成是文件的另一个入口;
删除硬链接文件或者删除源文件时,文件实体并未被删除;
删除源文件和所有硬链接文件后,文件实体才会被删除;
因此,我们可以通过给文件设置硬链接文件的方式,来防止重要文件被误删除;
创建硬链接可以用命令:ln source_file hardlink
drop table test;
bt-rm
如果使用的是TDSQL,基于腾讯自研TXSQL内核支持异步删除大表:
https://cloud.tencent.com/document/product/236/48904
实现原理如下:
该功能无需用户操作,由内核自动完成,其原理是在删除表时,为表的数据文件在另外一个目录中创建一个硬连接。当执行 drop table 后,删除的只是该文件的一个硬连接。之后后台线程扫描到硬连接目录中有需要删除的文件,自动在后台 truncate 前面 drop 掉表数据文件。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。