# mysql CREATE TABLE IF NOT EXISTS metadata lock坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueguanghaidao/article/details/52067458

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判断,首次创建也有多线程的问题,这个看具体应用怎么解决了。

猜你喜欢

转载自blog.csdn.net/yueguanghaidao/article/details/52067458