MySQL大表清空和删除正确方法

转自:https://www.pinlue.com/article/2020/12/0302/1611384131750.html

1 清空大表

1.1 truncate

删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似;但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少。

truncate 清空表数据,50G的表大概需要20秒以上;

mysql> truncate table old_table;

1.2 rename

1.2.1 格式:

mysql> rename table 原表名 to 新表名;

当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。

1.2.2 实例

# 新建一个空表(测试);mysql> create table old_table(id int);# new_table克隆old_table的表结构;mysql> create table new_table like old_table;# old_table改名为backup_table,new_table改名为old_table;mysql> RENAME TABLE old_table TO backup_table, new_table TO old_table;# 删除旧表及数据;mysql> DROP TABLE old_table;    

2 删除

2.1 背景

在生产环境有可能有删除某个不重要大表的需求,因为大表占用的大量磁盘空间,如果我们直接drop掉此表,通常需要20秒以上的时间,总会觉得会卡主MySQL,现在给大家一个正确的删除方法。

2.2 首先我们查看此大表

# shell[root@ras221 db]# du -shc old_table*12K old_table.frm49G old_table.ibd[root@ras221 db]# ls -l old_table*-rw-r----- 1 mysql mysql      9075 11月  8 11:39 old_table.frm-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd[root@ras221 db]# ln old_table.ibd old_table.ibd.bak        # 硬链接;[root@ras221 db]# ls -l old_table*-rw-r----- 1 mysql mysql      9075 11月  8 11:39 old_table.frm-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd.bak[root@ras221 db]# # mysql mysql> drop table old_table;Query Ok, 0 rows affacted(0.92 sec)

通过这样的操作,可以减少mysql drop大表hang住的时间,然后在业务低峰期再去删除真实的那个.b文.bak件。

至于原理:
就是利用OS HARD LINK的原理,
当多个文件名同时指向同一个INODE时,这个INODE的引用数N>1, 删除其中任何一个文件名都会很快.
因为其直接的物理文件块没有被删除.只是删除了一个指针而已;
当INODE的引用数N=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时;

对于大表操作操作的其实几个Tips:
可以先用rename table替代drop table
mysql> rename table old_table to old_table_bak;
这个动作也很快只是相当于改一个文件名。
另外也可以考虑使用XFS文件系统,对于Drop表动作也比较快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值