MySQL에서 사용자 로그인에 따라 연결 시간 초과를 설정하는 방법

StackOverflow https://stackoverflow.com/questions/243644

  •  04-07-2019
  •  | 
  •  

문제

현재 절전 상태에 있는 연결이 100개가 넘습니다.

일부 연결은 영구 연결이기 때문에 절전 상태를 유지해야 하며 닫지 않아야 하지만 다른 일부 연결(다른 사용자 이름을 사용)은 일부 PHP 스크립트에서 가져온 것이므로 매우 빠르게 시간 초과되기를 원합니다.

사용자별로 wait_timeout을 설정할 수 있습니까?그렇다면 어떻게?

도움이 되었습니까?

해결책

사용자 당 시간 초과 구성은 없지만 wait_timeout 동적으로 가치. 즉, 주어진 사용자로 연결 한 후에는 해당 사용자 세션에 대한 타임 아웃 값을 원하는 것으로 변경하기 위해 명령문을 발행 할 수 있습니다.

MySQL 명령 줄 클라이언트에서 다음 실험을 시도하십시오.

mysql> SHOW VARIABLES LIKE 'wait_timeout';

... 28800 (예 : 8 시간)을 표시합니다. wait_timout.

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

... 쇼 60.

그런 다음 세션을 종료하고 다시 연결하고 다시 기본값을 사용할 수 있습니다. wait_timeout 28800입니다. 따라서 현재 세션의 범위로 제한됩니다.

두 번째 창을 열고 별도의 MySQL 클라이언트 세션을 시작하여 wait_timeout 한 세션에서는 다른 동시 세션에 영향을 미치지 않습니다.

다른 팁

다음 변수를 설정해야합니다 my.conf:

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout 타임 아웃입니다 자동 연결 (내 의견으로는 웹 서버에서 30 명 이상이 너무 많습니다.).
interactive_timeout a 콘솔 상호 작용 시간 초과 유휴 세션의 경우.

또 다른 가능성 : MySQL은 두 가지 다른 시간 초과 변수를 지원합니다. wait_timeout 상호 관계가없는 클라이언트의 경우 interactive_timeout 대화식 고객을 위해.

대화식과 비 중도적 클라이언트의 차이점은 단순히 당신이 지정했는지 여부입니다. CLIENT_INTERACTIVE 연결시 옵션.

당신이 어떻게 든 만들어야하기 때문에 이것이 당신을 돕는 지 모르겠습니다. mysql_real_connect() 그 옵션을 전달하십시오 client_flag 매개 변수. 어떤 언어 나 인터페이스를 사용하고 있는지 잘 모르겠 으므로이 연결 플래그를 지정할 수 있는지 모르겠습니다.

어쨌든 해당 클라이언트 플래그를 전달할 수 있고 두 가지 유형의 사용자 만 필요하면 구성 할 수 있습니다. wait_timeout 그리고 interactive_timeout MySQL 서버 구성에서 다르게, 주어진 세션을 원할 때 값이 짧은 값을 사용하여 즉시 시간을 초과하십시오.

사용하는 경우 커넥터/j, 당신이 사용할 수있는 SessionVariable 클라이언트의 JDBC URL에서 : jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

다른 언어의 다른 커넥터는 아마도 동일하게 허용 할 것입니다.

init_connect는 사용자가 로그인 할 때마다 실행되므로 Small Case 문을 작성하고 사용자를 기반으로 값을 설정할 수 있습니다. init_connect는 슈퍼 사용자를 위해 실행되지 않습니다.

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

나는 그것을 확인했다 mysql.user 테이블과 그것은 거기에 설정이있는 것처럼 보이지 않습니다.

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

MySQLI 또는 PDO를 사용하는지 여부에 따라 PHP MySQL 연결은 요청이있을 때 끊거나 Apache 프로세스를위한 풀에서 공유해야합니다.

예를 들어, PDO를 사용하면 영구 연결을 끄려면 (기본값이라고 생각합니다) : DB에 연결하십시오.

$ pdo = new pdo ($ dsn, $ user, $ pass, array (pdo :: attr_persistent => false));

스크립트가 영구 연결을 사용하려면 잠자는 모드에서 데이터베이스에 너무 많은 연결이 열려 있으려면 Apache의 구성에 대해 생각해야합니다. MaxServers, MaxSpareServers, MinSpareServers 그리고 StartServers 그래서 그들이 필요하지 않을 때 너무 많은 사람들이 매달리지 않습니다.

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

pt-kill을 사용하면 사용자당 연결을 끊을 수 있습니다.이를 예약하거나 이를 처리하기 위해 백그라운드 작업을 설정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top