前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL Cases-MySQL找出谁持有表锁

MySQL Cases-MySQL找出谁持有表锁

原创
作者头像
姚崇
修改2021-10-25 14:21:32
7380
修改2021-10-25 14:21:32
举报

全部关于锁文章

表锁(表锁也是MDL锁的一种)

表级锁对应的instruments(wait/lock/table/sql/handler)默认已开启,对应的consumers为performance_schema.table_handlers ,在setup_consumers中只受全局配置项global_instrumentation控制,默认已开启。所以默认情况下只要设置系统配置参数performance_schema=ON即可。下面通过一个示例来演示如何找出谁持有表级锁。

会话一:

代码语言:javascript
复制
lock table t read;

会话二:

代码语言:javascript
复制
update t set pad='xxx' where id = 1; # 被阻塞

查询:

找出持有表锁的脚本

代码语言:javascript
复制
SELECT
    ps.conn_id,
    concat('kill ',ps.conn_id,';') as kill_command,
    ps.user,
    ps.db,
    ps.command,
    ps.state,
    ps.time,
    ps.last_statement,
    lock_summary.lock_summary
FROM
    sys.processlist ps INNER JOIN (
        SELECT
            owner_thread_id,
            GROUP_CONCAT(
                DISTINCT CONCAT(
                    mdl.LOCK_STATUS,
                    ' ',
                    mdl.lock_type,
                    ' on ',
                    IF(
                        mdl.object_type = 'USER LEVEL LOCK',
                        CONCAT(mdl.object_name, ' (user lock)'),
                        CONCAT(mdl.OBJECT_SCHEMA, '.', mdl.OBJECT_NAME)
                    )
                )
                ORDER BY
                    mdl.object_type ASC,
                    mdl.LOCK_STATUS ASC,
                    mdl.lock_type ASC SEPARATOR '\n'
            ) as lock_summary
        FROM
            performance_schema.metadata_locks mdl
        GROUP BY
            owner_thread_id
    ) lock_summary ON (ps.thd_id = lock_summary.owner_thread_id) and lock_summary.owner_thread_id != sys.ps_thread_id(connection_id())
order by ps.time desc;

查询结果如下,默认级别下可以看到按照时间顺序130会话的操作信息,如果想kill掉130,直接执行kill 130;即可

代码语言:javascript
复制
+---------+--------------+----------------+------+---------+---------------------------------+------+-------------------+------------------------------------+
| conn_id | kill_command | user           | db   | command | state                           | time | last_statement    | lock_summary                       |
+---------+--------------+----------------+------+---------+---------------------------------+------+-------------------+------------------------------------+
|    1047 | kill 1047;   | root@localhost | test | Sleep   | NULL                            |  115 | lock table t read | GRANTED SHARED_READ_ONLY on test.t |
|    1048 | kill 1048;   | root@localhost | test | Query   | Waiting for table metadata lock |   38 | NULL              | PENDING SHARED_WRITE on test.t     |
+---------+--------------+----------------+------+---------+---------------------------------+------+-------------------+------------------------------------+
2 rows in set (0.24 sec)

更多文章欢迎关注本人公众号,搜dbachongzi或扫二维码

作者:姚崇 Oracle OCM、MySQL OCP、Oceanbase OBCA、PingCAP PCTA认证,擅长基于Oracle、MySQL Performance Turning及多种关系型 NoSQL数据库

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 全部关于锁文章
  • 表锁(表锁也是MDL锁的一种)
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档