首页 > 数据库 >MySQL 大表的清理

MySQL 大表的清理

时间:2023-06-19 16:07:22浏览次数:42  
标签:drop old 清理 rb MySQL test 数据 大表

一、事件背景

一个大表里面存储有数据28亿,大表结构是hash 100个分区,占用空间1.8T,里面保留了2年多的数据,数据文件大小持续在增大,目前MySQL数据目录datadir占用磁盘95%,无法通过drop分区回收空间,计划保留最新3个月数据。

二、实施步骤

在凌晨业务低峰期执行

1.新增同结构新表

注意:create table like 语句会丢失 auto 值

create table rb_test_new like rb_test;

2.改表名

alter table rb_test renmae to rb_test_old;
alter table rb_test_new rename to rb_test;

3.导出数据

找一个有足够空间的磁盘目录导出最新3个月数据。注:这个导出时间很长。

SELECT * INTO OUTFILE '/opt/mysql/backup/import_export/rb_test_3.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM rb_test_old where entry_date > '2022-09-16 00:00:00';

4.drop 大表

drop table rb_test_old;

注意:巨大的表drop会hang住数据库,IO会占用大。也可以考虑通过给数据文件创建硬链接来删除。
硬链接删表步骤:

1)创建硬链接

ln rb_test_old#P#P_RB_test_01.ibd  rb_test_old#P#P_RB_test_01.ibd.hdlk
ln rb_test_old#P#P_RB_test_02.ibd  rb_test_old#P#P_RB_test_02.ibd.hdlk
............................................
ln rb_test_old#P#P_RB_test_100.ibd  rb_test_old#P#P_RB_test_100.ibd.hdlk

2)drop 表

drop table rb_test_old;

3)删除真实数据文件

rm rb_test_old#P#P_RB_test_*.ibd.hdlk

5.导入数据

1)打开参数

show variables like 'local_infile';

返回结果是on,否则修改参数命令

set global local_infile=on;

2)加快导入

SET GLOBAL foreign_key_checks=0;
SET GLOBAL unique_checks=0;
SET GLOBAL innodb_flush_log_at_trx_commit=0;

3)清理binlog空间

导入数据会暴增binlog日志,随时监控binlog目录,保证占有率不要超过100%
清理1天前的binlog

purge master logs before date_sub(now(),interval 1 day);

4)导入数据

load data local infile '/opt/mysql/backup/import_export/rb_test_3.txt' ignore into table rb_test fields terminated by ',' enclosed by '"' lines terminated by '\n';commit;

5)恢复参数

SET GLOBAL foreign_key_checks=1;
SET GLOBAL unique_checks=1;
SET GLOBAL innodb_flush_log_at_trx_commit=1;

三、总结

1.预期会存储过亿数据的大表,为了后期的数据清理,建议建表为时间字段为范围分区结构,方便通过drop 过期时间的分区来回收空间。
2.若是通过delete来清理数据的,长期的delete和insert会导致表带有大量碎片,容易造成表损坏,建议一段时间后通过optimize整理表空间,回收碎片空间。
3.大表操作,会影响到在线业务,建议在业务低峰期执行。
4.大表操作,会锁表,所以对于大表的操作,可以考虑通过rename的方式,用新的空表去接收数据,旧表数据再导入补齐数据,适用大表清理,大表添加修改字段,添加索引等ddl操作。
5.大量数据的导入,会导致binlog目录占用暴增,注意监控binlog目录的占用率。
6.drop 巨大的表,会hang住实例,若是担心业务会受到影响,可以考虑通过对数据文件创建硬链接来删除。
7.做好MySQL实例数据目录占用的监控,超过80%就人工干预处理。

标签:drop,old,清理,rb,MySQL,test,数据,大表
From: https://blog.51cto.com/u_13482808/6514952

相关文章

  • MySQL 数据库管理与优化技巧
    使用索引优化查询性能:索引是提高查询性能的关键因素之一。合理地创建索引可以加快查询速度。在设计数据库时,根据经常使用的查询条件和频率,选择合适的列创建索引,同时避免过多的索引,以避免索引维护的开销。优化数据库结构:通过合理的数据库设计,可以提高数据库的性能和可扩展性......
  • mysql匹配正则替换url字符串
    替换http://a.com/a/b/c/ss/s.mp3为  /a/b/c/ss/s.mp3类似上面可以使用  '^((https|http)?://)?[[:alnum:].-]+\/' selectREGEXP_REPLACE('https://pbx-bj-tx07.7moor.com/dds/ee/c/aa.mp3','^((https|http)?://)?[[:alnum:].-]+\/','/�......
  • mysql索引优化-收藏
    原文章:https://www.cnblogs.com/eryuan/p/17488732.htmlhttps://www.cnblogs.com/eryuan/p/17430377.html in/or到底能不能用索引参数range_optimizer_max_mem_size要控制范围优化器可用的内存,使用range_optimizer_max_mem_size系统变量:值为0表示“没有限制”。当值......
  • mysql 可以重复执行的表结构修改存储过程
    mysql可以重复执行的表结构修改存储过程当多个数据库要执行同一个sql,但是在其中有一个数据库失败需要重新执行,那么就要保证执行的数据库是可以重复执行的了,下面就是可以重复执行的存储过程,收藏起来DELIMITER;;CREATEPROCEDURE`AddColumnIfNotExists`( tableNameVARCHAR......
  • MySQL表类型和存储引擎
    基本介绍MySQL的表类型由存储引擎决定,主要包括MyISAM、innoDB、Memory等MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB这六种又分为两类,一类是“事务安全型”,比如:InnoDB;其余都属于第二类,称为“非事务安全型”细节说明MyISAM不支持事务、也不......
  • MySQL时间函数的选择
    Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。在MySQL中,获得系统当前时间可以使用now()函数,这是最简单和应用最广的函数。除此之外,curre......
  • 初探MySQL-小白的Linux安装笔记
    这篇文章是我们组内一位小伙伴垒的文字,亲测每个步骤,真实、可靠、接地气,照着做就能入门Linux下的MySQL安装,欢迎更多的小伙伴能将日常工作中的经验记录下来,分享给其他人,正所谓“独乐乐不如众乐乐”。最近接到一个任务,由于开发环境变化,需要将旧机器上的mysql迁移到新机器上去,其中涉及......
  • 小白学习MySQL - 闲聊聊
    众所周知,在DB-Engines的排行榜,一直占据前两位的数据库,就是Oracle和MySQL,Oracle作为关系型数据库的老大,在这个生态圈中,占据着绝对优势,MySQL作为一款面向“开源"的软件,虽然被Oracle曲线收购,相比之下,还是存在着“开源”的血统,而且有很多分支,无论是国外的MariaDB,还是国内的AliSQL,都在发......
  • 小白学习MySQL - MySQL会不会受到“高水位”的影响?
    前两天碰到了一个问题,MySQL的一张表,1220万数据量,需要删除1200万数据,仅存储20万数据,讨论了三种方案,1.00:00直接执行truncate,只存储新数据。2.将1220万中的20万采用CTAS存到一张中间表,再通过rename改这两张表的名称,实现替换操作。3.delete删除1200万数据。经过综合考虑,用的方案3,方......
  • php解决 mysql_connect(): The mysql extension is deprecated and will be removed i
    Themysqlextensionisdeprecatedandwillberemovedinthefuture:usemysq翻译:mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。解决方法:打开php.ini配置文件把display_errors=On改为display_errors=Off改完之后重启服务就可以了。  ......