Comment configurer un délai de connexion en fonction de la connexion de L'utilisateur dans MySQL
j'ai actuellement plus de 100 connexions en état de sommeil.
une connexion doit rester en état de veille (et ne pas fermer) parce que c'est une connexion permanente, mais d'autres (avec un nom d'utilisateur différent) sont d'un script php et je veux qu'ils s'arrêtent très vite.
est-il possible de configurer un wait_timeout par utilisateur? et si oui, Comment?
7 réponses
il n'y a pas de configuration de temporisation par utilisateur, mais vous pouvez définir le wait_timeout
valeur de façon dynamique. C'est-à-dire qu'après avoir fait une connexion en tant qu'utilisateur donné, vous pouvez émettre une déclaration pour changer la valeur de timeout à ce que vous voulez qu'il soit pour la session de cet utilisateur.
essayez l'expérience suivante dans le client en ligne de commande mysql:
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...affiche 28800 (soit 8 heures), ce qui est la valeur par défaut wait_timout
.
mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...montre 60.
alors vous pouvez quittez la session, reconnectez, et encore une fois la valeur par défaut wait_timeout
est 28800. Elle se limite donc à la portée de la session en cours.
vous pouvez également ouvrir une deuxième fenêtre et démarrer une session client mysql séparée, pour prouver que changer le wait_timeout
dans une session n'affecte pas les autres sessions simultanées.
Vous devez définir les variables suivantes dans votre my.conf
:
[mysqld]
interactive_timeout=180
wait_timeout=180
wait_timeout
est un délai d'attente pour automatisé de connexions (à mon avis plus de 30 sur un serveur web, c'est trop).interactive_timeout
est un temporisation de l'interaction avec la console pour la session inactive.
une autre possibilité: MySQL supporte deux variables de timeout différentes,wait_timeout
pour les clients non interactifs, et interactive_timeout
pour les clients interactifs.
la différence entre les clients interactifs et non interactifs semble être simplement de savoir si vous avez spécifié le CLIENT_INTERACTIVE
option lors de la connexion.
Je ne sais pas si cela vous aide, parce que vous avez besoin de faire mysql_real_connect()
passer cette option dans son client_flag
paramètre. Je ne suis pas sûr de la langue ou de l'interface que vous êtes utiliser, donc je ne sais pas si cela vous permet de spécifier ce drapeau de connexion.
de toute façon si vous pouvez passer ce drapeau client, et que vous n'avez besoin que de deux types d'utilisateurs différents, alors vous pouvez configurer wait_timeout
et interactive_timeout
différemment dans la configuration du serveur MySQL, et ensuite utiliser celle avec la valeur plus courte quand vous voulez qu'une session donnée se termine rapidement.
Si vous utilisez Connecteur / J, vous pouvez utiliser sessionVariables dans L'URL JDBC du client comme ceci:jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600
D'autres connecteurs pour d'autres langues permettront probablement la même chose.
j'ai vérifié le mysql.user
table et il ne me semble pas qu'il y a là pour cela:
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | | |
| x509_issuer | blob | NO | | | |
| x509_subject | blob | NO | | | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.00 sec)
selon que vous utilisez MySQLi ou PDO, vos connexions MySQL PHP devraient soit raccrocher lorsque la requête le fait, soit être partagées dans un pool pour le processus Apache.
par exemple, avec PDO, pour désactiver les connexions persistantes (je pense que c'est la valeur par défaut), connectez-vous à votre DB avec:
$AOP = new AOP($dsn, $ user, $pass, Array (PDO:: ATTR_PERSISTENT = > false));
si vous voulez que vos scripts utilisent des connexions persistantes, mais que vous avez trop de connexions ouvertes à votre base de données en mode veille, vous devriez penser à configurerMaxServers
, MaxSpareServers
,MinSpareServers
et StartServers
de sorte qu'il n'y en a pas beaucoup qui traînent quand on n'en a pas besoin.
http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html
il est possible de tuer les connexions par utilisateur avec pt-kill. Vous pouvez programmer ceci ou mettre en place un travail de fond pour gérer cela.
init_connect sera exécuté chaque fois qu'un utilisateur se connecte, de sorte que nous pouvons écrire une petite instruction de cas et définir la valeur basée sur l'utilisateur. Veuillez noter que init_connect ne sera pas exécuté pour super user.
mysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE 'app1@%' THEN '30' ELSE @@wait_timeout END";