

# Solucionar problemas de falta de memória em bancos de dados do Aurora MySQL
<a name="AuroraMySQLOOM"></a>

Quando uma instância de banco de dados do Aurora MySQL fica com pouca memória, o sistema operacional pode encerrar o processo do banco de dados, provocando uma reinicialização não planejada. Para ajudar a evitar essas reinicializações, o Aurora MySQL inclui recursos de gerenciamento de memória que monitoram a memória do sistema e realizam ações automáticas de recuperação quando a memória está baixa. Essas ações ajudam a evitar a indisponibilidade do banco de dados devido a esgotamento de memória.

Os seguintes parâmetros controlam esse comportamento:
+ `aurora_enable_memory_management`: disponível somente no Aurora MySQL SQL 8.4.
  + Quando definido como `ON` (padrão), o Aurora gerencia automaticamente as ações de recuperação de memória e o parâmetro `aurora_oom_response` é ignorado.
  + Defina como `OFF` para controlar manualmente as ações de recuperação por meio de `aurora_oom_response`.
+ `aurora_oom_response`: uma lista separada por vírgulas de ações de recuperação. Uma string vazia desabilita todas as ações. Disponível no Aurora MySQL versão 3. Disponível também no Aurora MySQL 8.4, mas é considerado somente quando `aurora_enable_memory_management` está definido como `OFF`.

## Ações de resposta a OOM
<a name="AuroraMySQLOOM.actions"></a>

As ações a seguir podem ser incluídas em `aurora_oom_response`, listadas das menos às mais agressivas.


| Ação | O que ela faz | Observações | 
| --- | --- | --- | 
| print | Registra em log consultas e conexões que consomem muita memória no log de erros. Nenhuma consulta ou conexão é encerrada. | Disponível no Aurora MySQL versões 3 e 8.4. | 
| tune | Reduz os caches internos de tabela (table\_open\_cache, table\_definition\_cache) para liberar memória. Os tamanhos do cache são restaurados quando a memória volta ao normal. As entradas anteriormente armazenadas em cache não são restauradas; novas entradas são adicionadas somente quando consultas subsequentes as acessam. | Disponível no Aurora MySQL versões 3 e 8.4. Somente instâncias provisionadas. Não há suporte no Sem Servidor v2. | 
| tune\_buffer\_pool | Reduz o grupo de buffers do InnoDB para liberar memória. O tamanho do grupo de buffers é restaurado quando a memória volta ao normal. As páginas anteriormente armazenadas em cache que foram removidas não são recarregadas automaticamente; novas páginas são armazenadas em cache somente quando consultas subsequentes as acessam. | Somente Aurora MySQL versão 3 (3.06 e posterior) e Aurora MySQL 8.4. Compatível com instâncias provisionadas com apenas 2 vCPUs. Não é compatível com o Sem Servidor v2. | 
| decline | Rejeita novas consultas com um erro enquanto a memória está baixa. | Disponível no Aurora MySQL versões 3 e 8.4. | 
| kill\_query | Encerra a execução de consultas SELECT, começando com os maiores consumidores de memória, até que a memória volte ao normal. A DDL, outras DMLs e as transações não são afetadas. | Disponível no Aurora MySQL versões 3 e 8.4. Mutuamente excludente com kill\_connect: se ambos estiverem definidos, somente kill\_connect será ativado. | 
| kill\_connect | Encerra as conexões de usuário, revertendo as respectivas transações ativas e encerrando as instruções DDL. | Veja abaixo o comportamento específico da versão. | 

**Importante**  
É necessário emparelhar `tune_buffer_pool` com `kill_query` ou `kill_connect` no valor do parâmetro `aurora_oom_response`. Sem um deles, o redimensionamento do grupo de buffers não ocorre mesmo quando `tune_buffer_pool` está incluído.

### Comportamento kill\_connect específico da versão
<a name="AuroraMySQLOOM.actions.kill_connect"></a>


| Versão do Aurora MySQL | Comportamento | 
| --- | --- | 
| Aurora MySQL 3.04-Aurora MySQL 3.10 | Encerra as conexões de usuário para liberar memória suficiente e permitir que o banco de dados se recupere da pressão de memória. | 
| Aurora MySQL 3.11 e posterior, Aurora MySQL 8.4 | Encerra as conexões de usuário para liberar memória suficiente e permitir que o banco de dados se recupere da pressão de memória. Também encerra qualquer conexão de usuário que tente alocar memória durante a pressão de memória. | 

No Sem Servidor v2, o Aurora responde à pressão de memória aumentando a escala verticalmente primeiro das ACUs para fornecer memória adicional. Se a pressão de memória persistir enquanto o ajuste de escala estiver em andamento, o Aurora poderá encerrar as conexões existentes para recuperar a memória. O encerramento das conexões que tentam alocar memória ocorre somente quando a instância atinge o limite máximo de ACU configurado e não consegue escalar ainda mais.

