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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top