在mysql 上如何在不影响生产的情况下删除一个大表
mysql 中常用的删除的方法基本上有下面三种方式:
1、delete
一般用于删除少量表中的数据
优化建议,一定要加上where 条件,并且where条件的列上 一定要有主键或者索引。否则会出现全表扫描的情况
2、drop
直接将表删除,包括表的数据和表的定义。
这种操作,MySQL 会加上一个全局锁,删除期间会阻塞操作,所以对大表来说这样操作一定会对生产造成很大的影响
优化建议,大表不要使用drop table 这种方式,可以考虑 truncate table的方式
3、truncate
这种方式要优于 drop table,风险较之 drop 要小一点,不需要加锁,所以删除表的速度很快
注意事项:这种方式虽然很快,但是需要考虑删除大文件对IO产生的影响
使用下面的骚操作更安全吆!
以上三种方式的各有适用的场景,下面介绍一种删除大表又同时能够规避删除大文件带来 IO 过载风险的方式。
1、对表的 idb 文件创建硬链接,这样实际存储的文件上有两个inode指向这个文件。当文件有两个及以上硬连接时,对文件删除,操作系统只会删除这个硬链接,而不是实际上的文件
2、drop table table_name;这样实际上删除的是ibd 文件的硬链接,速度会非常快,不用考虑锁操作
3、这样 drop 掉表之后,数据文件实际上还是存在的,所以我们还要删除文件系统中的文件
4、使用操作系统的 truncate 工具可以指定将文件削减到指定大小,所以我们可以使用这个工具控制删除文件的速度,也就是说可以控制 IO 的占用
truncate 工具使用实例:
for i in `seq - `;
do
sleep
truncate -s ${i}G /data/test.ibd.hardlk
done
rm -rf /data/mysql/mytest/erp.ibd.hardlk
上面代码就是讲一个 300G的文件每次减小 10G,间隔 2秒,最后剩余 10G 用rm -rf 删除即可。
在mysql 上如何在不影响生产的情况下删除一个大表的更多相关文章
- 如果让你来做HashMap扩容,如何实现在不影响读写的情况下扩容?
我觉得逼格高,不是体现在问题多刁钻,知识点多深,而是一个非常明确,无歧义的问题,能考察出面试者多方面的能力.这个问题背后:1.了解java中,HashMap的实现:如果一个面试者了解这一点,说明至少他 ...
- 关于MySQL什么时候使用索引问题以及什么情况下应不建或少建索引
一,什么情况下使用索引1. 表的主关键字 自动建立唯一索引 2. 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 3. 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk ...
- mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复
转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...
- MySQL 实现将一个库表里面的数据实时更新到另一个库表里面
MySQL 实现将一个库表里面的数据实时更新到另一个库表里面 需求描述:MySQL 里面有很多的数据库,这些数据库里面都有同一种表结构的表 (tb_warn_log),这张表的数据是实时更新的,现在需 ...
- 定点分析: MySQL InnoDB是如何保证系统异常断电情况下的数据可靠性?
MySQL支持事务,所以保证数据可靠的前提是对数据的修改事务已经成功提交 这个问题可以解释为'MySQL InnoDB是如何保证事务C(一致性)D(持久性)性的?' 可能出现的两种情况: (一致性)数 ...
- springmvc+ajaxFileUpload上传文件(前后台彻底分离的情况下)
首先是导入jar包: web.xml: <servlet> <servlet-name>mvc-dispatcher</servlet-name> <serv ...
- 开源的Eclipse的文件转码插件,可以在不影响中文的情况下改变项目文件编
http://www.blogjava.net/lifesting/archive/2008/04/11/192250.html, 感谢此作者! 问题描述: 我们项目开发都统一采用utf-8格式编码, ...
- C#实现不影响当前线程情况下间隔一定的时间执行一段代码
大家知道C#间隔一定时间去执行一段代码,常用的有 1. Thread.Sleep(多少毫秒); 2. 使用Timer控件间隔一定的时间,设置执行一次 以上两种方法,实现起来不难,弊端在于会阻塞当前线程 ...
- MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
大表分表后每个表的结构相同,可以用sql的union 比如a,b表结构相同可以通过union来联接 select * from aunion allselect * from bwhere.... 其 ...
随机推荐
- vue路由嵌套,对应展示的视图
- HTML头信息标签和标题标签
<html> <!-- 头信息的作用 1. 可以设置网页的标题. 2. 可以通知浏览使用指定的码表解释html页面. --> <head> <meta htt ...
- C# lock 为什么要设置成只读
首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行, ...
- Oracle COALESCE函数
Oracle COALESCE函数 Oracle COALESCE函数语法为COALESCE(表达式1,表达式2,...,表达式n),n>=2,此表达式的功能为返回第一个不为空的表达式,如果都为 ...
- 【.NET】关于.NET前后台提示框的那点事
前言 关于提示框,或多或少都用到过,提示框常见方式两种:js原生alert() 和 div模拟弹层:下面以一个常见的需求业务场景来展现提示框的那点事: 正文内容 客户:需求方: 小白:实现方(全权负责 ...
- Git-T
或在命令行上创建一个新的存储库echo“#gittest”>> README.md git init git add README.md git commit -m“first commi ...
- Python-数据库索引浅谈
检索原理 检索初识 索引在MySQL中是一种"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的检索性能,非常关键,尤其是当表中的数据量越大,索引对于性能的提升越显 ...
- RabbitMQ和Kafka对比
# 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? # R ...
- 大觅网02Day
docker环境搭建:(注:请先完成上一次的环境搭建) A.部署环境(导入上次系统的时候修改虚拟机的内存) 1.安装系统自带版本Docker:apt-get install docker.io 2.查 ...
- Linux编辑网络连接
Linux编辑网络连接 实验目标: 通过本实验掌握新建网络连接.修改hosts文件.修改主机名的方法. 实验步骤: 1.新建一个名为review的网络连接,并配置ip地址,启用新连接 2.修改ho ...