MySQL Online DDL导致全局锁表案例分析
MySQL Online DDL导致全局锁表案例分析
我这边遇到了什么问题?
线上给某个表执行新增索引SQL, 然后整个数据CPU打到100%, 连接数暴增到极限, 最后导致所有访问数据库的应用都奔溃.
SQL如下:
ALTER TABLE `book`
ADD INDEX `idx_sub_title` (`sub_title` ASC);
能看到什么?
'10063293', 'root', '10.0.0.1:35252', 'novel', 'Query', '50', 'Waiting for table metadata lock', 'ALTER TABLE `lemon_novel`.`book` \nADD INDEX `idx_sub_title` (`sub_title` ASC)'
'10094494', 'root', '172.16.2.112:42808', 'novel', 'Query', '31', 'Waiting for table metadata lock', 'SELECT \n book_trend.book_id AS book_id,
很奇怪, 这两边都在等"Waiting for table metadata lock"
反手查一下"Waiting for table metadata lock"是什么
初步的一些结论
看下来下面的一些结论:
MySQL 5.6以后的版本,支持在线DDL,新增index/删除index之类的可以直接InPlace操作,不需要rebuild整张表,理论上效果是很快的,详细资料见Online DDL Operations
DDL add index 操作会lock table metadata,此操作是导致我们服务不可用的原因
有怀疑过lock tabel matadata和MySQL autocommit有关,但是实践下来两者看起来没有关联。
后来在阿里云上面还看到过他们特定写过类似的答疑.
阿里云建议主要是这样操作.
这里需要找到的是一直在占用该表的会话,而不是正在等待MDL锁解除的会话,注意区分。可以根据State列的状态和Info列的命令内容来进行分析判断。
您也可以用如下命令查询长时间未完成的事务,如果导致阻塞的语句的用户与当前用户不同,请使用导致阻塞的语句的用户登录来终止会话。
select concat('kill ',i.trx_mysql_thread_id,';') from information_schema.innodb_trx i,
(select
id, time
from
information_schema.processlist
where
time = (select
max(time)
from
information_schema.processlist
where
state = 'Waiting for table metadata lock'
and substring(info, 1, 5) in ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p
where timestampdiff(second, i.trx_started, now()) > p.time
and i.trx_mysql_thread_id not in (connection_id(),p.id);
然而在我的场景, 上面的SQL并没有任何的进程输出.
陷入僵局的...
不过上面给了一些思路, 现在我们主要是因为有东西占用着 table metadata lock, 导致当前所有的东西都没有执行.
show full processlist;
看一眼没什么卵用, 处理那两个奇怪的wait lock, 其他的都挺正常的.
那么, 看下现在谁占用着锁?
怎么看呢?
select * from information_schema.innodb_trx;
神奇了, 真有两个东西在占用锁.
那kill 了他们看看.
额, 解决了.
最终结论
某个奇怪的程序开了查询或者奇怪的操作, lock了 table metadata, 之后连接一直都没有被释放, 导致以上各种问题.
现在的问题来了, 究竟是哪个程序或者哪个代码导致的呢?
抱歉, 我现在也还不知道...
理论上可以查, 但是上次去查的时候发现数据库显示的host对应机器的端口早就没东西了, 死无对证ing.
最后建议
online DDL前,最好确认一下当前数据库有没有类似lock存在
最好的方案还是主从切换来搞
全文完.
MySQL Online DDL导致全局锁表案例分析的更多相关文章
- mysql查询更新时的锁表机制分析
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...
- mysql查询更新时的锁表机制分析(只介绍了MYISAM)
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...
- 【MySQL 读书笔记】全局锁 | 表锁 | 行锁
全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只 ...
- MySQL的中的全局锁、表级锁、行锁
MySQL的中的全局锁.表级锁.行锁 学习极客时间-林晓彬老师-MySQL实战45讲 学习整理 全局锁 对整个数据库实例加锁.通过使用Flush tables with read lock (FTWR ...
- mysql死锁-查询锁表进程-分析锁表原因【转】
查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然 ...
- MySQL5.7之在线DDL不会锁表
MySQL5.7在线修改varchar字段不在锁表,测试过程如下: mysql> select version(); +------------+ | version() | +-------- ...
- MySQL中select * for update锁表的范围
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- mysql中kill掉所有锁表的进程
--mysql中kill掉所有锁表的进程 --------------------------------2014/05/20 在数据库的管理中,我们经常会碰到锁表的问题,看一下进程列表. mysql ...
随机推荐
- 【亲测有效】安装npm慢的解决方案
使用淘宝的NPM库:npm install -gd express --registry=http://registry.npm.taobao.org
- with读、写文件
1.with写文件 save_file = "1.txt" str_data = "123a\nbc" with open(save_file, 'a', en ...
- SQL SERVER-Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)
Q:先在一个实例中恢复一个数据A,然后又想在恢复一次,取别名为A2,这是报异常SQL SERVER-Exclusive access could not be obtained because the ...
- Needham-Schroeder Scyther工具形式化过程
1.Needham-Schroeder Public key Protocol 协议的通信认证的过程 顺序图的 1. A-> S : A, B 2. S->A: {Ks, ...
- Java--8--新特性--接口中的变化!!
package InterfaceP; public interface Interface1 { default String getName(){ return "Interface1& ...
- 【转】高性能网络编程2----TCP消息的发送
在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字.操作TCP协议发送数据时,面对的是数据流.通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时, ...
- EF映射——从数据库更新实体
最近在做ITOO项目,由于更新了数据库,需要重新从数据库映射到实体,本来看过关于EF的学习资料,直接可以从数据库更新到实体,但这种小事也是有很多问题的,必须在更新的时候做好选择.下面分享一下如何从数据 ...
- 行为型模式(六) 状态模式(State)
一.动机(Motivate) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同. 如何在运行时根据对象的状态 ...
- 判断 List map set 是否为空
//如果object为null,则设置为defaultValue ObjectUtils.defaultIfNull(object, defaultValue); //判断集合是否为null List ...
- centos 环境下安装maven
安装Maven Maven的下载地址:http://maven.apache.org/download.cgi这里以最新的3.2.3版本为例进行安装,在这之前需要确保机器上已经安装了JDK. 首先下载 ...