Parâmetros do servidor no Banco de Dados do Azure para MySQL – Servidor Flexível
APLICA-SE A: Banco de Dados do Azure para MySQL – Servidor flexível
Este artigo fornece diretrizes e considerações para configurar parâmetros de servidor no Banco de Dados do Azure para MySQL - servidor flexível.
Observação
Este artigo contém referências ao termo servidor subordinado, um termo que a Microsoft não usa mais. Quando o termo for removido do software, também o removeremos deste artigo.
O que são variáveis de servidor?
O mecanismo MySQL fornece diferentes variáveis/parâmetros de servidor que podem ser usados para configurar e ajustar o comportamento do mecanismo. Alguns parâmetros podem ser definidos dinamicamente durante o runtime, enquanto outros são "estáticos", exigindo uma reinicialização do servidor para serem aplicados.
O servidor flexível do Banco de Dados do Azure para MySQL expõe a capacidade de alterar o valor de vários parâmetros do MySQL Server usando o portal do Azure e a CLI do Azure para corresponder às necessidades da sua carga de trabalho.
Parâmetros de servidor configuráveis
Você pode gerenciar a configuração do servidor flexível do Banco de Dados do Azure para MySQL usando os parâmetros de servidor. Os parâmetros de servidor são configurados com o valor padrão e recomendado quando você cria o servidor. A folha de parâmetros do servidor no portal do Azure mostra os parâmetros de servidor modificáveis e não modificáveis. Os parâmetros do servidor não modificáveis estão esmaecidos.
A lista de parâmetros de servidor com suporte está em constante crescimento. Use a guia de parâmetros do servidor no portal do Azure para ver a lista completa e configurar os valores desses parâmetros.
Veja as seções a seguir para saber mais sobre os limites dos parâmetros de servidor atualizados mais frequentemente. Os limites são determinados pela camada de computação e pelo tamanho (vCores) do servidor.
Observação
- Se você modificar um parâmetro do servidor estático usando o portal, precisará reiniciar o servidor para que as alterações entrem em vigor. Se você usa scripts de automação (com ferramentas como modelos do ARM, Terraform, CLI do Azure etc.), o script deverá ter uma provisão para reiniciar o serviço para que as definições entrem em vigor mesmo se você estiver alterando as configurações como parte da experiência de criação.
- Se você quiser modificar um parâmetro de servidor não modificável para seu ambiente, abra um item UserVoice ou vote se os comentários já existirem, o que pode nos ajudar a priorizar.
lower_case_table_names
Para o MySQL versão 5.7, o valor padrão é 1 no servidor flexível do Banco de Dados do Azure para MySQL. É importante observar que, embora seja possível alterar o valor com suporte para 2, a reversão de 2 para 1 não é permitida. Entre em contato com nossa equipe de suporte para obter ajuda para alterar o valor padrão. No MySQL versão 8.0+, lower_case_table_names só pode ser configurado ao inicializar o servidor. Saiba mais. É proibido alterar a configuração de lower_case_table_names após a inicialização do servidor. Para o MySQL versão 8.0, o valor padrão é 1 no servidor flexível do Banco de Dados do Azure para MySQL. O valor com suporte para o MySQL versão 8.0 é 1 e 2 no servidor flexível do Banco de Dados do Azure para MySQL. Entre em contato com nossa equipe de suporte para obter ajuda para alterar o valor padrão durante a criação do servidor.
innodb_tmpdir
O parâmetro innodb_tmpdir no Servidor Flexível do Banco de Dados do Azure para MySQL é usado para definir o diretório para arquivos de classificação temporários criados durante operações ALTER TABLE online que são recompiladas. O valor padrão de innodb_tmpdir é /mnt/temp
. Esse local corresponde ao SSD de armazenamento temporário, disponível no GiB com cada tamanho da computação do servidor. Esse local é ideal para operações que não exigem uma grande quantidade de espaço.
Se for necessário mais espaço, você poderá definir innodb_tmpdir para /app/work/tmpdir
. Isso utiliza seu armazenamento, a capacidade disponível no Servidor Flexível do Banco de Dados do Azure para MySQL. Isso pode ser útil para operações maiores que exigem mais armazenamento temporário.
É importante observar que utilizar /app/work/tmpdir
resulta em um desempenho mais lento em comparação com o armazenamento temporário padrão (SSD) /mnt/temp
. A escolha deve ser feita com base nos requisitos específicos das operações.
As informações fornecidas para innodb_tmpdir
são aplicáveis aos parâmetros innodb_temp_tablespaces_dir, tmpdir e slave_load_tmpdir em que o valor padrão /mnt/temp
é comum e o diretório alternativo /app/work/tmpdir
está disponível para configurar o armazenamento temporário aumentado, com uma compensação no desempenho com base em requisitos operacionais específicos.
log_bin_trust_function_creators
No servidor flexível do Banco de Dados do Azure para MySQL, os logs binários são sempre habilitados (ou seja, log_bin
está definido como ON). log_bin_trust_function_creators é definido como ON por padrão em servidores flexíveis.
O log binário tem sempre o formato de LINHA e todas as conexões com o servidor SEMPRE usam o log binário baseado em linha. Com o log binário baseado em linha, não existem problemas de segurança e o log binário não pode ser interrompido, o que permite que você defina log_bin_trust_function_creators
como ON com segurança.
Se [log_bin_trust_function_creators
] estiver definido como OFF, caso você utilize gatilhos, receberá um erro semelhante a você não tem o privilégio SUPER e o log binário está habilitado (o ideal é usar a variável log_bin_trust_function_creators
menos segura).
innodb_buffer_pool_size
Consulte a documentação do MySQL para saber mais sobre esse parâmetro. O tamanho da memória física (GB) na tabela abaixo representa a memória de acesso aleatório (RAM) disponível em gigabytes (GB) no servidor flexível do Banco de Dados do Azure para MySQL.
Tipo de preço | vCore(s) | Tamanho de memória física (GiB) | Valor padrão (bytes) | Valor mínimo (bytes) | Valor máximo (bytes) |
---|---|---|---|---|---|
Expansível (B1s) | 1 | 1 | 134217728 | 33554432 | 268435456 |
Expansível (B1ms) | 1 | 2 | 536870912 | 134217728 | 1073741824 |
Com capacidade de intermitência (B2s) | 2 | 4 | 2147483648 | 134217728 | 2147483648 |
Com capacidade de intermitência (B2ms) | 2 | 8 | 4294967296 | 134217728 | 5368709120 |
Com capacidade de intermitência | 4 | 16 | 12884901888 | 134217728 | 12884901888 |
Com capacidade de intermitência | 8 | 32 | 25769803776 | 134217728 | 25769803776 |
Com capacidade de intermitência | 12 | 48 | 51539607552 | 134217728 | 51539607552 |
Com capacidade de intermitência | 16 | 64 | 2147483648 | 134217728 | 2147483648 |
Com capacidade de intermitência | 20 | 80 | 64424509440 | 134217728 | 64424509440 |
Uso Geral | 2 | 8 | 4294967296 | 134217728 | 5368709120 |
Uso Geral | 4 | 16 | 12884901888 | 134217728 | 12884901888 |
Uso Geral | 8 | 32 | 25769803776 | 134217728 | 25769803776 |
Uso Geral | 16 | 64 | 51539607552 | 134217728 | 51539607552 |
Uso Geral | 32 | 128 | 103079215104 | 134217728 | 103079215104 |
Uso Geral | 48 | 192 | 154618822656 | 134217728 | 154618822656 |
Uso Geral | 64 | 256 | 206158430208 | 134217728 | 206158430208 |
Comercialmente Crítico | 2 | 16 | 12884901888 | 134217728 | 12884901888 |
Comercialmente Crítico | 4 | 32 | 25769803776 | 134217728 | 25769803776 |
Comercialmente Crítico | 8 | 64 | 51539607552 | 134217728 | 51539607552 |
Comercialmente Crítico | 16 | 128 | 103079215104 | 134217728 | 103079215104 |
Comercialmente Crítico | 20 | 160 | 128849018880 | 134217728 | 128849018880 |
Comercialmente Crítico | 32 | 256 | 206158430208 | 134217728 | 206158430208 |
Comercialmente Crítico | 48 | 384 | 309237645312 | 134217728 | 309237645312 |
Comercialmente Crítico | 64 | 504 | 405874409472 | 134217728 | 405874409472 |
innodb_file_per_table
O MySQL armazena a tabela InnoDB em espaços de tabela diferentes com base na configuração fornecida durante a criação da tabela. O espaço de tabela do sistema é a área de armazenamento do dicionário de dados InnoDB. Um espaço de tabela de arquivo por tabela contém dados e índices de uma única tabela InnoDB e é armazenado no sistema de arquivos em seu próprio arquivo de dados. Esse comportamento é controlado pelo parâmetro do servidor innodb_file_per_table
. Definir innodb_file_per_table
como OFF
faz com que o InnoDB crie tabelas no espaço de tabela do sistema. Caso contrário, o InnoDB cria tabelas em espaços de tabela de arquivo por tabela.
O servidor flexível do Banco de Dados do Azure para MySQL oferece suporte abrangente, de 8 TB em um único arquivo de dados. Se o banco de dados tiver mais que 8 TB, você deverá criar a tabela no espaço de tabela innodb_file_per_table. Se você tiver um tamanho de tabela único maior que 8 TB, deverá usar a tabela de partição.
innodb_log_file_size
innodb_log_file_size é o tamanho em bytes de cada arquivo de log em um grupo de log. O tamanho combinado dos arquivos de log (innodb_log_file_size * innodb_log_files_in_group) não pode exceder um valor máximo que seja ligeiramente menor que 512 GB). Um tamanho do arquivo de log maior é melhor para o desempenho, mas tem a desvantagem de que o tempo de recuperação após uma falha é alto. Você precisa equilibrar o tempo de recuperação no raro evento de uma recuperação de falha versus maximizar a taxa de transferência durante as operações de pico. Isso também pode resultar em tempos de reinicialização mais longos. Configure innodb_log_size para qualquer um desses valores: 256 MB, 512 MB, 1 GB ou 2 GB para o servidor flexível do Banco de Dados do Azure para MySQL. O parâmetro é estático e requer uma reinicialização.
Observação
Se você alterou o parâmetro innodb_log_file_size do padrão, verifique se o valor de "mostrar status global como 'innodb_buffer_pool_pages_dirty'" permanece em 0 por 30 segundos para evitar atraso na reinicialização.
max_connections
O valor de max_connection
é determinado pelo tamanho da memória do servidor. O tamanho da memória física (GB) na tabela abaixo representa a memória de acesso aleatório (RAM) disponível em gigabytes (GB) no servidor flexível do Banco de Dados do Azure para MySQL.
Tipo de preço | vCore(s) | Tamanho de memória física (GiB) | Valor padrão | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
Expansível (B1s) | 1 | 1 | 85 | 10 | 171 |
Expansível (B1ms) | 1 | 2 | 171 | 10 | 341 |
Com capacidade de intermitência (B2s) | 2 | 4 | 341 | 10 | 683 |
Com capacidade de intermitência (B2ms) | 2 | 4 | 683 | 10 | 1365 |
Com capacidade de intermitência | 4 | 16 | 1365 | 10 | 2731 |
Com capacidade de intermitência | 8 | 32 | 2731 | 10 | 5461 |
Com capacidade de intermitência | 12 | 48 | 4097 | 10 | 8193 |
Com capacidade de intermitência | 16 | 64 | 5461 | 10 | 10923 |
Com capacidade de intermitência | 20 | 80 | 6827 | 10 | 13653 |
Uso Geral | 2 | 8 | 683 | 10 | 1365 |
Uso Geral | 4 | 16 | 1365 | 10 | 2731 |
Uso Geral | 8 | 32 | 2731 | 10 | 5461 |
Uso Geral | 16 | 64 | 5461 | 10 | 10923 |
Uso Geral | 32 | 128 | 10923 | 10 | 21845 |
Uso Geral | 48 | 192 | 16384 | 10 | 32768 |
Uso Geral | 64 | 256 | 21845 | 10 | 43691 |
Comercialmente Crítico | 2 | 16 | 1365 | 10 | 2731 |
Comercialmente Crítico | 4 | 32 | 2731 | 10 | 5461 |
Comercialmente Crítico | 8 | 64 | 5461 | 10 | 10923 |
Comercialmente Crítico | 16 | 128 | 10923 | 10 | 21845 |
Comercialmente Crítico | 20 | 160 | 13653 | 10 | 27306 |
Comercialmente Crítico | 32 | 256 | 21845 | 10 | 43691 |
Comercialmente Crítico | 48 | 384 | 32768 | 10 | 65536 |
Comercialmente Crítico | 64 | 504 | 43008 | 10 | 86016 |
Quando as conexões excederem o limite, você poderá receber o seguinte erro:
ERRO 1040 (08004): Muitas conexões
Importante
Para obter a melhor experiência, recomendamos usar um pool de conexões como o ProxySQL para gerenciar conexões com eficiência.
A criação de novas conexões de cliente com o MySQL leva tempo e, uma vez estabelecidas, essas conexões ocupam recursos do banco de dados, mesmo quando ociosas. A maioria dos aplicativos solicita muitas conexões de curta duração, o que agrega a essa situação. O resultado é um número menor de recursos disponíveis para sua carga de trabalho real, o que leva à redução do desempenho. Um pooler de conexões que diminui as conexões ociosas e reutiliza as conexões existentes ajuda a evitar isso. Para saber mais sobre a configuração do ProxySQL, visite nossa postagem do blog.
Observação
ProxySQL é uma ferramenta de comunidade de software livre. Ela tem suporte da Microsoft com base no melhor esforço. Para obter suporte à produção com diretrizes autoritativas, avalie e entre em contato com o Suporte ao produto ProxySQL.
innodb_strict_mode
Se você receber um erro semelhante a "Tamanho de linha muito grande (> 8126)", desative o parâmetro innodb_strict_mode. O parâmetro de servidor innodb_strict_mode não pode ser modificado globalmente no nível do servidor porque, se o tamanho dos dados da linha exceder 8 K, eles serão truncados sem um erro, o que pode resultar em perda de dados. É recomendável modificar o esquema para se ajustar ao limite do tamanho de página.
Esse parâmetro pode ser definido no nível de sessão por meio de init_connect
. Para definir innodb_strict_mode no nível de sessão, confira Parâmetro de configuração não listado.
Observação
Caso você tenha um servidor de réplica de leitura, a replicação será interrompida se innodb_strict_mode for definido como Desativado no nível de sessão em um servidor de origem. Sugerimos manter o parâmetro definido como ON caso você tenha réplicas de leitura.
time_zone
Após a implantação inicial, uma instância do servidor flexível do Banco de Dados do Azure para MySQL inclui tabelas do sistema para informações de fuso horário, embora essas tabelas não estejam preenchidas. As tabelas de fuso horário podem ser preenchidas, chamando o procedimento armazenado mysql.az_load_timezone
de uma ferramenta como a linha de comando do MySQL ou o Workbench do MySQL. Consulte os artigos Portal do Azure ou CLI do Azure para saber como chamar o procedimento armazenado e definir os fusos horários globais ou no nível da sessão.
binlog_expire_logs_seconds
No servidor flexível do Banco de Dados do Azure para MySQL, esse parâmetro especifica o número de segundos que o serviço aguarda antes de limpar o arquivo de log binário.
O log binário contém “eventos” que descrevem as alterações no banco de dados, como operações de criação de tabelas ou alterações em dados de tabela. Ele também contém eventos para instruções que potencialmente poderiam ter feito alterações. O log binário é usado principalmente para duas finalidades: operações de replicação e de recuperação de dados. Normalmente, os logs binários são limpos assim que o identificador fica livre do serviço, de backup ou do conjunto de réplicas. Se houver várias réplicas, os logs binários aguardam a réplica mais lenta ler as alterações antes de ser limpa. Se você quiser persistir os logs binários para obter mais duração de tempo, poderá configurar o parâmetro binlog_expire_logs_seconds. Se binlog_expire_logs_seconds for definido como 0, que é o valor padrão, ele será limpo assim que o identificador para o log binário for liberado. Se binlog_expire_logs_seconds > 0, ele esperará os segundos configurados antes de limpar. Para o servidor flexível do Banco de Dados do Azure para MySQL, os recursos gerenciados como backup e limpeza de réplica de leitura de arquivos binários são manipulados internamente. Quando você replica os dados para fora do servidor flexível do Banco de Dados do Azure para MySQL, esse parâmetro precisa ser definido no primário para evitar a limpeza dos logs binários antes que a réplica leia as alterações do primário. Se você definir binlog_expire_logs_seconds como um valor mais alto, os logs binários não serão limpos em tempo hábil e poderão levar a um aumento na cobrança de armazenamento.
event_scheduler
No servidor flexível do Banco de Dados do Azure para MySQL, o parâmetro de servidor event_schedule
gerencia a criação, o agendamento e a execução de eventos, ou seja, tarefas executadas de acordo com um agendamento, e elas são executadas por um thread do agendador de eventos especial. Quando o parâmetro event_scheduler
é definido como ON, o thread do agendador de eventos é listado como um processo de daemon na saída de SHOW PROCESSLIST. Você pode criar e agendar eventos usando a seguinte sintaxe SQL:
CREATE EVENT <event name>
ON SCHEDULE EVERY _ MINUTE / HOUR / DAY
STARTS TIMESTAMP / CURRENT_TIMESTAMP
ENDS TIMESTAMP / CURRENT_TIMESTAMP + INTERVAL 1 MINUTE / HOUR / DAY
COMMENT ‘<comment>’
DO
<your statement>;
Observação
Para obter mais informações sobre como criar um evento, confira a documentação do Event Scheduler do MySQL aqui:
Configurando o parâmetro de servidor event_scheduler
O cenário a seguir ilustra uma maneira de usar o parâmetro event_scheduler
no servidor flexível do Banco de Dados do Azure para MySQL. Para demonstrar o cenário, considere o exemplo a seguir, uma tabela simples:
mysql> describe tab1;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| CreatedAt | timestamp | YES | | NULL | |
| CreatedBy | varchar(16) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.23 sec)
Para configurar o parâmetro do servidor event_scheduler
no servidor flexível do Banco de Dados do Azure para MySQL, execute as seguintes etapas:
No portal do Azure, acesse a instância do servidor flexível do Banco de Dados do Azure para MySQL e, em Configurações, selecione Parâmetros do servidor.
Na folha Parâmetros do servidor, procure
event_scheduler
, na lista suspensa VALUE, selecione ON e, em seguida, escolha Salvar.Observação
A alteração de configuração do parâmetro de servidor dinâmico será implantada sem uma reinicialização.
Em seguida, para criar um evento, conecte-se à instância do servidor flexível do Banco de Dados do Azure para MySQL e execute o seguinte comando SQL:
CREATE EVENT test_event_01 ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR COMMENT ‘Inserting record into the table tab1 with current timestamp’ DO INSERT INTO tab1(id,createdAt,createdBy) VALUES('',NOW(),CURRENT_USER());
Para exibir os Detalhes do Agendador de Eventos, execute a seguinte instrução SQL:
SHOW EVENTS;
O seguinte resultado é exibido:
mysql> show events; +-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+ | Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation | +-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+ | db1 | test_event_01 | azureuser@% | SYSTEM | RECURRING | NULL | 1 | MINUTE | 2023-04-05 14:47:04 | 2023-04-05 15:47:04 | ENABLED | 3221153808 | latin1 | latin1_swedish_ci | latin1_swedish_ci | +-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+ 1 row in set (0.23 sec)
Após alguns minutos, consulte as linhas da tabela para começar a exibir as linhas inseridas a cada minuto de acordo com o parâmetro
event_scheduler
configurado:mysql> select * from tab1; +----+---------------------+-------------+ | id | CreatedAt | CreatedBy | +----+---------------------+-------------+ | 1 | 2023-04-05 14:47:04 | azureuser@% | | 2 | 2023-04-05 14:48:04 | azureuser@% | | 3 | 2023-04-05 14:49:04 | azureuser@% | | 4 | 2023-04-05 14:50:04 | azureuser@% | +----+---------------------+-------------+ 4 rows in set (0.23 sec)
Após uma hora, execute uma instrução Select na tabela para exibir o resultado completo dos valores inseridos na tabela a cada minuto durante uma hora, pois o
event_scheduler
é configurado em nosso caso.mysql> select * from tab1; +----+---------------------+-------------+ | id | CreatedAt | CreatedBy | +----+---------------------+-------------+ | 1 | 2023-04-05 14:47:04 | azureuser@% | | 2 | 2023-04-05 14:48:04 | azureuser@% | | 3 | 2023-04-05 14:49:04 | azureuser@% | | 4 | 2023-04-05 14:50:04 | azureuser@% | | 5 | 2023-04-05 14:51:04 | azureuser@% | | 6 | 2023-04-05 14:52:04 | azureuser@% | ..< 50 lines trimmed to compact output >.. | 56 | 2023-04-05 15:42:04 | azureuser@% | | 57 | 2023-04-05 15:43:04 | azureuser@% | | 58 | 2023-04-05 15:44:04 | azureuser@% | | 59 | 2023-04-05 15:45:04 | azureuser@% | | 60 | 2023-04-05 15:46:04 | azureuser@% | | 61 | 2023-04-05 15:47:04 | azureuser@% | +----+---------------------+-------------+ 61 rows in set (0.23 sec)
Outros cenários
Você pode configurar um evento com base nos requisitos de seu cenário específico. A seguir, alguns exemplos semelhantes de agendamento de instruções SQL para execução em intervalos de tempo diferentes.
Executar uma instrução SQL agora e repetir uma vez por dia sem fim
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 DAY
STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
COMMENT 'Comment'
DO
<your statement>;
Executar uma instrução SQL a cada hora sem fim
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Comment'
DO
<your statement>;
Executar uma instrução SQL todos os dias sem fim
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 DAY
STARTS str_to_date( date_format(now(), '%Y%m%d 0200'), '%Y%m%d %H%i' ) + INTERVAL 1 DAY
COMMENT 'Comment'
DO
<your statement>;
Limitações
Para servidores com Alta Disponibilidade configurada, quando ocorre failover, é possível que o parâmetro do servidor event_scheduler
seja definido como 'OFF'. Se isso ocorrer, quando o failover for concluído, configure o parâmetro para definir o valor como 'ON'.
Parâmetros de servidor não modificáveis
A folha de parâmetros do servidor no portal do Azure mostra os parâmetros de servidor modificáveis e não modificáveis. Os parâmetros do servidor não modificáveis estão esmaecidos. Se você quiser configurar um parâmetro de servidor não modificável no nível da sessão, consulte o artigo portal do Azure ou CLI do Azure para definir o parâmetro no nível de conexão usando init_connect
.
Próximas etapas
- Como configurar parâmetros de servidor no Portal do Azure
- Como configurar parâmetros de servidor no CLI do Azure