摘要:最近由于福建开机广告生产环境的广告日志备份表主键(int类型)达到上限(21亿多),不能再写入数据,需要重新清空下该表并将主键重置,但由于表里有8亿多记录的数据量,使用重置命令及DDL命令执行地非常慢,所以采取删除物理表结构文件的方式来进行快速清空表表数据!

前言

1、本文介绍是在MySQL 5.5.29版本进行的操作,其他的版本的没有试过,有兴趣的可以自己尝试去试下!

2、本文介绍的是删除frm和idb文件,同时不破坏原表结构的清空数据的方式!

一、数据背景及系统介绍

 

为更好说明问题,首先介绍下我们系统的数据流转的过程

step1:日志入库。API向机顶盒/EPG提供广告接口,采集广告请求日志,当STB访问EPG,EPG调用广告请求接口获取广告策略,并写入到报表数据库的【广告请求数据原始表t_ad_req_log】中;

step2:存储过程备份日志表数据。由于每天产生的广告请求数据量有2000多万,对于etl汇总时抽取有压力,所以通过存储过程将7天以前的数据备份到【广告请求数据备份表t_ad_req_log_back】中,【广告请求数据原始表t_ad_req_log】只保留7天内的数据,约8000万~1亿2千万记录左右;

step3:etl抽取汇总。使用etl每小时抽取【广告请求数据原始表t_ad_req_log】的上一时段的数据,抽取,分析,汇总写入报表数据库的【广告/广告位按时段汇总表】里面;

step4:定时删除备份日志表数据。每隔一段时间检查下数据etl汇总后的数据是否有问题,确认无误数据没问题后才将【广告请求数据备份表t_ad_req_log_back】清空,因为该表占用空间实在太大了,不清空隔一段时间就会收到磁盘空间报警短信!

本次就是有近2个月没有清空数据,发现就有近9亿条记录(为什么这里不用select count(*) 语句来查询?是因为执行这样一条语句10来分钟都没出结果,才用的explain来查看下表中总数据记录)

占用磁盘空间也是高得吓人,120G

当然不仅仅是因为占用磁盘过高,更重要的原因是,该表的主键值达到int类型的上限值2147483646了(21亿多),这使得最新的备份数据不能继续写入到该备份表了

所以,确认汇总表没有数据缺失后,急需清空该备份表的数据,并重置下主键

二、为什么不用DDL

通过上面确认【广告请求数据备份表t_ad_req_log_back】表数据可删后,当务之急就是要尽快清空数据,无疑最先想到的就是使用使用ALTER重置主键,执行命令:

ALTER TABLE t_ad_req_log AUTO_INCREMENT= 1;

开个小会,结果36分钟过去没有出现结果,尴尬了,执行线程查询命令:

show processlist;

发现一直在“ copy to tmp table”,无奈,停下来试试执行drop命令:

DROP TABLE t_ad_req_log;

喝杯咖啡,执行了40分钟还没删掉,快急出翔了。

什么叫无能为力?什么叫难以启齿的柔弱?大概就是MySQL DDL遇到9亿级表结构的时候了吧!

于是不得已另选它法——删除表文件ibd和frm方式!

三、3分钟删除

当然,找到该表的文件,一键rm -rf 删除还是贼爽的,轻轻松松不用3分钟。

不过因为不知道这么删会不会有什么关联影响,于是就先到测试服务器做了个测试,还是遇到了些问题,记录下步骤后,到现网删除9亿级记录数据清空数据也是用了不到3分钟?具体操作如下:

3.1 表结构备份

先在测试数据库创建一个与现网【广告请求数据备份表t_ad_req_log_back】一样的表,然后将备份表的表文件t_ad_req_log_back.frm和t_ad_req_log_back.ibd拷贝到现网/home目录下,这一步的操作主要是为了后面解决建表时出现的“Table `t_ad_req_log_back` already exists”问题

3.2 删掉现网表文件

切换到mysql的data目录下,执行删除命令:

rm -rf t_ad_req_log_back.*

再一看,磁盘空间并没有释放,还是276G

于是使用lsof命令查看文件信息:

lsof -n|grep deleted

发现删除程序还存活

继续使用kill -9 27713命令该进程,磁盘空间得到释放

3.3 重新建表

由于表文件已经被删掉,该表也就不存在,使用show命令查看也确实没有发现这个表了

于是想继续建表,发现报错,报错信息一直是“Table `t_ad_req_log_back` already exists”

Google了一下,才找到原因,原来是:

由于直接删除了表的物理文件 但mysql的信息库 information_schema 或 mysql 库对该表的信息还存在,也就是说InnoDB格式的表索引都保存在ibdata1这个文件中,虽然物理文件被删除,但是ibdata1中的索引没有删除,所以数据库认为该表已经存在,导致创建失败,也就说直接rm -rf 表文件破坏了表结构。

