您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL删除大表更快的DROP TABLE办法

2024/3/18 7:25:21发布22次查看
本文内容遵从cc版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_fast_drop_table_use_hard_lin.html 原文地址:http://www.mysqlops.com/2011/05/18/mysql%e5%88%a0%e9
本文内容遵从cc版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_fast_drop_table_use_hard_lin.html
原文地址:http://www.mysqlops.com/2011/05/18/mysql%e5%88%a0%e9%99%a4%e5%a4%a7%e8%a1%a8%e6%9b%b4%e5%bf%ab%e7%9a%84drop-table%e5%8a%9e%e6%b3%95.html
曾经发文介绍过,drop table xxx ,特别是碰到大表时,
http://www.mysqlops.com/2011/02/18/mysql-drop-table-%e5%a4%84%e7%90%86%e8%bf%87%e7%a8%8b.html
在drop table 过程中,所有操作都会被hang住。
这是因为innodb会维护一个全局独占锁(在table cache上面),直到drop table完成才释放。
在我们常用的ext3,ext4,ntfs文件系统,要删除一个大文件(几十g,甚至几百g)还是需要点时间的。
下面我们介绍一个快速drop table 的方法; 不管多大的表,innodb 都可以很快返回,表删除完成;
实现:巧用link(硬链接)
实测:
root@127.0.0.1 : test 21:38:00> show table status like ‘tt’ \g
*************************** 1. row ***************************
name: tt
engine: innodb
version: 10
row_format: compact
rows: 151789128
avg_row_length: 72
data_length: 11011096576
max_data_length: 0
index_length: 5206179840
data_free: 7340032
auto_increment: null
create_time: 2011-05-18 14:55:08
update_time: null
check_time: null
collation: utf8_general_ci
checksum: null
create_options:
comment:
1 row in set (0.22 sec)
root@127.0.0.1 : test 21:39:34> drop table tt ;
query ok, 0 rows affected (25.01 sec)
删除一个11g的表用时25秒左右(硬件不同,时间不同);
下面我们来对另一个更大的表进行删除;
但之前,我们需要对这个表的数据文件做一个硬连接:
root@ # ln stock.ibd stock.id.hdlk
root@ # ls stock.* -l
-rw-rw—- 1 mysql mysql? 9196 apr 14 23:03 stock.frm
-rw-r–r– 2 mysql mysql 19096666112 apr 15 09:55 stock.ibd
-rw-r–r– 2 mysql mysql 19096666112 apr 15 09:55 stock.id.hdlk
你会发现stock.ibd的inodes属性变成了2;
下面我们继续来删表。
root@127.0.0.1 : test 21:44:37> show table status like ‘stock’ \g
*************************** 1. row ***************************
name: stock
engine: innodb
version: 10
row_format: compact
rows: 49916863
avg_row_length: 356
data_length: 17799577600
max_data_length: 0
index_length: 1025507328
data_free: 4194304
auto_increment: null
create_time: 2011-05-18 14:55:08
update_time: null
check_time: null
collation: utf8_general_ci
checksum: null
create_options:
comment:
1 row in set (0.23 sec)
root@127.0.0.1 : test 21:39:34> drop table stock ;
query ok, 0 rows affected (0.99 sec)
1秒不到就删除完成; 也就是drop table不用再hang这么久了。
但table是删除了,数据文件还在,所以你还需要最后数据文件给删除。
root # ll
total 19096666112
-rw-r–r– 2 mysql mysql 19096666112 apr 15 09:55 stock.id.hdlk
root # rm stock.id.hdlk
虽然drop table 多绕了几步。(如果你有一个比较可靠的自运行程序(自动为大表建立硬链接,并会自动删除过期的硬链接文件),就会显得不那么繁琐。)
这样做能大大减少mysql hang住的时间; 相信还是值得的。
至于原理: 就是利用os hard link的原理,
当多个文件名同时指向同一个inode时,这个inode的引用数n>1, 删除其中任何一个文件名都会很快.
因为其直接的物理文件块没有被删除.只是删除了一个指针而已;
当inode的引用数n=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时;
好了. 大家试试吧.
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product