Home >Database >Mysql Tutorial >MySQLDROPTABLE操作以及DROP大表时的注意事项_MySQL
语法:
删表
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 链接和原始数据库都会被删除。命令返回被移除的表数量。
sudo ls -lh /data/mysql/testdb -rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm -rw-rw---- 1 mysql mysql 100G Oct 28 13:26 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---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 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 example_table;发现会很快的完成,查看对应的表定义和数据文件:
sudo ls -lh /data/mysql/testdb -rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk只剩下example_table.ibd.hdlk,且innode的引用计数变为了1。也即刚才的DROP TABLE操作实施删除了物理文件的一个指针example_table.ibd ,因而非常快。
for i in `seq 100 -1 1 ` ;do sleep 2;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命令删除剩余的部分。