线网环境如何删除大表 周万春 比如一张大表,底层ibd文件大约是50G-100G,或者你理解成一张大表200G以上吧。哈哈!!! 利用硬链接和truncate降低drop table对线上环境的影响 在drop table的时候,所有进程不管是DDL还是DML都被hang起,直到drop结束才继续执行; 这是因为InnoDB会维护一个全局独占锁(在table cache上面),直到drop table完成才释放。 在我们常用的ext3,ext4,xfs,ntfs文件系统,要删除一个大文件(几十G,甚至几百G)还是需要点时间的。 下面我们介绍一个快速drop table的方法,不管多大的表,InnoDB都可以很快返回,表删除完成。 至于原理: 就是利用os hard link的原理, 当多个文件名同时指向同一个inode时,这个inode的引用数N>1,删除其中任何一个文件名都会很快。 因为其直接的物理文件块没有被删除,只是删除了一个指针而已。 当inode的引用数N=1时,这时候再去删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时。 开始科普Linux软硬链接知识: Linux系统中的“快捷方式”。 在Windows系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。 但是,这个看似简单的东西在Linux系统中可不太一样。 在Linux系统中存在硬链接和软连接两种文件。 硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。 软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。 ln命令中可用的参数以及作用 参数 作用 -s 创建“符号链接”(如果不带-s参数,则默认创建硬链接) -f 强制创建文件或目录的链接 -i 覆盖前先询问 -v 显示创建链接的过程 跑truncate table,4亿条数据会不会造成长时间锁表呢?有什么更好的方法吗? 最好是create新表,然后交叉rename对调,再drop/truncate table或其他方式清除数据。 一、可操作步骤: 创建新的tmp表,正式表与tmp表表名交换(注意在一个SQL里完成,并锁表) 对tmp表创建硬链接 ln tmp.ibd tmp.ibd.hdlk 在mysql中删除表tmp(truncate / drop都行) 然后找个业务不繁忙的时间删除数据文件或者用coreutils 的truncate慢慢搞。 truncate -s 1024 * 1024 * 4 filename 或者 rm -rf filename 二、关于truncate table,官档解释: Logically, TRUNCATE TABLE is similar to a DELETE statement that deletes all rows, or a sequence of DROP TABLE and CREATE TABLE statements. When a table is truncated, it is dropped and re-created in a new .ibd file, and the freed space is returned to the operating system.