我安装了多台装有MySQL 5.6.21的电脑。有些是从5.5升级,有些则只有5.6。在常规SQL查询期间,每个人都经常锁定我们的PHP脚本无法进行任何进一步查询的地方。当数据库锁定时,有两个选项可以让它再次运行:
所有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服务器锁定时我们的一台开发机器上的流程列表的截图。
有趣的是,我无法创建新的MySQL连接,但可以继续通过我在SqlPro或终端中打开的连接查询同一个数据库。杀戮过程109没有任何区别。在整个MySQL服务器重新启动之前,什么都不会加载任何localhost网页。
当MySQL 5.6服务器锁定时,我能找到的唯一常见线程是PHP应用程序导致它。 PHP应用程序使用什么类型的数据库连接似乎并不重要。我们已经看到PDO,Mysqli和被弃用的Mysql扩展都会导致MySQL 5.6服务器锁定。