it-swarm.com.de

So richten Sie ein Verbindungszeitlimit ein, das von der Benutzeranmeldung in MySQL abhängt

Ich habe derzeit mehr als 100 Verbindungen im Ruhezustand.

Einige Verbindungen müssen im Ruhezustand bleiben (und werden nicht geschlossen), da es sich um permanente Verbindungen handelt, andere (mit einem anderen Benutzernamen) stammen jedoch aus einem PHP-Skript, und ich möchte, dass das Timeout sehr schnell erfolgt.

Ist es möglich, ein wait_timeout pro Benutzer einzurichten? und wenn ja, wie?

19
acemtp

Es gibt keine benutzerspezifische Zeitlimitkonfiguration, Sie können den Wert wait_timeout jedoch dynamisch festlegen. Das heißt, nachdem Sie als bestimmter Benutzer eine Verbindung hergestellt haben, können Sie eine Anweisung absetzen, um den Zeitlimitwert auf den Wert zu ändern, den Sie für die Sitzung dieses Benutzers wünschen.

Probieren Sie das folgende Experiment im mysql-Befehlszeilenclient aus:

mysql> SHOW VARIABLES LIKE 'wait_timeout';

... zeigt 28800 (d. h. 8 Stunden). Dies ist die Standardeinstellung für wait_timout.

mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';

... zeigt 60.

Anschließend können Sie die Sitzung beenden, erneut eine Verbindung herstellen, und der Standardwert für wait_timeout ist 28800. Daher ist er auf den Umfang der aktuellen Sitzung beschränkt.

Sie können auch ein zweites Fenster öffnen und eine separate mysql-Clientsitzung starten, um zu beweisen, dass das Ändern des wait_timeout in einer Sitzung keine Auswirkungen auf andere gleichzeitige Sitzungen hat.

27
Bill Karwin

Sie sollten die folgenden Variablen in Ihrem my.conf setzen:

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout ist ein Timeout für automatisierte Verbindungen ( meiner Meinung nach sind mehr als 30 auf einem Webserver zu viel ).
interactive_timeout ist ein Zeitlimit für die Konsoleninteraktion für eine inaktive Sitzung.

5
Sych

Eine weitere Möglichkeit: MySQL unterstützt zwei verschiedene Zeitlimitvariablen: wait_timeout für nicht interaktive Clients und interactive_timeout für interaktive Clients.

Der Unterschied zwischen interaktiven und nicht interaktiven Clients scheint einfach darin zu liegen, ob Sie bei der Verbindung die Option CLIENT_INTERACTIVE angegeben haben.

Ich weiß nicht, ob Ihnen das hilft, weil Sie mysql_real_connect() irgendwie dazu bringen müssen, diese Option in ihrem client_flag -Parameter zu übergeben. Ich bin nicht sicher, welche Sprache oder Benutzeroberfläche Sie verwenden. Daher weiß ich nicht, ob Sie dieses Verbindungsflag angeben können.

Wenn Sie dieses Client-Flag übergeben können und nur zwei verschiedene Benutzertypen benötigen, können Sie wait_timeout und interactive_timeout in der MySQL-Serverkonfiguration unterschiedlich konfigurieren und dann den mit dem kürzeren Wert verwenden, wenn eine bestimmte Sitzung zu einem bestimmten Zeitpunkt stattfinden soll schnell raus.

2
Bill Karwin

Wenn Sie Connector/J verwenden, können Sie sessionVariables in der JDBC-URL des Clients wie folgt verwenden: jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

Andere Konnektoren für andere Sprachen werden wahrscheinlich dasselbe ermöglichen.

2
Toddius Zho

Ich habe die mysql.user-Tabelle überprüft und es sieht nicht so aus, als ob es eine Einstellung dafür gibt:

+-----------------------+-----------------------------------+------+-----+---------+-------+
| 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)

Abhängig davon, ob Sie MySQLi oder PDO verwenden, sollten Ihre PHP MySQL-Verbindungen entweder bei der Anforderung auflegen oder in einem Pool für den Apache-Prozess freigegeben werden.

Wenn Sie zum Beispiel mit PDO dauerhafte Verbindungen deaktivieren möchten (ich denke dies ist die Standardeinstellung), stellen Sie eine Verbindung zu Ihrer Datenbank her mit:

$ pdo = neues PDO ($ dsn, $ user, $ pass, Array (PDO :: ATTR_PERSISTENT => false));

Wenn Sie möchten, dass Ihre Skripte dauerhafte Verbindungen verwenden, aber im Energiesparmodus zu viele Verbindungen zu Ihrer Datenbank geöffnet sind, sollten Sie die Apache-Variablen MaxServers, MaxSpareServers, MinSpareServers und StartServers so konfigurieren, dass nicht so viele herumhängen, wenn sie nicht vorhanden sind erforderlich.

0
Gary Richardson

http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html

Es ist möglich, Verbindungen pro Benutzer mit pt-kill zu beenden. Sie können dies planen oder einen Hintergrundjob einrichten, um dies zu handhaben.

0
ferensick

init_connect wird immer dann ausgeführt, wenn sich ein Benutzer anmeldet, damit wir eine kleine case-Anweisung schreiben und den Wert basierend auf dem Benutzer festlegen können. Bitte beachten Sie, dass init_connect nicht für Superuser ausgeführt wird.

mysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE '[email protected]%' THEN '30' ELSE @@wait_timeout END";

0