So richten Sie je eine Verbindung Timeout der Benutzer-Login in MySQL
Frage
Im Moment habe ich mehr als 100 Verbindungen im Sleep-Zustand.
Einige Verbindung im Ruhezustand bleiben muss (und nicht schließen), weil es dauerhafte Verbindung ist, aber einige andere (mit einem anderen Benutzernamen) sind von einem PHP-Skript, und ich möchte, dass sie sehr schnell Timeout.
Ist es möglich, ein wait_timeout pro Benutzer einrichten? und wenn ja, wie?
Lösung
Es gibt keine pro-Benutzer-Timeout-Konfiguration, aber Sie können den wait_timeout
Wert dynamisch gesetzt. Das heißt, nachdem Sie eine Verbindung als einen bestimmten Benutzer zu machen, können Sie eine Erklärung abgeben können, um den Timeout-Wert zu ändern, was Sie wollen, dass es für diese Benutzersitzung sein.
Versuchen Sie das folgende Experiment in dem mysql-Kommandozeilen-Client:
mysql> SHOW VARIABLES LIKE 'wait_timeout';
... 28800 zeigt (d.h. 8 Stunden), die Standardeinstellung wait_timout
ist.
mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';
... zeigt 60.
Dann können Sie die Sitzung beenden, wieder und wieder der Standard-wait_timeout
ist 28800. So ist es auf den Umfang der aktuellen Sitzung beschränkt.
Sie können auch ein zweites Fenster öffnen und eine separate MySQL-Client-Sitzung starten, um zu beweisen, dass der wait_timeout
in einer Sitzung zu ändern hat keinen Einfluss auf andere gleichzeitige Sitzungen.
Andere Tipps
Sie sollten die folgenden Variablen in my.conf
gesetzt:
[mysqld]
interactive_timeout=180
wait_timeout=180
wait_timeout
ist ein Timeout für automatische Verbindungen ( meiner Meinung nach mehr als 30 auf einem Web-Server ist zu viel ).
interactive_timeout
ist eine console Interaktion timeout für Leerlaufsitzungen.
Eine andere Möglichkeit: MySQL unterstützt zwei verschiedene Timeout-Variablen, wait_timeout
für nicht-interaktive Clients und interactive_timeout
für interaktive Kunden
Der Unterschied zwischen interaktiven und nicht-interaktiven Kunden scheint einfach zu sein, ob Sie die CLIENT_INTERACTIVE
Option angegeben bei der Verbindung.
Ich weiß nicht, ob dies Ihnen hilft, weil man irgendwie müssen mysql_real_connect()
diese Option übergehen zu lassen in ihren client_flag
Parametern. Ich bin mir nicht sicher, welche Sprache oder Schnittstelle Sie verwenden, so dass ich weiß nicht, ob es Ihnen erlaubt, diesen Verbindungs-Flag angeben.
Wie auch immer, wenn Sie diesen Client Flagge passieren können, und Sie brauchen nur zwei verschiedene Arten von Benutzern, dann könnten Sie wait_timeout
und interactive_timeout
anders in der MySQL-Server-Konfiguration konfigurieren, und dann mit dem kürzeren Wert den man verwenden, wenn Sie einen bestimmten wollen Sitzung sofort zu einem Timeout.
Wenn Sie Connector / J , können Sie verwenden sessionVariables in der JDBC-URL des Clients wie folgt: jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600
Weitere Anschlüsse für andere Sprachen werden wahrscheinlich die gleiche ermöglichen.
init_connect ausgeführt wird, wenn sich ein Benutzer anmeldet, so können wir kleine case-Anweisung schreiben und den Wert basierend auf Benutzer eingestellt. Bitte beachten Sie, dass die init_connect nicht für Superuser ausgeführt werden.
mysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE 'app1@%' THEN '30' ELSE @@wait_timeout END";
überprüfte ich den mysql.user
Tisch und es sieht nicht so aus es eine Einstellung für sie da ist:
+-----------------------+-----------------------------------+------+-----+---------+-------+
| 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)
Je nachdem, ob Sie verwenden MySQLi oder PDO, Ihre PHP-MySQL-Verbindungen sollten entweder auflegen, wenn die Anforderung der Fall ist, oder in einem Pool für den Apache-Prozess gemeinsam genutzt werden.
Zum Beispiel mit PDO, persistenten Verbindungen zu deaktivieren (ich glaube, dies ist die Standardeinstellung), zu Ihrer DB Verbindung mit:
$ gU = new PDO ($ dsn, $ user, $ Pass Array (PDO :: ATTR_PERSISTENT => false));
Wenn Sie Ihre Skripte persistente Verbindungen verwenden, aber Sie haben zu viele Verbindungen offen für Ihre Datenbank im Sleep-Modus, sollten Sie darüber nachdenken, Ihre Apache MaxServers
, MaxSpareServers
Konfiguration MinSpareServers
und StartServers
so dass nicht so viele herumhängen, wenn sie sind nicht erforderlich.
http://www.percona.com/doc/ Percona-Toolkit / 2.1 / pt-kill.html
Es ist möglich, Verbindungen pro Benutzer mit pt-kill zu töten. Sie können dies planen oder einen Hintergrundauftrag einrichten, dies zu umgehen.