MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
删表
DROP TABLE Syntax
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
可一次删除一张或多张表。需具有所删除表上的DROP权限。表定义文件和数据文件均被移除。表被删除后表上的用户权限不会被自动删除。参数里表中指定的表名不存在则报错,但对于存在的表仍会删除。可通过指定IF EXISTS阻止表不存在时引发的错误(此时对于不存在的表仅产生一个NOTE)。对于分区表,除了移除表定义,分区、数据外还移除与之关联的分区定义文件(.par)。在MySQL5.6中参数[RESTRICT | CASCADE]不做任何事情。[TEMPORARY] 关键字表明只删临时表,语句不会结束正在进行的事务(MySQL中DDL语句会隐式提交),不会进行权限检查。
删库
DROP DATABASE Syntax
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name...
删除指定库中的表之后删除库。需具有库上的DROP权限。库被删除后库上存在的用户权限不会被自动删除。IF EXISTS用于阻止库名不存在时引起的错误。库被删除后默认库会被重置。若在使用了符号链接的库上执行DROP DATABASSE 链接和原始数据库都会被删除。命令返回被移除的表数量。
该命令会从指定的数据库目录中移除常规操作时MySQL自己产生的文件和目录,如:.BAK .DAT .HSH .MRG. MYD .MYI .TRG .TRN .db.frm
.ibd .ndb .par,若存在db.opt也同样会删除。若数据库目录中存在其他非MySQL本身产生的文件或目录,则整个数据库目录不会被移除。此时,需手动清理剩余的文件并重新运行DROP DATABASE语句。
删除数据库并不会移除库中创建的临时表。临时表在SESSION结束时自动被清理或者显示的通过DROP TEMPORARY TABLE 删除。
删除大表的注意事项
对于表的删除,因为InnoDB引擎会在table cache层面维护一个全局独占锁一直到DROP
TABLE完成为止,这样,对于表的其他操作会被HANG住。对于较大的表来说,DROP
TABLE操作可能需要很长的时间,因此需要一种有效的办法来提升大表的删除速度,以尽可能降低HANG住的时间。可以通过设置硬链接来达到此目的。
比如有一个样例表:
example_table
使用InnoDB引擎且指定innodb_file_per_table=ON时在数据目录中与该表对应的有如下两个文件,分别为表定义文件和数据文件。
sudo ls -lh /data/mysql/testdb
-rw-rw---- mysql mysql .4K Oct : example_table.frm
-rw-rw---- mysql mysql 100G Oct : example_table.ibd
该表有100G这么大,直接使用DROP TABLE来完成删表动作,那么这条语句要执行很长时间。此时便可以通过在该表对应的数据文件上设置硬链接来进行删除。
sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk
sudo ls -lh /data/mysql/testdb
-rw-rw---- mysql mysql .4K Oct : example_table.frm
-rw-rw---- mysql mysql 100G Oct : example_table.ibd
-rw-rw---- mysql mysql 100G Oct : example_table.ibd.hdlk
发现多了一个example_table.ibd.hdlk文件,且example_table.ibd.hdlk和example_table.ibd的innode均为2。也即当有多个文件名(如硬链接)指向同一innode时,这个innode的引用数大于1,此时,删除其中任何一个文件名都只会删除指向innode的指针而并不会直接删除物理文件块,因此会非常快,直至innode的引用计数等于1时才会真正删除对应的物理文件块,真正删除物理文件块时才会比较耗时。
在建立了硬链接后再执行DROP TABLE操作:
DROP TABLE example_table;
发现会很快的完成,查看对应的表定义和数据文件:
sudo ls -lh /data/mysql/testdb
-rw-rw---- mysql mysql 100G Oct : example_table.ibd.hdlk
只剩下example_table.ibd.hdlk,且innode的引用计数变为了1。也即刚才的DROP TABLE操作实施删除了物理文件的一个指针example_table.ibd ,因而非常快。
剩下的任务就是删除真正的物理文件了,因为此时innode的引用计数已经变为了1,直接删除example_table.ibd.hdlk便会真正的删除物理文件。但因为物理文件较大,删除大文件仍会引起较高的磁盘IO开销。因此可以使用少量逐次删除的方式来删除大的数据文件。truncate工具可以用于增加或缩减指定文件的尺寸,可以用于此目的:
for i in `seq - ` ;do sleep ;sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk;done
sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;
从100G开始,每次缩减1G,停2秒,继续,直到文件只剩1G,最后使用rm命令删除剩余的部分。
对于整个数据库的删除可以先删除其中较大的表,最后在执行DROP DATABASE删除整个库,对大表的删除可参见上面的方法。
转自
MySQL DROP TABLE操作以及 DROP 大表时的注意事项 - CSDN博客 https://blog.csdn.net/zyz511919766/article/details/40539333
MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】的更多相关文章
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项
语法: 删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CA ...
- MySQL DROP 大表时的注意事项
对于表的删除,因为InnoDB引擎会在table cache层面维护一个全局独占锁一直到DROP TABLE完成为止,这样,对于表的其他操作会被HANG住.对于较大的表来说,DROP TABLE操作可 ...
- MySQL删除大表时潜在的问题(drop table,truncate table)
来源于:https://www.cnblogs.com/CtripDBA/p/11465315.html,侵删,纯截图,避免吸引流量之嫌 case1,删除大表时,因为清理自适应hash索引占用的内容导 ...
- 【原创】Innodb中mysql如何快速删除2T的大表
小漫画 来,先来看小漫画陶冶一下情操 OK,这里就说了.假设,你有一个表erp,如果你直接进行下面的命令 drop table erp 这个时候所有的mysql的相关进程都会停止,直到drop结束,m ...
- Innodb中MySQL如何快速删除2T的大表
转自:http://database.51cto.com/art/201808/582324.htm OK,这里就说了.假设,你有一个表erp,如果你直接进行下面的命令: drop table erp ...
- DROP TABLE ** CASCADE CONSTRAINTS PURGE删除表的时候级联删除从表外键
1.关于 cascade constraints 假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键). 则当删除A表时,如不特殊说明,则 drop table A 系统会出现错误 ...
- oracle delete t1;drop table t1;drop table t1 purge
Truncate tableTruncate table t1;Ddl语言,自动提交:不能回退:回收范围::挪动高水位线:将所有的数据清除,保留表结构:将表缩的最小:保留表的约束和权限. Drop t ...
- Oracle对大表进行delete注意事项
如果对大表进行大量的delete和update,那么可以注意一下如下说明: (1) 查看执行计划,如果说删除的记录很多,走索引的成本会比全表扫描更大,因为更新数据时还需要做一些约束校验和创建index ...
- hive错误排查一:hive中执行 drop table命令卡住,删除表不成功
起因 公司用的AWS EMR上的hive,突然不能删除表了. 经过 分析来看,估计是元数据那块出了问题.从元数据入手,元数据存在mysql的hive数据库中 直接使用hive配置文件hive-site ...
随机推荐
- php5.4使用dblib扩展,连接sqlserver中文乱码问题
在使用php链接sqlserver的时候,查询出来的数据,编码不稳定,一会utf8,一会出现问号.很纠结.下面的方法,可以解决此种问题.前提是dblib扩展. 如果查到的结果是乱码,更改/usr/lo ...
- MySQL随记(一)
数据类型 Insert Update Delete 函数
- 【python小练】0004
第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数. 先回忆一下各种括号的用途: () tuple [] list {} dict ([]) set——需要一个list作为输入合集 c ...
- 关于利用PHP访问MySql数据库的逻辑操作以及增删改查实例操作
PHP访问MySql数据库 <?php //造连接对象$db = new MySQLi("localhost","root","",& ...
- table的复制 SqlServer 数据库添加临时表(select 字段1,字段2,字段3 into)
select 字段1,字段2,字段3 into tempname form table where table.id=1; oralce : insert into MID_DRUG_DETA ...
- TensorFlow从入门到理解
一.<莫烦Python>学习笔记: TensorFlow从入门到理解(一):搭建开发环境[基于Ubuntu18.04] TensorFlow从入门到理解(二):你的第一个神经网络 Tens ...
- Python中文显示问题&数据库连接传参
1.Python连接mysql数据库,并且传递参数 con = MySQLdb.connect(host='***', user='root', passwd='***', db='***', por ...
- mui卡片视图的制作
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- Linux下运行jmeter
• 我们在做测试的时候,有时候要运行很久,公司用的测试服务器一般都是linux,就可以运行在linux下面,linux下面不能像windows一样有图形化界面,那怎么运行脚本呢,就先在windows上 ...
- python 的基础 学习 第三天 编码的初始
1 编码的初始 计算机在存储数据和传输数据的时候,都是0101的二进制. ASCII(American Standard Code for Information Interchange,美国标准信 ...