3、建立硬链接
此时便可以通过在该表对应的数据文件上设置硬链接来进行删除。
#ln /data/datafile/test/no_part_tab.MYD /data/datafile/test/no_part_tab.MYD.hdlk #ls -lh /data/datafile/test/
发现多了一个sys_user.ibd.hdlk文件,且no_part_tab.MYD.hdlk和no_part_tab.MYD的innode均为2。也即当有多个文件名(如硬链接)指向同一innode时,这个innode的引用数大于1,此时,删除其中任何一个文件名都只会删除指向innode的指针而并不会直接删除物理文件块,因此会非常快,直至innode的引用计数等于1时才会真正删除对应的物理文件块,真正删除物理文件块时才会比较耗时。
4、drop table
在建立了硬链接后再执行DROP TABLE操作:
DROP TABLE no_part_tab;
可以看到基本没耗时,查看对应的表定义和数据文件:
只剩下no_part_tab.MYD.hdlk,且innode的引用计数变为了1。也即刚才的DROP TABLE操作实施删除了物理文件的一个指针no_part_tab,因而非常快。
5、删除真正的物理文件
因为此时innode的引用计数已经变为了1,直接删除no_part_tab.MYD.hdlk便会真正的删除物理文件。但因为物理文件较大,删除大文件仍会引起较高的磁盘IO开销。因此可以使用少量逐次删除的方式来删除大的数据文件。truncate工具可以用于增加或缩减指定文件的尺寸,可以用于此目的:
#for i in `seq 6 -1 1 ` ;do sleep 2;sudo truncate -s ${i}G /data/datafile/test/no_part_tab.MYD.hdlk;done #rm -rf /data/datafile/test/no_part_tab.MYD.hdlk;
从6G开始,每次缩减1G,停2秒,继续,直到文件只剩1G,最后使用rm命令删除剩余的部分。