在DROP TABLE的时候,所有进程不管是DDL还是DML都被HANG起;直到DROP结束才继续执行;这是因为INNODB会维护一个全局独占锁(在table cache上面),直到DROP TABLE完成才释放。在我们常用的ext3,ext4,ntfs文件系统,要删除一个大文件(几十G,甚至几百G)还是需要点时间的。下面我们介绍一个快速DROP table 的方法; 不管多大的表,INNODB 都可以很快返回,表删除完成;
利用硬链接和truncate降低drop table对线上环境的影响
创建tmp 表并 rename 表
关闭Binlog 避免同步延迟 会话级别
mysql> SET sql_log_bin=0; mysql> show tables;
+---------------+
| Tables_in_db3 |
+---------------+
| tb_user |
+---------------+
mysql> create table tb_user_1 like tb_user;
Query OK, 0 rows affected (0.05 sec)mysql> show tables;
+---------------+
| Tables_in_db3 |
+---------------+
| tb_user |
| tb_user_1 |
+---------------+mysql> rename table tb_user to tb_user_bak;
Query OK, 0 rows affected (0.07 sec)mysql> rename table tb_user_1 to tb_user;
Query OK, 0 rows affected (0.00 sec)mysql> show tables;
+---------------+
| Tables_in_db3 |
+---------------+
| tb_user |
| tb_user_bak |
+---------------+
对bak表创建硬链接
[root@localhost1 db3]# ln tb_user_bak.ibd tb_user_bak.ibd.hdlk
[root@localhost1 db3]# ll tb_user_bak.*
删除表
drop table tb_user_bak;
[root@localhost1 db3]# ll tb_user_bak.*
最后删除文件
[root@localhost1 db3]# rm -f tb_user_bak.ibd.hdlk