难道这个表名就无法再用了吗?

当然可以,j记得吗?我们最先做了个表结构备份,现在它派上用场了,将/home目录下的两个表文件t_ad_req_log_back.frm和t_ad_req_log_back.ibd拷贝到数据库的data的目录下,发现表存在了

执行desc命令发现又报错“Table `t_ad_req_log_back` already exists”,这是怎回事呢?

再一看用户权限不对,

改变用户权限

chmod 660 t_ad_req_log_back.frm
chown -R mysql:mysql t_ad_req_log_back.frm

然后再drop表, 删除之后会发现该数据库的data目录下的物理文件夹中还存在t_ad_req_log_back.ibd文件, 删除该文件,然后再次建表就ok了

至此,9亿级表数据被清空了,同时表结构也没有被破坏!

我的相关文章参考:不停机不停服务,MYSQL可以这样修改亿级数据表结构

丢掉DDL,我用这招3分钟清空 MySQL 9亿记录数据表的更多相关文章

  1. 教你几招,快速创建 MySQL 五百万级数据,愉快的学习各种优化技巧

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  2. 三分钟入门 InnoDB 存储引擎中的表锁和行锁

    各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...

  3. 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...

  4. [指南] 15分钟学会MySQL(Linux版)

    原文链接:http://www.mysqlpub.com/thread-348-1-1.html 原创出处:MySQLpub.com  , 作者:kider  ,转载请注明作者和出处,并不能用于商业用 ...

  5. (转)十分钟了结MySQL information_schema

    十分钟了结MySQL information_schema  原文:http://www.cnblogs.com/shengdimaya/p/6920677.html information_sche ...

  6. 3分钟解决MySQL 1032 主从错误(转)

    转自  https://blog.51cto.com/suifu/1845457 3分钟解决MySQL 1032主从错误 Part1:写在最前 1032错误----现在生产库中好多数据,在从库误删了, ...

  7. [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则

    转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ...

  8. 10分钟梳理MySQL核心知识点

    数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 做业务,要懂基本的SQL语句:做性能优化,要懂索引,懂引擎:做分库分表,要懂主从,懂读写分离... 今天我们用10分钟,重 ...

  9. 白日梦的MySQL专题(第38篇文章)8分钟回顾MySQL的索引

    目录 公众号首发-推荐阅读原文-格式更好看 一.导读 二.聚簇索引 三.二级索引 四.联合索引 4.1.什么是联合索引 4.2.左前缀原则 4.3.联合索引的分组&排序 五.覆盖索引 六.倒排 ...

随机推荐

  1. 在VMWare上安装Arch Linux

    1.为什么选择Arch Linux Arch Linux 是通用 x86-64 GNU/Linux 发行版.Arch采用滚动升级模式,尽全力提供最新的稳定版软件.初始安装的Arch只是一个基本系统,随 ...

  2. js操作DOM元素

    创建 document.createElement() 查找 document.getElementById()   返回对拥有指定 id 的第一个对象的引用. document.getElement ...

  3. Loadrunner 11在win7录制中失败“the recording of the application was terminated by windows due to window data execution prevention feature"

    在录制过程中遇到如下问题: 查了下如何Enable, Disable Data Execution Prevention (DEP) in Windows 10/8/7 (http://www.the ...

  4. js中==和===区别

    简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...

  5. ImageLoader 笔记

    BitmapFactory 我们不能够通过构造函数创建Bitmap对象.如果需要将图片转成Bitmap对象加载到内存中,就需要使用BitmapFactory类.BitmapFactory跟据图片数据源 ...

  6. RabbitMQ的安装和配置

    在Windows下进行rabbitMQ的安装 第一步:软件安装 如果安装rabbitMQ首先安装基于erlang语言支持的OTP软件,然后在下载rabbitMQ软件进行安装(安装过程都是下一步,在此不 ...

  7. c++ --> typedef用法总结

    typedef用法总结 一.四大用途 用途1  定义类型别名,在大量使用指针的地方,typedef更方便 typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // ...

  8. Java多线程:死锁

    周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考  1.Jstack 1.1 jstack能得到运行j ...

  9. js 关于日期,字符串转化

    <html><head><title>简单获取日期的JS</title><meta http-equiv="Content-Type&q ...

  10. 仿京东树形菜单插件hovertree

    hovertree是一个仿京东的树形菜单jquery插件,暂时有银色和绿色两种. 官方网址:http://keleyi.com/jq/hovertree/欢迎下载使用 查看绿色效果:http://ke ...