MYSQL百G大表正确清空方式

当我们遇到大表清空时,会有几种相应的操作方法(表player):

1. truncate table player;
2. 创建新表、rename表、然后直接drop老表
3. 创建新表、rename表、创建老表硬链接、slowrm进行大文件删除。

注:创建新表时,需要提前和开发沟通用来确认新表自增ID起始位置

下面将是几种方案的操作步骤以及优劣势

1.操作步骤:
    * truncate table player;

    优势:操作简单
    劣势:表产生元数据锁,机器资源占用过高。
    结论:强烈不推荐使用
2.操作步骤:
    * create table player_new like player;
    * rename table player to player_old_del, player_new to player;
    * drop table player_old_del;

    优势:减少锁时间,表切换业务基本无感
    劣势:drop 表依然会产生大量机器IO占用,导致MYSQL性能急剧下降
    结论:此方案可以在业务低峰期执行。
3.操作步骤:
    * create table player_new like player;
    * rename table player to player_old_del, player_new to player;
    * 在OS层为player_old_del.ibd文件创建硬链:ln player_old_del.ibd player_old_del.ibd.ln
    * drop table player_old_del;
    * 通过slowrm限制删除硬链文件:slowrm -f -s 1 -b 1073741824 player_old_del.ibd.ln(注:SSD类磁盘基本IO使用率控制在20%左右)

    优势:减少锁时间,表切换业务基本无感,drop 表以及删除大文件不会对业务产生影响。
    劣势:操作繁琐,需要去每个slave节点创建硬链接并且进行删除。
    结论:推荐此方法,建议把操作封闭成脚本化。

    在对数据库进行任何DDL操作时,不仅要关注数据库层面影响,而且还要对于当前系统层影响做出相应判断。

原文地址:https://blog.51cto.com/11145134/2486347

时间: 2024-08-30 08:25:44

MYSQL百G大表正确清空方式的相关文章

Mysql千万级大表优化

Mysql的单张表的最大数据存储量尚没有定论,一般情况下mysql单表记录超过千万以后性能会变得很差.因此,总结一些相关的Mysql千万级大表的优化策略. 1.优化sql以及索引 1.1优化sql 1.有索引但未被用到的情况(不建议) (1)避免like的参数以通配符开头时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描. 以通配符开头的sql语句,例如:select * from t_credit_detail where Flistid like '%0'\G

mysql 生产库大表delete

mysql 生产库大表删除 一般线上业务增长较快,造成某些表达到分表的临界值,表行数超过2000w且查询频繁,如表业务没有较多的聚合查询的话,可以考虑按时间归档部分历史数据.现推荐2种本人之前使用过的删除方式. 按照主键或者索引拆分后分段执行,使用存储过程 需要注意这种大表删除,如果是在主库执行,尽量把会话改成语句格式,以保证不会出现复制延迟 语句如下:set session binlog_format='STATEMENT'; CREATE PROCEDURE sp_delete_data()

MySQL 存储过程删除大表

1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure status\G 查看数据库中有哪些存储过程 show procedure status where db = 'db_name'\G 查看指定数据库(db_name)中有哪些存储过程 select name from mysql.proc where db = 'db_name'; 查看指定数据库(db

【优化】MySQL千万级大表优化解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

Mysql千万级大表同步复制的一些问题

1 [[email protected] ~]# pt-online-schema-change -u root -p xxxxxx -h localhost -A utf8 D=jinyuanbao,t=DistributionGoods --new-table-name DistributionGoods_0 --no-drop-trigger --no-swap-table --no-drop-new-table --execute 2 No slaves found. See --rec

mysql跨服务器,表数据同步方式!

过程:PLSQL——>Database links——>新建一个dblink 新建dblink具体步骤: 1.数据库连接 所有者:XXX(比如:EAPS) 名称:XXX(辨识度高点的名字,比如:EAPS_LINK) 2.连接到 用户名:XXX(目标数据库用户名) 口令:XXX(目标数据库密码) 数据库: (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = IP地址)(PORT = 端口号)) ) (CONNECT_

第八章|MySQL数据库|库操作|表操作

1.初识数据库 我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个 专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等一系列问题, 总之,把程序员从数据管理中解脱出来,专注于自己的程序逻辑的编写. 数据(Data):描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数

MySQL 按日期分表

一.表不存在时则创建 之前做项目实在是太赶了,很多东西都没记录.是时候补回来了 MySQL做一个大表,由于要存历史记录,所以数据量很大,查询很慢.恰好查询的时候,又不需要时间太久的冷数据.现在将其实现原理提取成一个控制台小程序. 首先,创建一个简单的数据库访问类. public static class CommonDao { private static MySqlConnection conn = new MySqlConnection(ConfigurationManager.AppSet

MySQL大表清空和删除正确方法

1 清空大表 1.1 truncate 删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少. truncate 清空表数据,50G的表大概需要20秒以上: mysql> truncate table old_table; 1.2 rename 1.2.1