mysql中metalock,MYSQL METALOCK

MYSQL METALOCK

祖仙教小凡仙 海鲨数据库架构师

MYSQL 没有ORACLE 阻塞视图 找到谁阻塞了谁比较麻烦

--## 开启性能抓获功能

UPDATE performance_schema.setup_consumers SET ENABLED='YES';

UPDATE performance_schema.setup_instruments SET ENABLED='YES',TIMED='YES'

要开启各种事件收集器

##会话1

mysql> SET AUTOCOMMIT=OFF;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM MONITER_DDL;

会话1 把自动提交给关闭了,然后执行一个查询,在MYSQL里查询是个事务,感觉好扯蛋.

在ORACLE DML语句才是事务,查询根本不是个事务!

##会话2

mysql> CREATE INDEX IX_IP ON MONITER_DDL(IPADDRES);

会话2 对该表建个索引,结果被阻塞了!

##3 查看进程信息

show processlist

28b4616cabf4dfeef6478b3bc4258415.png

7956a8511474b803f4164895502d3ec7.png

这里看到ID 为10的 进程 创建索引在等待元数据锁

那谁阻塞了它? 谁持有MDL锁?

##4 元数据锁

select OWNER_THREAD_ID,OBJECT_TYPE,OBJECT_SCHEMA,OBJECT_NAME,LOCK_TYPE,LOCK_DURATION,LOCK_STATUS

from performance_schema.metadata_locks

where OWNER_THREAD_ID !=

sys.ps_thread_id(connection_id());

2e8e7c931ce9099b63e2508c7793eee7.png

这里看到有两个线程ID 持有元数据锁 分别是 39 和35线程.

通过OBJECT_NAME,可以看出39,35持有同一张表的锁.

5查看事务ID

select TRX_ID,TRX_STATE,TRX_STARTED,TRX_mysql_thread_id from information_schema.innodb_trx;

925b334e71a33a1672137e2b42255541.png

这里的TRX_MYSQL_THREAD_ID 应该是进程ID

会话1 进程ID

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

| 14 |

+-----------------+

1 row in set (0.00 sec)

会话1 线程ID

mysql> select sys.ps_thread_id(14);

+----------------------+

| sys.ps_thread_id(14) |

+----------------------+

| 39 |

+----------------------+

1 row in set (0.00 sec)

##查看线程信息

SELECT

THREAD_ID,

NAME,

PROCESSLIST_ID,

CONNECTION_TYPE,

THREAD_OS_ID,

PROCESSLIST_USER,

PROCESSLIST_HOST,

PROCESSLIST_DB,

PROCESSLIST_COMMAND,

PROCESSLIST_TIME,

PROCESSLIST_STATE,

PROCESSLIST_INFO

FROM performance_schema.threads

WHERE type = 'FOREGROUND'

and THREAD_ID in (39,35)

984cb3b6d103d1c3d512bd88dd0df192.png

24713a2b3cad90a8d12c974b50a14fd2.png

##查询39线程执行了什么语句

select s.OBJECT_TYPE,s.OBJECT_SCHEMA,s.OBJECT_NAME,s.LOCK_TYPE,s.LOCK_DURATION,s.LOCK_STATUS,

sh.THREAD_ID,sh.EVENT_NAME,sh.TIMER_START,sh.LOCK_TIME,sh.SQL_TEXT

from performance_schema.metadata_locks s

leftjoin performance_schema.events_statements_history sh

on s.OWNER_THREAD_ID=sh.THREAD_ID

where owner_thread_id != sys.ps_thread_id(CONNECTION_ID())

AND owner_thread_id=39

orderby TIMER_START DESC;

cb31740ed008ccd177ca137e58240061.png

670c1a26fac9cd6cf3cf7a93570f8074.png

88521221c189698e42f16f95fd857f2d.png

1e678faedf857237fc6cb9240acda61a.png

299eb9c85bed36af47c6ea7e5ce95aae.png

3a2de3fe1451bbc1043d29f8db63cf9b.png

22bc8c97ab1eba4d29aa0e07d1c67b28.png

70b018c994a45f8a0792e3e20bec86fb.png

9d7c143b46e79bef3764405a40977fc9.png

990bfecbbc84fbc000799efc240ca278.png

fdf8f3ba8a2126b8518c7eefe9725a27.png

从列表发现 39线程 有设置 自动提交为假!

会话1 执行COMMIT

mysql> select sys.ps_thread_id(14);

+----------------------+

| sys.ps_thread_id(14) |

+----------------------+

| 39 |

+----------------------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

会话2 自动完成创建索引

mysql> CREATE INDEX IX_IP ON MONITER_DDL(IPADDRES);

Query OK, 0 rows affected (1 hour 2 min 41.23 sec)

Records: 0 Duplicates: 0 Warnings: 0

创建索引等了1个小时之久

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值