Como configurar um tempo limite de conexão, dependendo do login do usuário no MySQL

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

  •  04-07-2019
  •  | 
  •  

Pergunta

Eu tenho atualmente mais de 100 conexões no estado de suspensão.

Alguns conexão deve ficar em estado de suspensão (e não fechar) porque é conexão permanente, mas alguns outros (com um nome de usuário diferente) são de algum script php e eu quero que eles tempo limite muito rápido.

É possível configurar um wait_timeout por usuário? e se sim, como?

Foi útil?

Solução

Não há nenhuma configuração de tempo de espera pelo usuário por, mas você pode definir o valor wait_timeout dinamicamente. Ou seja, depois de fazer uma conexão como um determinado usuário, você pode emitir uma declaração para alterar o valor de tempo limite para o que você quer que seja para a sessão do usuário.

Tente o seguinte experimento no cliente mysql de linha de comando:

mysql> SHOW VARIABLES LIKE 'wait_timeout';

... mostra 28800 (ou seja, 8 horas), que é o wait_timout padrão.

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

... mostra 60.

Então você pode sair da sessão, reconexão, e novamente a wait_timeout padrão é 28800. Portanto, é limitada ao âmbito da sessão atual.

Você também pode abrir uma segunda janela e iniciar uma sessão de cliente mysql separado, para provar que a mudança do wait_timeout em uma sessão não afeta outras sessões simultâneas.

Outras dicas

Você deve definir as seguintes variáveis ??em seu my.conf:

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout é um tempo limite para conexões automatizadas ( na minha opinião mais de 30 em um servidor web é muito ).
interactive_timeout é um consola interação tempo limite para sessão ociosa.

Outra possibilidade:. MySQL suporta duas variáveis ??diferentes de tempo limite, wait_timeout para clientes não-interativas, e interactive_timeout para clientes interativos

A diferença entre clientes interativos e não interativos parece ser simplesmente se você especificou a opção CLIENT_INTERACTIVE ao conectar.

Eu não sei se isso ajuda, porque você precisa de alguma forma fazer passar mysql_real_connect() essa opção em seu parâmetro client_flag. Eu não tenho certeza do que linguagem ou interface que você está usando, então eu não sei se ele permite que você especificar este sinalizador de conexão.

De qualquer forma, se você pode passar essa bandeira cliente, e você só precisa de dois diferentes tipos de usuários, então você pode configurar wait_timeout e interactive_timeout diferente na configuração do servidor MySQL, e então usar aquele com o valor menor quando você quer um determinado sessão para tempo fora prontamente.

Se você usar Connector / J , você pode usar sessionVariables no cliente JDBC URL assim: jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

Outros conectores para outras línguas irá provavelmente permitir o mesmo.

init_connect será executado sempre que um usuário faz login, para que possamos escrever pequeno declaração caso e definir o valor com base no usuário. Por favor, note que o init_connect não será executada para o usuário super.

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

Eu verifiquei tabela de mysql.user e não olhar como há uma configuração lá para isso:

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

Dependendo se você estiver usando MySQLi ou DOP, suas conexões PHP MySQL deve ou desligar quando o pedido faz, ou ser compartilhada em uma piscina para o processo Apache.

Por exemplo, com DOP, para desligar conexões persistentes (Acho que este é o padrão), se conectar ao seu banco de dados com:

$ DOP = new PDO ($ dsn, $ user, $ passagem, Array (PDO :: ATTR_PERSISTENT => false));

Se você quiser que seus scripts para usar conexões persistentes, mas você tem muitas conexões abertas para o seu banco de dados em modo de suspensão, você deve pensar sobre como configurar o MaxServers, MaxSpareServers, MinSpareServers e StartServers do Apache para que não tantos pendurar em torno de quando eles não são necessários.

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

É possível matar conexões por usuário com pt-kill. Você pode programar este ou configurar um trabalho de fundo para lidar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top