web-dev-qa-db-fra.com

Quelles sont les connexions utilisateur - quand sont créés et détruits?

Nous avons reçu une erreur intermittente sur le site:

AVERTISSEMENT: mysql_connect () [Fonction.mysql-Connect]: Utilisateur '557574_Prod' a dépassé la ressource "max_user_connections" (valeur actuelle: 10)

Qui empêche le site d'être accès et efficacement, il est en panne.

(évidemment, augmenter les "max_user_connections" résoudrait, mais ce n'est pas une option via notre système d'hébergement)

J'ai peut-être "réparé", mais je ne suis pas sûr à 100% que je comprends le problème et j'aimerais être clair. Je pensais que le problème doit être causé par trop d'emplois cron en utilisant les connexions (nous avons un couple qui court chaque minute) et j'ai réduit le nombre d'emplois cron et qui semblait réduire la quantité d'erreurs. J'ai créé un compte d'utilisateur distinct pour les travaux Cron, donc si tel était le problème, il devrait être résolu maintenant.

Cependant, notre système de journalisation n'enregistre pas l'erreur lorsqu'il survient, je suis donc toujours concerné.

Je demande donc: Qu'est-ce qui constitue une "user_connection" dans MySQL?

  • y a-t-il une connexion distincte pour chaque appel de dB?
  • sinon, quand les appels DB nécessiteraient-ils une connexion distincte?
  • pourquoi cette erreur ne se produirait-elle que sur le site de production en direct? Peut-être qu'il y a une connexion séparée pour chaque IP unique ou SIMIALR?

Je sens que je le pense. . .

7
JIStone

Veuillez noter le maquillage de 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)

Notez la colonne max_user_connections. Il met un moratoire sur le nombre de connexions qu'un utilisateur peut faire par heure. Vérifiez et assurez-vous que l'utilisateur '557574_PROD' ne se connecte pas à MySQL une tonne de fois en moins d'une heure.

Ceci est utilisé conjointement avec l'option max_user_connections que vous pouvez définir dans /etc/my.cnf =

Veuillez modifier Max_user_connections dans /etc/my.cnf ou si l'utilisateur individuel dispose de cette colonne, cette colonne MySQL.USER.MAX_USER_Connections. Si vous n'avez pas de contrôle de configuration sur my.cnf et que vous ne pouvez pas faire SQL contre le schéma MySQL, vous priez et implore votre entreprise d'hébergement de soulever ces limites pour vous.

Je crois que vous pouvez définir les max_user_connections comme une variable de session, mais vous aurez peut-être besoin de certains privilèges, probablement super.

En ce qui concerne l'établissement de connexions, vous devez conserver ces connexions ouvertes. Peut-être envoyer un rythme cardiaque de quelque sorte en faisant un choix. Mais devinez quoi ??? The DB Colonnes Max_Questtions Monitor Sélectionnez les requêtes par heure et Max_Updates Surveille les insertions, les mises à jour, les suppressions par heure. Vous devrez peut-être vérifier ces colonnes dans MySQL.User. Vous pouvez vérifier rapidement ces chiffres avec:

SHOW GRANTS;

Je ne sais pas si les limites de connexion par heure de l'utilisateur sont par fil ou par utilisateur. Vous pouvez répondre rapidement à cela en se connectant à la DB de manière agressive en utilisant 2 ou 3 DB connectes en même temps et le message d'erreur doit se manifester. Il vous appartient comment compter le nombre de connexions, peut-être "Afficher le statut comme" Connections ";" Il devrait atteindre les limites maximales de la connexion dans les connexions ou la somme de la valeur de l'état de la connexion de toutes les connexions.

Veuillez également vérifier les valeurs wait_timeout et interactive_timeout. La valeur par défaut est 28800 dans un serveur autonome. Ils peuvent être définis déjà. Vous ne pouvez pas les définir dans une connexion en cours. Vous devez être capable de les définir comme suit: (pour les nouvelles conceptions à venir)

SET GLOBAL interactive_timeout = 86400;
SET GLOBAL wait_timeout = 86400;

Si vous ne pouvez pas courir même ces commandes, mes condoléances !!! :(

10
RolandoMySQLDBA