MySQL 5.6.x& PHP 5.6 - 似乎间歇性地锁定

时间:2015-06-29 17:22:39

标签: php mysql mysql-5.6

我安装了多台装有MySQL 5.6.21的电脑。有些是从5.5升级,有些则只有5.6。在常规SQL查询期间,每个人都经常锁定我们的PHP脚本无法进行任何进一步查询的地方。当数据库锁定时,有两个选项可以让它再次运行:

  1. 重启mysql服务器
  2. 杀死持有一切的过程
  3. 所有MySQL服务器都在运行InnoDB数据库,并且在快速连续运行查询时或者在开发过程中运行未正确编写,语法错误等的非最终查询时,似乎最有可能冻结。我注意到导致数据库锁定的过程似乎始终是“睡眠”。命令(至少是"显示进程列表"表示)。

    应该注意的是,当这些计算机使用MySQL 5.5.x时,数据库永远不会被锁定。这些数据库没有以任何方式联网。这些是在localhost上设置数据库的开发人员机器。

    这似乎与我认识的尝试MySQL 5.6.x的其他人非常相似。他在一个线程Web应用程序中运行一些查询。在MySQL 5.5.x下,大量的查询运行得很好,但在升级到MySQL 5.6.x之后,他注意到一次运行大量查询的线程似乎崩溃/锁定了服务器。所以,他刚刚恢复到MySQL 5.5.x。

    还有其他人遇到过这样的事吗?

    我已经阅读了这两个主题:

    MySQL 5.6 deadlock for locking the same rows twice?

    https://dba.stackexchange.com/questions/87016/only-innodb-databases-locking-up/87017#87017

    第一个帖子提到它是插入选择问题。但是我们在PHP中进行编码,因此不能一次执行多个查询。无论是否正在使用交易,我们的数据库都会锁定。

    第二个帖子在my.cnf文件中提到了一堆InnoDB设置。我们没有在my.cnf文件中配置任何InnoDB设置,如果InnoDB的开箱即用的MySQL设置导致数据库完全锁定,我真的很惊讶。

    最后,这是my.cnf文件的样子:

    [mysqld]
    datadir=/usr/local/mysql/data
    socket=/tmp/mysql.sock
    open_files_limit=5000
    long_query_time=1
    
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    
    [mysql.server]
    user=mysql
    basedir=/usr/local/mysql
    
    [client]
    socket=/tmp/mysql.sock
    

    非常感谢您的建议!

    ******更新08/04/2015 ******

    经过几周的处理和调查后,我发现事实上MySQL并没有锁定(因为我可以继续使用通过终端和其他数据库工具访问数据库比如Sequel Pro就好了。 PHP也没有锁定(因为不依赖于数据库的页面加载得很好)。

    因此,有些东西导致PHP无法连接到MySQL服务器,因为PHP认为MySQL服务器已经消失或者不存在。这似乎与MySQL的一个或多个流程有关,并且显示了流程列表"命令。 PHP Mysqli / PDO和Mysql 5.6是否存在已知的兼容性问题?我现在在OSX和Ubuntu服务器上看到了这种类型的问题,运行的PHP代码差别很大。

    我在MySQL中开启登录以查看它是否是导致问题的特定类型的查询,但是没有任何事情导致它。每当问题开始时,最后一个PHP查询始终是一个有效的查询,我可以在终端中运行没有问题。在PHP中再次运行查询甚至不能保证问题再次出现。

    感谢您的帮助!

    ******更新11/16/2015 ******

    正如Peter A所承诺的,这是上次MySQL服务器锁定时我们的一台开发机器上的流程列表的截图。

    show processlist results when MySQL is choked up

    有趣的是,我无法创建新的MySQL连接,但可以继续通过我在SqlPro或终端中打开的连接查询同一个数据库。杀戮过程109没有任何区别。在整个MySQL服务器重新启动之前,什么都不会加载任何localhost网页。

    当MySQL 5.6服务器锁定时,我能找到的唯一常见线程是PHP应用程序导致它。 PHP应用程序使用什么类型的数据库连接似乎并不重要。我们已经看到PDO,Mysqli和被弃用的Mysql扩展都会导致MySQL 5.6服务器锁定。

0 个答案:

没有答案