O log de consultas gerais registra cada instrução SQL executada na sua instância do ApsaraDB RDS for MySQL — selecione, INSERT, atualize e exclua — e pode crescer rapidamente. Se permanecer ativado sem limpeza periódica, ele esgota o armazenamento, degrada o desempenho e aumenta o tempo de recuperação.
Por que o RDS armazena os logs de consultas gerais em uma tabela?
Por padrão, o ApsaraDB RDS for MySQL armazena os logs de consultas gerais em uma tabela de banco de dados em vez de um arquivo, por dois motivos:
Os usuários não têm acesso direto aos arquivos de uma instância RDS; portanto, você não pode consultar nem baixar logs baseados em arquivos.
O parâmetro
log_outputcontrola o formato de saída tanto para os logs de consultas gerais quanto para os logs de consultas lentas. Como o RDS rotaciona os logs de consultas lentas e exige que eles sejam armazenados em tabelas, os logs de consultas gerais também precisam ser armazenados em tabelas.
Por que o log de consultas gerais esgota o armazenamento?
Cada instrução SQL executada na instância gera uma entrada de log. Quando o log de consultas gerais permanece ativado por um longo período ou a instância processa um alto volume de consultas, a tabela mysql.general_log cresce continuamente. Se você não limpar a tabela periodicamente, ela ocupará todo o armazenamento da instância.
É necessário que você confirme se o log de consultas gerais está causando o problema de armazenamento:
Verifique o uso de armazenamento na página de monitoramento da instância. Se o
sys_data_sizeestiver anormalmente alto, os dados da tabela estão consumindo o armazenamento. Para mais detalhes, consulte Visualize as informações de monitoramento.Visualize os parâmetros da instância. Se o
general_logestiver definido comoON, o recurso está ativo.
Por que o log de consultas gerais causa problemas de desempenho?
Quando o log de consultas gerais está ativado, cada thread que executa uma instrução SQL precisa gravar uma linha na tabela mysql.general_log. Essa operação de gravação exige bloqueios de metadados (MDLs) e bloqueios de tabela; portanto, os threads gravam na tabela de forma sequencial, e não paralela.
Em cenários com alto volume de conexões, vários threads competem por esses bloqueios simultaneamente e deixam as conexões no estado Waiting for table level lock. À medida que o número de conexões cresce, a utilização da CPU também aumenta.
Para confirmar: execute SHOW PROCESSLIST ou consulte a tabela innodb_trx e confirme se muitas conexões exibem Waiting for table level lock, indicando que o log de consultas gerais está contribuindo para a contenção de bloqueios.
Por que o log de consultas gerais aumenta o tempo de recuperação?
Se uma instância RDS for desligada de forma inesperada, o sistema define o marcador de falha do log de consultas gerais como true. Na reinicialização, a instância inicia um processo de recuperação automática. Se o tamanho das tabelas na instância RDS for grande, a restauração levará muito tempo, durante o qual a instância permanecerá indisponível. Isso aumenta diretamente o objetivo de tempo de recuperação (RTO).
Solução
Para interromper a gravação de novas entradas de log, defina
general_logcomoOFF. Para fazer isso, consulte Modifique os parâmetros da instância.Conecte-se à instância usando uma conta privilegiada. Para obter instruções, consulte Conecte-se a uma instância do ApsaraDB RDS for MySQL.
-
Limpe a tabela de log:
A instrução
TRUNCATEnão é compatível com instâncias que executam o MySQL 5.6. Para essas instâncias, contate o suporte técnico para limpar o log. Para a lista completa de suporte a recursos por versão, consulte Recursos .TRUNCATE TABLE mysql.general_log;
Após limpar o log, acesse a página de monitoramento da instância e confirme que o uso de armazenamento diminuiu.
Alternativas para análise de SQL
Mantenha o log de consultas gerais desativado durante as operações normais e ative-o apenas para sessões curtas de depuração e, em seguida, desative-o e limpe a tabela imediatamente após o uso.
Para análises contínuas de SQL, use uma das seguintes abordagens:
SQL Explorer and Audit (recomendado): ative este recurso para gravar e analisar instruções SQL automaticamente. Os dados são armazenados no Database Autonomy Service (DAS) e não consomem o armazenamento da sua instância RDS; portanto, não impactam o desempenho da instância. Para mais detalhes, consulte Use o recurso SQL Explorer and Audit.
-
Log de consultas gerais temporário: Se precisar depurar um problema específico, ative o log de consultas gerais e consulte a tabela de log para inspecionar a atividade SQL:
SELECT * FROM mysql.general_log;Desative o recurso e limpe a tabela assim que a depuração for concluída.
O que fazer se o armazenamento já estiver esgotado
Se a instância ficar sem armazenamento antes de você limpar o log, expanda a capacidade de armazenamento:
Expansão manual: Altere as especificações da instância para aumentar o armazenamento. Consulte Altere as especificações da instância.
Expansão automática: Configure a expansão automática de armazenamento para que o sistema expanda a capacidade quando o uso atingir o limiar especificado. Para configurar isso, consulte Configure a expansão automática de armazenamento.