现在的位置: 首页 > 关系型数据库 > 数据库优化 > 正文

MySQL线上大表如何无害删除??

时间:2019年04月19日 | 分类:数据库优化 | 评论:0 条 | 浏览:416 次

在我们日常的DB维护中,经常会遇到大表删除问题,大表如果在数据层进行drop操作,将会对磁盘造成很大的IO冲击,进而导致线上业务有问题

这里我们采用针对数据文件建立硬链,欺骗mysql,进行删表操作,然后,再在系统层进行删除

1.新建临时表

mysql> create table event_message_tmp like event_message;

2.新旧表切换

mysql> rename table event_message to event_message_old,event_message_tmp to event_message;

3.系统层面建立硬链接

cd /data/mysql/data/***

# ln event_message_old.ibd event_message_old.ibd.hdlk

# ll event_message_old*

4.DB层面,删除老表

mysql> drop table event_message_old;

注意 表太大,直接rm 必然会对数据库服务器的IO性能造成压力

脚本如下:

#!/bin/bash

TRUNCATE=/usr/bin/truncate

for i in `seq 218 -5 5`;

do

sleep 1

echo "$TRUNCATE -s ${i}G /data/mysql/data/mysql56_data3306/abc/event_message.ibd.hdlk"

$TRUNCATE -s ${i}G /data/mysql/data/mysql56_data3306/abc/event_message.ibd.hdlk

done

×