Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Configuração do MySQL 8


Configurando o MySQL 8

O MySQL tem dois tipos de parâmetros:

Estático, que entra em vigor após reiniciar o servidor MySQL. Dinâmico, que pode ser alterado online sem reiniciar o servidor MySQL, funciona na versão 5.7 e posterior.

As variáveis ​​podem ser definidas através do seguinte:
  • Arquivo de configuração
  • Script de inicialização
  • Usando o comando SET
  • Parâmetros de configuração persistentes

Usando o arquivo de configuração:


O arquivo de configuração pode ser encontrado em  /etc/my.cnf (RHL e CENTOS) e /etc/mysql/my.cnf(Debian), você pode editar este arquivo no editor de sua escolha.

O arquivo de configuração possui as seções abaixo, o parâmetro relacionado deve ser mantido sob elas.
  • [mysql]:a seção é lida pelo cliente de linha de comando mysql
  • [client]:a seção é lida por todos os clientes conectados (incluindo mysql cli)
  • [mysqld]:A seção é lida pelo mysqlserver
  • [mysqldump]:A seção é lida pelo utilitário de backup chamado mysqldump
  • [mysqld_safe]:lido pelo mysqld_safeprocess (Script de inicialização do MySQL Server)
[[email protected] ~]# mysql -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           1 |

altere o parâmetro server-id para 2 e reinicie o servidor mysql
#vim /etc/my.cnf
server-id=2 (edit this parameter in config file)

#sudo systemctl restart mysqld

[[email protected] ~]# mysql -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           2|

Usando parâmetros com o script de inicialização:


Suponha que você deseja iniciar o MySQL usando um script de inicialização e não através do systemd,

especialmente para testes ou para alguma mudança temporária. Você pode passar as variáveis ​​para o script

em vez de alterá-lo no arquivo de configuração
# /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/centos7.err --pidfile=/usr/local/mysql/data/centos7.pid --init-file=/tmp/mysql-init &

Você pode ver que o parâmetro –init-file é passado para o servidor. O servidor executa as instruções SQL nesse arquivo antes de iniciar

Usando variáveis ​​globais e de sessão:


Existem dois tipos de variáveis ​​com base no escopo da variável:

Global:Aplica-se a todas as novas conexões

Sessão:Aplica-se apenas à conexão atual (sessão)

Vou usar sort_buffer_size para este exemplo porque ele tem escopo global e de nível de sessão, então isso explicará muito bem o escopo.
mysql> SET GLOBAL sort_buffer_size = 512 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@sort_buffer_size;
+--------------------+
| @@sort_buffer_size |
+--------------------+
|             262144 |
+--------------------+
1 row in set (0.00 sec)

Não mudou porque o tamanho do sort_buffer tem escopo global e de nível de sessão e o global é apenas um padrão para novas sessões. Estávamos usando a mesma conexão de cliente o tempo todo, então com o mesmo global alteramos o padrão para novas sessões, mas nossa sessão não é nova, nossa sessão começou antes da alteração do padrão. Assim, podemos usar o Select @@global.sort_buffer_size para consultar o valor global
mysql> SELECT @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
|                    524288 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@global.sort_buffer_size, @@session.sort_buffer_size;
+---------------------------+----------------------------+
| @@global.sort_buffer_size | @@session.sort_buffer_size |
+---------------------------+----------------------------+
|                    524288 |                     262144 |
+---------------------------+----------------------------+
1 row in set (0.00 sec)

Parâmetros de configuração persistentes:


verifique o sort_buffer_size do esquema de desempenho, as variáveis ​​de sessão e a tabela de variáveis ​​globais.
mysql> SELECT * FROM performance_schema.session_variables WHERE variable_name LIKE 'sort_buffer_size';
+------------------+----------------+
| VARIABLE_NAME    | VARIABLE_VALUE |
+------------------+----------------+
| sort_buffer_size | 262144         |
+------------------+----------------+
1 row in set (0.01 sec)

