MySQL删除超大表操作
操作方式
- 在操作系统层对要删除的表添加硬连接
ln demo_table.ibd demo_table.ibd.bak
- 在MySQL实例上执行DROP TABLE命令
DROP TABLE demo_table;
- 使用TRUNCATE命令批量删除大文件
## 设置truncate命令路径
truncate_exe=/usr/bin/truncate
remove_exe=/usr/bin/rm
file_path=/apps/mysql/data/demo_table.ibd.bak
## 获取循环次数
file_length_byte=`ls -l ${file_path} |awk '{print $5}'`
let batch_count=${file_length_byte}/1024/1024/100
## 循环遍历
for batch_index in `seq ${batch_count} -1 1`;
do
echo "batch index: ${batch_index}";
let tmp_file_mb=batch_index*100;
${truncate_exe} -s ${tmp_file_mb}M ${file_path};
sleep 0.1;
done
## 彻底删除文件
${remove_exe} -f ${file_path}
操作原理
在Linux中,每个存储文件都会有指向该文件的Inode Index,多个文件名可以通过相同Inode Index指向相同一个存储文件。
当按照文件名删除文件时:
- 如果该文件名引用的Inode Index上还被其他文件名引用,则只会删除该文件名和Inode Index之间的引用
- 如果该文件名引用的Inode Index上没有被其他文件名引用,则删除该文件名和Inode Index之间的引用并删除Inode Index指向的存储文件。
模拟测试
模拟生成200G数据
## 执行命令
dd if=/dev/zero of=test.txt bs=1M count=200000
## 输出结果
记录了200000+0 的读入
记录了200000+0 的写出
209715200000字节(210 GB)已复制,238.903 秒,878 MB/秒
将脚本放入到test.sh文件并执行:
## 执行命令
time sh test.sh
## 输出信息
real 0m18.058s
user 0m1.066s
sys 0m17.149s