mysql锁表

一次Mariadb死锁排查过程回顾

我的梦境 提交于 2020-02-29 22:33:39
场景 在使用某个平台的时候,有些页面发现长时间,部分数据无法加载成功,开始排查问题。 确定是mariadb的问题的过程 访问了几个页面都是正常的,唯独某几个页面查询实时监控数据时无法加载出来, F12 查看接口发现有几个业务相似的接口长时间不返回数据。 既然整体功能是正常的,只有部分页面出现问题,而且都是实时数据无法显示,怀疑是同一个地方出现问题,于是把接口放在一起发现共同点。 都是 timeout 长时间无响应,而且不是前端资源加载的问题, F12 可以看到一个接口的请求过程,例如下图 查看代码逻辑 ,发现几个接口同时查询过一个表,登陆 mariadb ,发现 SELECT 长时间不返回。怀疑是锁表了。 以下所有示例使用 docker 启动 mysql 演示复现。 我先锁表 lock table test read; lock table test write; 发现是卡住了 mysql> select * from test; mysql> 2013 - Lost connection to MySQL server during query 查看长时间卡住的线程 查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程) show processlist; 但是此命令只能显示前100条数据,要想看全部的数据,请输入 show full

一次Mariadb死锁排查过程回顾

懵懂的女人 提交于 2020-02-29 20:03:45
场景 在使用某个平台的时候,有些页面发现长时间,部分数据无法加载成功,开始排查问题。 确定是mariadb的问题的过程 访问了几个页面都是正常的,唯独某几个页面查询实时监控数据时无法加载出来, F12 查看接口发现有几个业务相似的接口长时间不返回数据。 既然整体功能是正常的,只有部分页面出现问题,而且都是实时数据无法显示,怀疑是同一个地方出现问题,于是把接口放在一起发现共同点。 都是 timeout 长时间无响应,而且不是前端资源加载的问题, F12 可以看到一个接口的请求过程,例如下图 查看代码逻辑 ,发现几个接口同时查询过一个表,登陆 mariadb ,发现 SELECT 长时间不返回。怀疑是锁表了。 以下所有示例使用 docker 启动 mysql 演示复现。 我先锁表 lock table test read; lock table test write; 发现是卡住了 mysql> select * from test; mysql> 2013 - Lost connection to MySQL server during query 查看长时间卡住的线程 查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程) show processlist; 但是此命令只能显示前100条数据,要想看全部的数据,请输入 show full

mysql锁表处理

孤街醉人 提交于 2020-02-24 05:18:47
方法一: 查询锁住的事务,然后杀死进程 SELECT * FROM information_schema.innodb_trx; kill trx_mysql_thread_id (trx_mysql_thread_id 参数值) 例如 kill 9087 select * from information_schema.innodb_lock_waits G; select * from information_schema.innodb_locks G; 如果第一种方法没起到作用 SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 查询执行时间大于1000ms的进程 然后进行kill ID 如 kill 8900 如果数据表还没有解锁 减小执行时间进行查询,杀死进程 来源: CSDN 作者: dwfyzf 链接: https://blog.csdn.net/dwfyzf/article/details/104456616

Mysql 锁表查询

北慕城南 提交于 2020-02-08 06:54:59
-- 查询是否锁表 SHOW OPEN TABLES WHERE In_use > 0; -- 查看所有进程 SHOW FULL PROCESSLIST; -- 杀掉指定mysql连接的进程号 KILL 71684; -- 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; -- 查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; -- 查看服务器状态 SHOW STATUS LIKE '%lock%'; -- 查看超时时间: SHOW VARIABLES LIKE '%timeout%'; 来源: CSDN 作者: 你脸红的样子 链接: https://blog.csdn.net/Iisongyu/article/details/104215920

mysql中kill掉所有锁表的进程

孤者浪人 提交于 2020-01-08 21:00:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程: mysql中kill掉所有锁表的进程 2009-05-12 14:03 转载请保留如下作者信息 作者 : jesse 博客 : http://hi.baidu.com/leechl 3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表. mysql > show processlist ; 出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行. mysql > kill thread_id ; kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下. #!/bin/bash mysql - u root - e " show processlist " | grep - i " Locked " >> locked_log . txt for line in ` cat locked_log.txt | awk '{print $1 }' ` do echo " kill $line ; " >> kill

