# mysql CREATE TABLE IF NOT EXISTS metadata lock坑
Posted yueguanghaidao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# mysql CREATE TABLE IF NOT EXISTS metadata lock坑相关的知识,希望对你有一定的参考价值。
mysql CREATE TABLE IF NOT EXISTS metadata lock坑
今天早上被一声声警报声给吵醒,拿起手机一看,too many processes,proc.num达到了529,我一愣,什么情况,这报警是第一次遇到,还是同时3台服务器都报警。赶快登陆服务器看看,ps一下的确是很多进程,而且都应该早就结束了,于是猜测试mysql的问题,show processlist一看,竟然有300度metadata lock,瞬间不淡定了。
之前也是遇到过这个问题,但都是1,2个,很快就结束了。开始也是认为是CREATE TABLE IF NOT EXISTS导致的,但后来同事验证并不是这个问题导致的,一个进程循环100万次插入,另一个查询创建表,发现并没有冲突。
delimiter $$
CREATE PROCEDURE myproc()
BEGIN
DECLARE
i INT ;
SET i = 1 ; loop1 :
WHILE i <= 1000000 DO
INSERT INTO test1_all_role (openid, clientid, roleid)
VALUES
(1, 2, 3) ;
SET i = i + 1 ;
END
WHILE loop1 ; end$$
delimiter ;
CALL myproc();
今天一看,居然不在一个事务里,怪不得。
今天研究了下,发现是mysql的bug,https://bugs.mysql.com/bug.php?id=63144
Connection 1:
mysql> create table tbl(a int);
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tbl;
Empty set (0.00 sec)
mysql>
Connection 2:
mysql> create table if not exists tbl(a int);
... hangs ...
看介绍percona版本是没有这个bug的。
当然有2个解决办法:
1.如有可能表预先创建
2.应用程序做规避,比如先desc或者select from判断,首次创建也有多线程的问题,这个看具体应用怎么解决了。
以上是关于# mysql CREATE TABLE IF NOT EXISTS metadata lock坑的主要内容,如果未能解决你的问题,请参考以下文章