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
posted @ 2019-02-17 10:52  TeyGao  阅读(2150)  评论(0编辑  收藏  举报