影响
直接drop table,mysql会将表结构,表数据,包括服务器上的磁盘文件,势必会造成大量的IO占用
- 首先会从缓冲池中删除,innodb会维护一个全局独占锁在table cache上,会影响整个实例的的数据查询
- 删除服务器上的磁盘文件,如果是一个很大的文件,会占用大量的磁盘IO
原理
表原理
mysql必须开启独立表空间参数
innodb_file_per_table=on
共享表空间
某一个数据库的所有的表数据,索引文件全部放在一个文件中
独立表空间
每一个表都以独立方式来部署,每个表都有一个.frm表描述文件,还有一个.ibd文件。
- .frm文件: 保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关。
- .ibd文件: 保存了每个表的数据和索引的文件
- .opt文件 保存了表的字符集
删除原理
利用ln 硬链接和和truncate 进行文件的截断删除
- 利用ln进行硬链接,就是一个文件被两个文件索引连接,mysql在调用os进行删除物理文件时,删除的不是本身的物理文件,而是删除的硬连接文件,只有当一个连接时才会被删除
- truncate 可以对文件进行制定size的进行删除,从而减少io的产生
操作实践
1、建立硬连接
ln sbtest1.ibd sbtest1.ibd.hdlk
[root@test.a1-104-143.dev.unp dytest]# du -sh *
4.0K db.opt
12K sbtest1.frm
3.9G sbtest1.ibd
[root@test.a1-104-143.dev.unp dytest]# ls
db.opt sbtest1.frm sbtest1.ibd sbtest1.ibd.hdlk
[root@test.a1-104-143.dev.unp dytest]# ls -la
total 8044572
drwxr-x--- 2 mysql mysql 78 Apr 29 15:21 .
drwxr-xr-x 6 mysql mysql 4096 Apr 29 14:38 ..
-rw-r----- 1 mysql mysql 67 Apr 29 14:38 db.opt
-rw-r----- 1 mysql mysql 8632 Apr 29 15:08 sbtest1.frm
-rw-r----- 2 mysql mysql 4118806528 Apr 29 15:19 sbtest1.ibd
-rw-r----- 2 mysql mysql 4118806528 Apr 29 15:19 sbtest1.ibd.hdlk
[root@test.a1-104-143.dev.unp dytest]# ls -la
2、drop大表
dba_testuser@10.1.104.143:15002) [dytest]> drop table sbtest1;
Query OK, 0 rows affected (0.39 sec)
drop 表后 物理文件还是存在的
total 4022284
drwxr-x--- 2 mysql mysql 42 Apr 29 15:23 .
drwxr-xr-x 6 mysql mysql 4096 Apr 29 14:38 ..
-rw-r----- 1 mysql mysql 67 Apr 29 14:38 db.opt
-rw-r----- 1 mysql mysql 4118806528 Apr 29 15:19 sbtest1.ibd.hdlk
3、删除物理文件
利用truncate减少文件大小的影响,慢慢删除
[root@test.a1-104-143.dev.unp dytest]# truncate -s 1G sbtest1.ibd.hdlk
[root@test.a1-104-143.dev.unp dytest]# ls
db.opt sbtest1.ibd.hdlk
[root@test.a1-104-143.dev.unp dytest]# du -sh *
4.0K db.opt
1.1G sbtest1.ibd.hdlk
删除脚本如下
for i in `seq 2194 -10 10 `;
do
sleep 2
$TRUNCATE -s ${i}G /data/mysql/dytest/sbtest1.ibd.hdlk
done
rm -rf /data/mysql/dytest/sbtest1.ibd.hdlk
可以避免直接删除一个大文件造成的io影响