mysql> SELECT * FROM performance_schema.global_variables WHERE variable_name LIKE 'sort_buffer_size';
+------------------+----------------+
| VARIABLE_NAME    | VARIABLE_VALUE |
+------------------+----------------+
| sort_buffer_size | 262144         |
+------------------+----------------+
1 row in set (0.01 sec)

Ambos são iguais, pois ainda não o alteramos. Vamos verificar se esse valor está vindo.
mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME | SET_USER | SET_HOST |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| sort_buffer_size | GLOBAL          | /etc/my.cnf   | 32768     | 18446744073709551615 | NULL     | NULL     | NULL     |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
1 row in set (0.01 sec)

Assim, podemos ver que a variável está vindo do /etc/my.cnf e o valor VARIABLE_SOURCE é GLOBAL, pois isso não foi alterado ainda que a sessão escolheu o valor global na conexão.

Vamos alterar o Global sor_buffer_size e ver qual será o resultado.
mysql> SET GLOBAL sort_buffer_size = 512 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME                   | SET_USER | SET_HOST  |
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
| sort_buffer_size | DYNAMIC         |               | 32768     | 18446744073709551615 | 2020-08-09 11:04:01.681846 | root     | localhost |
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Agora, como podemos ver que a fonte é dinâmica, SET_TIME foi alterado e foi o usuário root que fez as alterações.

Vamos verificar uma variável que não está em my.cnf como wait timeout.
mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
| wait_timeout  | COMPILED        |               | 1         | 31536000  | NULL     | NULL     | NULL     |
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
1 row in set (0.00 sec)

Você pode ver que a variável source, neste caso, é COMPILED o que significa que estamos usando o valor padrão do servidor. Vamos mudá-lo para outra coisa.
mysql> SET GLOBAL wait_timeout=100;
Query OK, 0 rows affected (0.00 sec)

Agora se verificarmos novamente a fonte será dinâmica, lá vamos nós.
mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME                   | SET_USER | SET_HOST  |
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
| wait_timeout  | DYNAMIC         |               | 1         | 31536000  | 2020-08-09 11:08:57.537268 | root     | localhost |
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Vamos tornar isso persistente com o comando PERSIST. OBSERVAÇÃO não adicionamos essas alterações no arquivo my.cnf
mysql> SET PERSIST wait_timeout=100;
Query OK, 0 rows affected (0.00 sec)

Saia do cliente MySQL e verifique se a configuração está realmente em mysqld-auto.cnf.
[[email protected] ~]# sudo cat /var/lib/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "mandatory_roles" : { "Value" : "dbt3_read23" , "Metadata" : { "Timestamp" : 1592984803211900 , "User" : "root" , "Host" : "localhost" } } , "wait_timeout" : { "Value" : "100" , "Metadata" : { "Timestamp" : 1596960656007284 , "User" : "root" , "Host" : "localhost" } } } }

Reinicie o servidor mysql e verifique se o caminho do valor da variável wait_timeout está vindo, ele virá de /var/lib/mysql/mysqld-auto.cnf como mostrado abaixo.
mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH                  | MIN_VALUE | MAX_VALUE | SET_TIME                   | SET_USER | SET_HOST  |
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
| wait_timeout  | PERSISTED       | /var/lib/mysql/mysqld-auto.cnf | 1         | 31536000  | 2020-08-09 11:10:56.007284 | root     | localhost |
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Se você verificar o valor de ‘sort_buffer_size’, ainda é o mesmo que não alteramos seu valor, ainda vindo do mesmo caminho e a origem é GLOBAL.
mysql>  SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME | SET_USER | SET_HOST |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| sort_buffer_size | GLOBAL          | /etc/my.cnf   | 32768     | 18446744073709551615 | NULL     | NULL     | NULL     |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
1 row in set (0.00 sec)