JIS*_*one 7 mysql max-connections
我们在外部站点上遇到了间歇性错误:
警告:mysql_connect() [function.mysql-connect]:用户“557574_prod”已超出“max_user_connections”资源(当前值:10)
这会阻止该站点被访问并有效地将其关闭。
(显然增加 'max_user_connections' 可以解决这个问题,但这不是我们的托管方案的一个选项)
我可能已经“修复”了它,但我不是 100% 确定我理解这个问题,我想说清楚。我认为问题一定是由太多的 cron 作业耗尽连接造成的(我们每分钟都有几个运行),我减少了 cron 作业的数量,这似乎减少了错误数量。我为 cron 作业创建了一个单独的用户帐户,所以如果这是问题,现在应该解决。
但是我们的日志系统在错误发生时并没有记录下来,所以我还是很担心。
所以我问:MySQL 中的“user_connection”是什么构成的?
我觉得我多虑了。. .
Rol*_*DBA 10
请注意 mysql.user 的构成:
mysql> show create table mysql.user\G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int(11) unsigned NOT NULL DEFAULT '0',
`max_updates` int(11) unsigned NOT NULL DEFAULT '0',
`max_connections` int(11) unsigned NOT NULL DEFAULT '0',
`max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
`plugin` char(64) COLLATE utf8_bin DEFAULT '',
`authentication_string` text COLLATE utf8_bin,
PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
请注意列 max_user_connections。它暂停了用户每小时可能建立的连接数。检查并确保用户“557574_prod”没有在不到一个小时的时间内多次连接到 mysql。
这与您可以在 /etc/my.cnf 中设置的选项 max_user_connections 结合使用
请更改 /etc/my.cnf 中的 max_user_connections,或者,如果单个用户设置了此列,则更改该列 mysql.user.max_user_connections。如果您没有对 my.cnf 的配置控制,并且您不能对 mysql 模式执行 SQL,那么您会恳求您的托管公司为您提高这些限制。
我相信您可以将 max_user_connections 设置为会话变量,但您可能需要某些权限,可能是 SUPER。
至于建立连接,您需要保持这些连接打开。也许通过执行 SELECT 发送某种心跳。但猜猜怎么了 ???db 列 max_questions 每小时监控 SELECT 查询,max_updates 每小时监控 INSERT、UPDATE、DELETE。您可能需要在 mysql.user 中检查这些列。您可以通过以下方式快速检查这些数字:
SHOW GRANTS;
Run Code Online (Sandbox Code Playgroud)
我不确定用户的每小时连接限制是每个线程还是每个用户。您可以通过同时使用 2 或 3 个 DB connecitons 积极连接到 DB 来快速回答这个问题,并且错误消息应该会显示出来。如何计算连接数取决于您,也许是“SHOW STATUS LIKE 'Connections';” 它应该达到一个连接内连接的最大限制,或者它可以是所有连接的连接状态值的总和。
另请检查wait_timeout 和interactive_timeout 值。独立服务器中的默认值为 28800。它们可能已经设置好了。您不能在当前连接中设置它们。您必须能够按如下方式设置它们:(对于即将推出的新连接)
SET GLOBAL interactive_timeout = 86400;
SET GLOBAL wait_timeout = 86400;
Run Code Online (Sandbox Code Playgroud)
如果你连这些命令都不能运行,我的哀悼!!!:(