欢迎投稿

今日深度:

MySQL DROP TABLE操作以及 DROP 大表时的注意事项,

MySQL DROP TABLE操作以及 DROP 大表时的注意事项,mysqldrop


语法:

删表

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---- 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操作:
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 ,因而非常快。

剩下的任务就是删除真正的物理文件了,因为此时innode的引用计数已经变为了1,直接删除example_table.ibd.hdlk便会真正的删除物理文件。但因为物理文件较大,删除大文件仍会引起较高的磁盘IO开销。因此可以使用少量逐次删除的方式来删除大的数据文件。truncate工具可以用于增加或缩减指定文件的尺寸,可以用于此目的:
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命令删除剩余的部分。

对于整个数据库的删除可以先删除其中较大的表,最后在执行DROP DATABASE删除整个库,对大表的删除可参见上面的方法。








linux下mysql的drop table命令不可以把表与相关存储信息都删除干净,怎弄

使用OPTIMIZE TABLE语句可以。
OPTIMIZE TABLE语法
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
1. 如果表已经删除或分解了行,则修复表。
2. 如果未对索引页进行分类,则进行分类。
3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。
要重新使用未使用的空间并减小文件的尺寸,则使用OPTIMIZE TABLE语句或myisamchk应用程序重新编排表。OPTIMIZE TABLE更简便,但是myisamchk速度更快。
 

MySQL DROP Table 用法

DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
DROP TABLE用于取消一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被取消,所以使用本语句要小心!

注意,对于一个带分区的表,DROP TABLE会永久性地取消表定义,取消各分区,并取消储存在这些分区中的所有数据。DROP TABLE还会取消与被取消的表有关联的分区定义(.par)文件。

对与不存在的表,使用IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE。

RESTRICT和CASCADE可以使分区更容易。目前,RESTRICT和CASCADE不起作用。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4246.html NewsArticle MySQL DROP TABLE操作以及 DROP 大表时的注意事项,mysqldrop 语法: 删表 DROP TABLE SyntaxDROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 可一次删除一张或多张表。需具有所删除表...
评论暂时关闭