O tamanho da lista de histórico do InnoDB aumentou significativamente - Amazon Aurora

O tamanho da lista de histórico do InnoDB aumentou significativamente

A lista de histórico de alterações de linha aumentou significativamente desde data até tamanho em db-instance. Esse aumento afeta a performance de consulta e do desligamento do banco de dados.

Versões compatíveis do mecanismo

Essas informações de insights são compatíveis com todas as versões do Aurora MySQL.

Contexto

O sistema de transações do InnoDB mantém o controle de simultaneidade de várias versões (MVCC). Quando uma linha é modificada, a versão pré-modificação dos dados que estão sendo modificados é armazenada como um registro de anulação em um log de anulação. Cada registro de anulação tem uma referência ao seu registro de redefinição anterior, formando uma lista vinculada.

A lista de histórico do InnoDB é uma lista global dos registros de anulação de transações confirmadas. O MySQL usa a lista de histórico para remover os registros e as páginas de log quando as transações não precisarem mais do histórico. O tamanho da lista de histórico é o número total de registros de anulação que contêm modificações na lista do histórico. Cada log contém uma ou mais modificações. Se a lista de histórico do InnoDB ficar muito grande, indicando um grande número de versões de linhas antigas, as consultas e os desligamentos de bancos de dados ficarão mais lentos.

Causas prováveis desse problema

As causas comuns para uma longa lista de histórico incluem o seguinte:

  • Transações de longa duração, seja de leitura ou gravação

  • Uma carga de gravação pesada

Ações

Recomendamos ações distintas dependendo dos motivos do insight.

Não inicie nenhuma operação que envolve um desligamento de banco de dados até que a lista de histórico do InnoDB diminua

Como uma lista de histórico do InnoDB longa retarda desligamentos de banco de dados, reduza o tamanho da lista antes de iniciar operações que envolvam o desligamento de um banco de dados. Essas operações incluem upgrades da versão primária de bancos de dados.

Identificar e encerrar transações de longa duração

Você pode encontrar transações de longa duração consultando information_schema.innodb_trx.

nota

Certifique-se também de procurar transações de longa duração em réplicas de leitura.

Como identificar e encerrar transações de longa duração
  1. No cliente SQL, execute a seguinte consulta:

    SELECT a.trx_id, a.trx_state, a.trx_started, TIMESTAMPDIFF(SECOND,a.trx_started, now()) as "Seconds Transaction Has Been Open", a.trx_rows_modified, b.USER, b.host, b.db, b.command, b.time, b.state FROM information_schema.innodb_trx a, information_schema.processlist b WHERE a.trx_mysql_thread_id=b.id AND TIMESTAMPDIFF(SECOND,a.trx_started, now()) > 10 ORDER BY trx_started
  2. Encerre cada transação de longa duração com um comando COMMIT ou ROLLBACK.

Identificar os principais hosts e usuários usando o recurso Insights de Performance

Otimize as transações para que grandes quantidades de linhas modificadas sejam imediatamente confirmadas.

Métricas relevantes

As métricas a seguir estão relacionadas a esse insight: