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)