## Valores padrão por versão
<a name="AuroraMySQLOOM.defaults"></a>

O Aurora MySQL configura `aurora_oom_response` automaticamente com base na versão do mecanismo, no tipo de instância e na memória disponível.

No Aurora MySQL 8.4, quando `aurora_enable_memory_management` é `ON` (o padrão), o Aurora gerencia automaticamente as ações de recuperação de memória, e o valor `aurora_oom_response` não é usado. Quando definido como `OFF`, o Aurora usa o valor `aurora_oom_response` diretamente, que está vazio por padrão, o que significa que nenhuma ação de recuperação é realizada, a menos que você as configure explicitamente. A tabela de padrões a seguir é aplicável somente ao Aurora MySQL versão 3.

**Limite de instância pequena:** ≤ 2 GiB para as versões 3.04 e 3.05. ≤ 4 GiB para a versão 3.06 e posterior.

**Limite de instância grande:** ≤ 2 GiB para as versões 3.04 e 3.05. > 4 GiB para a versão 3.06 e posterior.


| Versão | Tamanho da instância | Provisionada | Sem Servidor v2 | 
| --- | --- | --- | --- | 
| Aurora MySQL 3.04-Aurora MySQL 3.05 | Pequena | print,tune | print | 
|  | Grande | desabilitado | desabilitado | 
| Aurora MySQL 3.06 | Pequena | print,tune,decline,kill\_connect | print | 
|  | Grande | desabilitado | desabilitado | 
| Aurora MySQL 3.07 | Pequena | print,tune,decline,kill\_connect | print | 
|  | Grande | print | print | 
| Aurora MySQL 3.08 | Pequena | print,tune,tune\_buffer\_pool,decline,kill\_connect | print | 
|  | Grande | print | print | 
| Aurora MySQL 3.09-Aurora MySQL 3.10 | Pequena | print,tune,tune\_buffer\_pool,decline,kill\_connect | print | 
|  | Grande | print,decline,kill\_connect | print,decline,kill\_connect | 
| Aurora MySQL 3.11 e posterior | Pequena | print,tune,tune\_buffer\_pool,decline,kill\_connect | print,decline,kill\_connect | 
|  | Grande | print,decline,kill\_connect | print,decline,kill\_connect | 

## Aurora Serverless v2
<a name="AuroraMySQLOOM.serverless"></a>

Não é possível realizar as ações `tune` e `tune_buffer_pool` no Aurora Sem Servidor v2. Todas as outras ações funcionam da mesma forma que nas instâncias provisionadas.

Os limites de memória se ajustam dinamicamente à medida que a instância escala as respectivas ACUs. A coluna Sem Servidor v2 na tabela de padrões acima mostra os padrões efetivos para cada versão.

## Monitoramento
<a name="AuroraMySQLOOM.monitoring"></a>

É possível monitorar a atividade de precaução de OOM por meio dos métodos a seguir.

### Log de erros
<a name="AuroraMySQLOOM.monitoring.errorlog"></a>

Quando são realizadas ações de recuperação de memória, o Aurora MySQL grava mensagens no log de erros do banco de dados. O prefixo da mensagem varia de acordo com a versão e pode mudar em versões futuras:
+ **Aurora MySQL versão 3:** as mensagens são prefixadas com `OOM crash avoidance:`.
+ **Aurora MySQL versão 8.4:** as mensagens são prefixadas com `Aurora memory management:`.

Essas mensagens incluem:
+ Pressão de memória detectada e recuperada: notificações com memória total e disponível.
+ Detalhes de consultas ou conexões encerradas para recuperação de memória.
+ Consultas candidatas identificadas pela ação `print`.

Para visualizar o log de erros, consulte [Logs de erro do Aurora MySQL](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Errorlog).

### Métricas do Amazon CloudWatch
<a name="AuroraMySQLOOM.monitoring.cloudwatch"></a>

As métricas do CloudWatch a seguir rastreiam a atividade de precaução de OOM em nível de instância.


