摘要:最近由于福建开机广告生产环境的广告日志备份表主键(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. 纯代码实现wordpress文章隐藏内容评论可见

    在很多网站上都看过这个效果,比如说知己知彼网站,他的部分资源是需要我们评论后才能下载的,那么这个到底有什么用呢,对我而言,除了拿来装逼,还可以增加我的评论数量,不多说,先看看效果: 其实WordPre ...

  2. [C#]基于命名管道的一对多进程间通讯

    在工作中碰到了一个进程间通讯的问题,大概是这样的: 项目本身是.net Core做的,但是有部分功能Core中不方便实现,有的是依赖Framework,有的是因为权限和安全问题. 那基于这个问题,问了 ...

  3. 通过Beego将之前实现的短url项目实现

    正好通过这个小例子对之前了解的beego框架的基本内容进行一个简单的应用 实现的完整代码地址:https://github.com/pythonsite/go_simple_code/tree/mas ...

  4. 关于脱离laravel框架使用Illuminate/Validation验证器

    1.关于Illuminate/Validation验证器 Validation 类用于验证数据以及获取错误消息. github地址:github.com/illuminate/validation 文 ...

  5. spring cloud 专题一 (spring cloud 入门搭建 之 Eureka注册中心搭建)

    一.前言 本文为spring cloud 微服务框架专题的第一篇,主要讲解如何快速搭建spring cloud微服务及Eureka 注册中心 以及常用开发方式等. 本文理论不多,主要是傻瓜式的环境搭建 ...

  6. 需掌握 - JAVA算法编程题50题及答案

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题publi ...

  7. 大数运算的算法设计和C++实现

    1.背景 工作中遇到过需要进行极大数据的存储和运算的场景,当时使用Python解决了这个问题,在Python中,整数没有位数限制,使用起来很方便.但是当程序主体使用C/C++实现时,就比较麻烦.所以考 ...

  8. 使用IDEA搭建Spring Boot入门项目

    简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  9. C语言描述链表的实现及操作

    一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> ...

  10. [poj3740]Easy Finding_状态压缩_dfs

    Easy Finding poj-3470 题目大意:给你一个01矩阵,问能否选出一些行,使得这些行所新组成的01矩阵每列中有且只有1个1. 注释:1<=行数<=16,1<=列数&l ...