【MySQL】MySQL查询锁表的SQL语句

让我告诉你我当时遇到的陷阱。
在杭州的时候,公司的系统突然崩溃了。
我花了很长时间才意识到某张桌子已经关门了。
真让人头疼啊!
在MySQL中检查锁定表,没有现成的SQL,所以需要使用一些技巧。
让我告诉你我当时是怎么做到的。

首先要知道,检查锁表主要依赖于InnoDB。
如果使用SHOW ENGINE INNODB STATUS命令,会看到一堆信息,相当乱。
还得自己去深挖,才能找到锁相关的信息。
我记得当我查看时,我花了很长时间才找到“最近的操作”部分。
他说是什么操作导致了堵塞。

但是用的最多的是看INFORMATION_SCHEMA中的表。
例如INNODB_LOCKS和INNODB_LOCK_WAITS,这两个表包含当前的锁信息。
当时我查了一个项目。
用户一增加,我就发现这两个表的数据爆炸了,说明锁争用很严重。

如果你想检查某个特定的表是否被锁定,例如table_name,你可以跨表检查。
首先检查 INNODB_TRX 以查看当前正在处理哪些事务。
再次检查 INNODB_LOCKS 以查看哪个事务正在锁定什么。
当时我检查了一个订单系统,发现有一个交易阻塞了所有新订单,新用户无法下单。
我就是这样找到的。

还有一个方法,就是直接尝试。
您在链接 A 上运行 SELECT FROM table_name WHERE id = 1 FOR UPDATE,这将锁定该记录。
您在连接 B 上运行相同的 SQL。
如果报告错误“日志记录已锁定”,则意味着连接 A 被阻止。
这是我在测试功能时所做的。
我意识到一张钥匙表是关着的,我差点就把它搞砸了。

后来MySQL 5 .6 出来了,有了PERFORMANCE_SCHEMA以及更完整的信息。
您可以检查 data_locks 和 data_lock_waits。
后来换系统的时候就用的这个。
信息更加详细,一目了然。

说实话,如果你没有控制锁表的经验,你还真应付不了。
当我第一次遇到它时,我差点跳墙。
现在想来,还不如多练习,多看文档。
如果你真的想尝试,请先在测试环境中尝试,不要直接进入生产。

oracle 锁表时,怎么查出是哪些SQL语句导致了锁表

哎呀,这个SQL语句解析锁表问题是我之前遇到的一个陷阱。
我当时负责一个项目,记得当时很头疼,因为数据库突然被锁了。
当时,我正在编写很长的 SQL 来使用您提到的查询检索所有相关信息。

我记得是2 01 6 年在成都做的一个项目,我们用的是Oracle数据库。
经过一段时间的检查,我发现某个特定的用户正在执行一个复杂的查询,导致整个表被锁定。
我仍然记得那个询问。
它有大约十几行和多层嵌套子查询。
这让我头晕目眩。

然后我按照你提到的步骤操作,首先检查 V$DB_OBJECT_CACHE 并找到锁定的表。
接下来,我检查了 V$ACCESS 并找到了运行该查询的会话。
然后我使用V$SESSION和V$PROCESS找到对应的SID和SPID。

最后,我使用ALTER SYSTEM KILL SESSION命令杀死Oracle进程,然后使用Linux Kill命令杀死操作系统进程。
我记得当时的命令是ALTER SYSTEM KILL SESSION '1 ,2 ';,还有kill -9 1 2 3 4
解决问题后,我们对复杂的查询语句进行了优化,将其拆分为几个简单的查询,避免一次加载过多的数据。
现在回想起来,我觉得确实花了很多功夫。
但这次经历也教会了我很多,会让我以后面对类似问题的时候更有信心。
呵呵,我就先说到这里,再分享一下我后来遇到的另一个坑。