| Métrica | Descrição | Disponível a partir de | Unidade | 
| --- | --- | --- | --- | 
| AuroraMemoryHealthState | Indica o estado de integridade da memória. 0 significa íntegro (sem pressão de memória), 5 significa pressão de memória moderada e 10 significa pressão grave de memória. | Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4 | Indicador | 
| AuroraMemoryNumDeclinedSqlTotal | O número incremental de consultas recusadas como parte de uma tentativa de evitar OOM. | Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4 | Contagem | 
| AuroraMemoryNumKillConnTotal | O número incremental de conexões fechadas como parte de uma tentativa de evitar o OOM. | Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4 | Contagem | 
| AuroraMemoryNumKillQueryTotal | O número incremental de consultas encerradas como parte de uma tentativa de evitar OOM. | Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4 | Contagem | 
| AuroraMillisecondsSpentInOomRecovery | O tempo decorrido desde que a integridade da memória caiu abaixo do estado normal. | Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4 | Milissegundos | 
| AuroraNumOomRecoverySuccessful | O número de vezes em que a integridade da memória foi restaurada ao estado normal. | Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4 | Contagem | 
| AuroraNumOomRecoveryTriggered | O número de vezes em que a integridade da memória caiu abaixo do estado normal. | Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4 | Contagem | 

As seguintes métricas gerais do CloudWatch também são úteis para monitorar a pressão da memória:


| Métrica | Descrição | Unidade | 
| --- | --- | --- | 
| FreeableMemory | A quantidade de memória disponível. Relata o valor MemAvailable de /proc/meminfo. | Bytes | 
| SwapUsage | A quantidade de espaço de troca usada. | Bytes | 

Para ver a lista completa de métricas em nível de instância do Aurora MySQL, consulte [Métricas no nível da instância do Amazon Aurora](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances).

### Variáveis de status globais
<a name="AuroraMySQLOOM.monitoring.statusvars"></a>

As variáveis de status a seguir fornecem informações sobre o estado OOM (sem memória). Disponível no Aurora MySQL versão 3.06.0 e posterior.


| Variável | Descrição | 
| --- | --- | 
| Aurora\_oom\_response | As ações de resposta a OOM no momento ativas para essa instância de banco de dados. | 
| aurora\_oom\_avoidance\_recovery\_state | Se a recuperação de OOM é ACTIVE ou INACTIVE. | 
| aurora\_oom\_status | Estado atual da integridade da memória do banco de dados: íntegra (sem pressão de memória), pressão de memória moderada ou pressão grave de memória. Disponível somente na versão 3. | 

Para consultar: `SHOW GLOBAL STATUS LIKE 'aurora_oom%';`.

Para ver a lista completa de variáveis de status globais do Aurora MySQL, consulte [Variáveis de status globais do Aurora MySQL](AuroraMySQL.Reference.GlobalStatusVars.md).

### Insights de Performance
<a name="AuroraMySQLOOM.monitoring.pi"></a>

Se o Insights de Performance estiver habilitado, você poderá usar métricas de memória no nível do sistema operacional para monitorar a pressão de memória e detectar eventos de OOM. As seguintes métricas estão disponíveis nos contadores `os.memory` e `os.swap`:


| Métrica | Descrição | 
| --- | --- | 
| os.memory.outOfMemoryKillCount | O número de encerramentos OOM durante o último intervalo de coleta. Um valor diferente de zero indica que o sistema operacional encerrou um processo devido a esgotamento de memória, o que normalmente resulta na reinicialização do banco de dados. | 
| os.memory.total | A quantidade total de memória, em kilobytes. | 
| os.memory.free | A quantidade de memória não atribuída, em kilobytes. | 
| os.memory.active | A quantidade de memória atribuída, em kilobytes. | 
| os.memory.cached | A quantidade de memória utilizada para o armazenamento em cache da E/S no sistema de arquivos, em quilobytes. | 
| os.memory.dirty | A quantidade de páginas de memória modificadas, mas ainda não gravadas no armazenamento, em quilobytes. | 
| os.memory.inactive | A quantidade de páginas de memória usadas com menos frequência, em kilobytes. | 
| os.memory.db.residentSetSize | A quantidade de memória usada pelo processo de banco de dados (excluindo a memória compartilhada), em bytes. | 
| os.memory.db.cache | A quantidade de memória usada para cache de página pelo processo do banco de dados, em bytes. | 
| os.memory.db.swap | A quantidade de memória de troca usada pelo processo do banco de dados, em bytes. | 
| os.swap.in | A quantidade de memória transferida do disco, em quilobytes. | 
| os.swap.out | A quantidade de memória transferida para o disco, em quilobytes. | 

É possível monitorar `os.memory.outOfMemoryKillCount` para detectar quando o sistema operacional encerrou o processo do banco de dados devido à falta de memória. Para ver a lista completa de contadores de sistema operacional, consulte [Métricas de sistema operacional do Insights de Performance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS).

### Performance Schema
<a name="AuroraMySQLOOM.monitoring.perfschema"></a>

Se `performance_schema` estiver habilitado, você poderá usar tabelas de resumo de memória para identificar quais componentes e conexões estão consumindo mais memória. Para obter mais informações, consulte [Solução de problemas de uso de memória para bancos de dados Aurora MySQL](ams-workload-memory.md).