MySQL表锁_LOCK TABLES_UNLOCK TABLES

纵然是瞬间 提交于 2019-12-23 11:06:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> MySQL表锁_LOCK TABLES_UNLOCK TABLES mysql5.6 参考文档: http://dev.mysql.com/doc/refman/5.6/en/lock-tables.html 锁表和解锁表的基本语法 LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... UNLOCK TABLES lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITE MySQL锁表的目的 MySQL enables client sessions to acquire table locks explicitly(明白地,明确地) for the purpose of cooperating with other sessions for access to tables, or to prevent other sessions from modifying tables during periods when a session requires exclusive(单独的,排外的) access to them. A session can

Mysql全局锁、表锁和Innodb行锁

二次信任 提交于 2019-12-15 12:35:59
锁 数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁的典型使用场景是,做全库逻辑备份 。也就是把整库每个表都select出来存成文本。 让整库都只读,听上去就很危险: 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。 对于全部是InnoDB引擎的库,我建议你选择使用–single-transaction参数,对应用会更友好。

mysql中kill掉所有锁表的进程

会有一股神秘感。 提交于 2019-12-09 13:07:09
转载请保留如下作者信息 作者 : jesse 博客 : http://hi.baidu.com/leechl 3点钟刚睡下, 4点多, 同事打电话告诉我用户 数据库 挂掉了. 我起床看一下进程列表. mysql>show processlist; 出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在 MySQL 的shell里面执行. mysql>kill thread_id; kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下. #!/bin/bash mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt for line in `cat locked_log.txt | awk '{print $1}'` do echo "kill $line;" >> kill_thread_id.sql done 现在kill_thread_id.sql的内容像这个样子 kill 66402982; kill 66402983; kill 66402986; kill 66402991; ..... 好了, 我们在mysql的shell中执行,

关于MySQL InnoDB 锁行还是锁表

*爱你&永不变心* 提交于 2019-12-04 11:08:10
http://www.cnblogs.com/mingxuan/archive/2011/10/11/2207560.html 关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况。为什么呢?先看一下这篇文章。 做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统。假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为 Select restnum from book where id =1 ; #1 -- 如果 restnum 大于 0 ,执行 update Update book set restnum=restnum-1 where id=1 ; #2 Select restnum from book where id =1 ; #3 -- 如果 restnum 大于 0 ,执行 update Update book set restnum=restnum-1 where id=1; #4 这样,第二个人执行到 select 语句的时候就会处于等待状态直到第一个人执行 commit 。从而保证了第二个人不会读到第一个人修改前的数据。 问题就来了,当 2 个人同时来借的时候,有可能第一个人执行 select 语句的时候

mysql - 表锁,行锁

五迷三道 提交于 2019-12-04 00:13:17
MyISAM存储引擎:开销小,加锁快,无死锁。锁定粒度大,并发度低,容易发生锁冲突。 不支持事务。 采用表锁 (操作时对操作的表上锁) 基本不用了 innoDB存储引擎:开销大,有死锁,锁定粒度小,不容易发生冲突。 采用行锁(每句sql执行时对操作行上锁),但是也支持表锁 mysql默认引擎 问题:库存超卖 库存1,结果两个人同时购买,第一个人判断后还有1个剩余,于是执行 update 操作, 这时第二个人开始判断,此时update还没结束,剩余还是1,于是也开始进update操作,导致库存变为-1. 1. 悲观锁,在判断的select语句中加入行锁,与update语句互斥,保证第1个人提交事务前,第2个人不能操作这个货物。 2.乐观锁,添加版本字段,查询时更新版本字段,版本字段变化时,不能更新。 select num, version from warehouse where id = 商品编号; 查询数量同时查出版本,比如111 update warehouse set num = num - 1, version = version + 1 where version = 111; 这样假如warhouse在查询后这个商品被更改过,这条将不会更改任何字段。如果成功了版本同时改变为112。 reference: http://www.zsythink.net/archives