Problemas conhecidos e limitações do Amazon RDS para MySQL - Amazon Relational Database Service

Problemas conhecidos e limitações do Amazon RDS para MySQL

Veja a seguir os problemas e as limitações conhecidos no trabalho com o Amazon RDS para MySQL.

Palavra reservada InnoDB

InnoDB é uma palavra reservada para o RDS para MySQL. Você não pode usar esse nome para um banco de dados MySQL.

Comportamento de armazenamento cheio para Amazon RDS para MySQL

Quando o armazenamento fica cheio em uma instância de banco de dados MySQL, pode haver inconsistências de metadados, incompatibilidade de dicionários e tabelas órfãs. Para evitar esses problemas, o Amazon RDS interrompe automaticamente uma instância de banco de dados que atinja o estado storage-full.

Uma instância de banco de dados MySQL atinge o estado storage-full nos seguintes casos:

  • A instância de banco de dados tem menos de 20.000 MiB de armazenamento e o armazenamento disponível atinge 200 MiB ou menos.

  • A instância de banco de dados tem mais de 102.400 MiB de armazenamento e o armazenamento disponível só chega a 1024 MiB ou menos.

  • A instância de banco de dados tem entre 20.000 MiB e 102.400 MiB de armazenamento e está com menos de 1% de armazenamento disponível.

Depois que o Amazon RDS interromper uma instância de banco de dados automaticamente porque ela atingiu o estado storage-full, você ainda poderá modificá-la. Para reiniciar a instância de banco de dados, conclua pelo menos um dos seguintes procedimentos:

Depois de fazer uma dessas alterações, a instância de banco de dados será reiniciada automaticamente. Para mais informações sobre a modificação de uma instância de banco de dados , consulte Modificar uma instância de banco de dados do Amazon RDS.

Tamanho do grupo de buffers do InnoDB inconsistente

Para o MySQL 5.7, existe atualmente um bug na forma como o tamanho do grupo de buffers do InnoDB é gerenciado. O MySQL 5.7 pode ajustar o parâmetro innodb_buffer_pool_size para um valor muito grande, que pode fazer com que o grupo de buffers do InnoDB cresça demais e consuma muita memória. Esse efeito pode fazer com que o mecanismo de banco de dados MySQL pare de funcionar ou pode impedir que ele seja iniciado. Esse problema é mais comum para classes de instâncias de banco de dados que têm menos memória disponível.

Para resolver esse problema, defina o valor do parâmetro innodb_buffer_pool_size como um múltiplo do produto do valor do parâmetro innodb_buffer_pool_instances e do valor do parâmetro innodb_buffer_pool_chunk_size. Por exemplo, você pode configurar o valor do parâmetro innodb_buffer_pool_size como um múltiplo de oito vezes o produto dos valores dos parâmetros innodb_buffer_pool_instances e innodb_buffer_pool_chunk_size, conforme mostrado no exemplo a seguir.

innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184

Para obter detalhes sobre esse bug do MySQL 5.7, acesse https://bugs.mysql.com/bug.php?id=79379 na documentação do MySQL.

A otimização de mesclagem de índice retorna resultados errados

As consultas que utilizam a otimização de mesclagem de índice podem retornar resultados incorretos devido a um bug no otimizador de consulta MySQL que foi introduzido no MySQL 5.5.37. Ao emitir uma consulta em uma tabela com vários índices, o otimizador verifica intervalos de linhas com base em vários índices, mas não mescla os resultados corretamente. Para ter mais informações sobre o bug do otimizador de consulta, acesse http://bugs.mysql.com/bug.php?id=72745 e http://bugs.mysql.com/bug.php?id=68194 no banco de dados de bugs do MySQL.

Por exemplo, considere uma consulta em uma tabela com dois índices em que os argumentos de pesquisa fazem referência às colunas indexadas.

SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

Nesse caso, o mecanismo de pesquisa pesquisará ambos os índices. No entanto, devido ao erro, os resultados mesclados estão incorretos.

Para resolver esse problema, você pode realizar um dos seguintes procedimentos:

  • Defina o parâmetro optimizer_switch como index_merge=off no grupo de parâmetros de banco de dados para a sua instância de banco de dados MySQL. Para obter informações sobre como definir os parâmetros do grupo de parâmetros de banco de dados, consulte Grupos de parâmetros para Amazon RDS.

  • Atualize a instância de banco de dados do MySQL para o MySQL versão 5.7 ou 8.0. Para ter mais informações, consulte Atualizações do mecanismo de banco de dados do RDS para MySQL.

  • Se você não puder atualizar sua instância ou alterar o parâmetro optimizer_switch, poderá contornar o bug identificando explicitamente um índice para a consulta, por exemplo:

    SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

Para ter mais informações, consulte Index merge optimization (Otimizar a mesclagem de índice) na documentação do MySQL.

Exceções de parâmetros do MySQL para instâncias de bancos de dados do Amazon RDS

Alguns parâmetros do MySQL requerem considerações especiais quando usados com uma instância de banco de dados do Amazon RDS.

lower_case_table_names

Como o Amazon RDS usa um sistema de arquivos que diferencia maiúsculas de minúsculas, não há suporte para definir o valor do parâmetro de servidor lower_case_table_names como 2 (nomes armazenados conforme especificados, mas comparados em minúsculas). Veja a seguir os valores compatíveis com as instâncias de banco de dados do Amazon RDS para MySQL:

  • 0 (nomes armazenados como dados e as comparações diferenciam maiúsculas de minúsculas) é compatível com todas as versões do RDS para MySQL.

  • 1 (nomes armazenados em letras minúsculas e comparações não diferenciam maiúsculas de minúsculas) é compatível com o RDS para MySQL versão 5.7, versão 8.0.28 e versões 8.0 posteriores.

Defina o parâmetro lower_case_table_names em um grupo de parâmetros de banco de dados personalizado antes de criar uma instância de banco de dados. Em seguida, especifique o grupo de parâmetros de banco de dados personalizado ao criar a instância de banco de dados.

Quando um grupo de parâmetros é associado a uma instância de banco de dados MySQL com uma versão inferior a 8.0, recomendamos que você evite alterar o parâmetro lower_case_table_names no grupo de parâmetros. Alterá-lo pode causar inconsistências com backups de recuperação para um ponto no tempo e instâncias de bancos de dados de réplica de leitura.

Quando um grupo de parâmetros é associado a uma instância de banco de dados MySQL versão 8.0, não é possível modificar o parâmetro lower_case_table_names no grupo de parâmetros.

Réplicas de leitura sempre devem usar o mesmo valor de parâmetro lower_case_table_names que a instância de banco de dados de origem.

long_query_time

Você pode definir o parâmetro long_query_time como um valor de ponto flutuante para conseguir registrar consultas lentas no log de consultas lentas do MySQL com resolução de microssegundos. Você pode definir um valor como 0,1 segundos, que seria de 100 milissegundos, para ajudar ao depurar transações lentas que demoram menos de um segundo.

Limites de tamanho de arquivo do MySQL no Amazon RDS

Para instâncias de bancos de dados MySQL, o limite de armazenamento máximo provisionado restringe o tamanho de uma tabela a um máximo de 16 TB ao usar espaços de tabela de arquivo por tabela do InnoDB. Esse limite também restringe o espaço de tabela do sistema a um tamanho máximo de 16 TB. Os espaços de tabelas de arquivo por tabela do InnoDB (com cada tabela em seu próprio espaço de tabela) são definidos por padrão para instâncias de bancos de dados MySQL.

nota

Algumas instâncias de Banco de Dados existentes têm um limite menor. Por exemplo, as instâncias de banco de dados MySQL criadas antes de abril de 2014 têm um limite de tamanho de arquivo e de tabela de 2 TB. Esse limite de tamanho de arquivo de 2 TB também se aplica a instâncias de banco de dados ou a réplicas de leitura criadas de snapshots de banco de dados tirados antes de abril de 2014, independentemente de quando a instância de banco de dados foi criada.

Existem vantagens e desvantagens na utilização de espaços de tabela de arquivo por tabela do InnoDB, dependendo do seu aplicativo. Para determinar a melhor abordagem para a aplicação, consulte File-per-table tablespaces na documentação do MySQL.

Não recomendamos permitir que as tabelas cresçam até o tamanho máximo do arquivo. Em geral, uma prática recomendada é particionar dados em tabelas menores, o que pode melhorar a performance e os tempos de recuperação.

Uma opção que você pode usar para dividir uma tabela grande em tabelas menores é o particionamento. O particionamento distribui partes da sua tabela grande em arquivos separados com base em regras que você especifica. Por exemplo, se você armazenar transações por data, poderá criar regras de particionamento que distribuem transações antigas em arquivos separados usando o particionamento. Em seguida, periodicamente, você pode arquivar os dados históricos de transações que não precisam estar prontamente disponíveis para o seu aplicativo. Para ter mais informações, consulte Partitioning na documentação do MySQL.

Como não há uma única tabela ou visualização do sistema que indique o tamanho de todas as tabelas e do espaço de tabela do sistema InnoDB, consulte várias tabelas para definir o tamanho dos espaços de tabela.

Como determinar o tamanho do espaço de tabela do sistema InnoDB e do espaço de tabela do dicionário de dados
  • Use o seguinte comando SQL para determinar se alguns dos seus espaços de tabela são muito grandes e são candidatos para particionamento.

    nota

    O espaço de tabela do dicionário de dados é específico para o MySQL 8.0.

    select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE) /1024/1024/1024), 2) as "File Size (GB)" from information_schema.FILES where tablespace_name in ('mysql','innodb_system');
Como determinar o tamanho das tabelas de usuários do InnoDB fora do espaço de tabela do sistema InnoDB (para versões do MySQL 5.7)
  • Use o seguinte comando SQL para determinar se algumas das suas tabelas são muito grandes e são candidatas para particionamento.

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
Como determinar o tamanho das tabelas de usuários do InnoDB fora do espaço de tabela do sistema InnoDB (para versões do MySQL 8.0)
  • Use o seguinte comando SQL para determinar se algumas das suas tabelas são muito grandes e são candidatas para particionamento.

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_TABLESPACES ORDER BY 3 DESC;
Como determinar o tamanho das tabelas de usuários que não são do InnoDB
  • Use o seguinte comando SQL para determinar se algumas das suas tabelas de usuários que não são do InnoDB são muito grandes.

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH+DATA_FREE) / 1024 / 1024/ 1024), 2) As "Approximate size (GB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') and ENGINE<>'InnoDB';
Para habilitar espaços de tabela de arquivo por tabela do InnoDB
  • Defina o parâmetro innodb_file_per_table como 1 no grupo de parâmetros da instância de banco de dados.

Para desabilitar espaços de tabela de arquivo por tabela do InnoDB
  • Defina o parâmetro innodb_file_per_table como 0 no grupo de parâmetros da instância de banco de dados.

Para obter informações sobre como atualizar um grupo de parâmetros, consulte Grupos de parâmetros para Amazon RDS.

Quando tiver habilitado ou desabilitado espaços de tabelas de arquivo por tabela do InnoDB, você poderá emitir um comando ALTER TABLE para mover uma tabela do espaço de tabela global para seu próprio espaço de tabela, ou do seu próprio espaço de tabela para o espaço de tabela global, conforme mostrado no exemplo a seguir:

ALTER TABLE table_name TABLESPACE=innodb_file_per_table;

Não há suporte ao plugin Keyring do MySQL

No momento, o Amazon RDS para MySQL não oferece suporte ao plug-in Keyring keyring_aws da Amazon Web Services do MySQL.

Portas personalizadas

O Amazon RDS bloqueia conexões com a porta personalizada 33060 para o mecanismo MySQL. Escolha uma porta diferente para o seu mecanismo MySQL.

Limitações de procedimentos armazenados do MySQL

Os procedimentos armazenados mysql.rds_killmysql.rds_kill_query não podem encerrar sessões ou consultas pertencentes a usuários do MySQL que tenham nomes de usuário com mais de 16 caracteres nas seguintes versões do RDS para MySQL:

  • Versão 8.0.32 e versões 8 anteriores

  • Versão 5.7.41 e versões 5.7 anteriores

Replicação baseada em GTID com uma instância de origem externa

O Amazon RDS comporta a replicação baseada em identificadores de transação global (GTIDs) de uma instância externa do MySQL externa em uma instância de banco de dados do Amazon RDS para MySQL que exija a definição de GTID_PURGED durante a configuração. No entanto, somente o RDS para MySQL 8.0.37 e versões posteriores comportam essa funcionalidade.

Plug-in de autenticação padrão do MySQL

O RDS para MySQL versão 8.0.34 e posterior usam o plug-in mysql_native_password. Você não pode alterar a configuração default_authentication_plugin.

Substituir innodb_buffer_pool_size

Com classes de instância de banco de dados micro ou small, o valor padrão do parâmetro innodb_buffer_pool_size pode ser diferente do valor exibido ao executar o seguinte comando:

mysql> SELECT @@innodb_buffer_pool_size;

Essa diferença pode ocorrer quando o Amazon RDS precisa substituir o valor padrão como parte do gerenciamento das classes de instância de banco de dados. Se necessário, você poderá substituir o valor padrão e defini-lo como um valor compatível com a classe de instância de banco de dados. Para determinar um valor válido, adicione o uso da memória e a memória total disponível na instância de banco de dados. Para ter mais informações, consulte Tipos de instâncias do Amazon RDS.

Se a instância de banco de dados tiver apenas 4 GB de memória, você não poderá definir innodb_buffer_pool_size como 8 GB, mas poderá defini-lo como 3 GB, dependendo da quantidade de memória alocada a outros parâmetros.

Se o valor inserido for muito grande, o Amazon RDS o reduzirá para os seguintes limites:

  • Classes de instância de banco de dados micro: 256 MB

  • Classes de instância de banco de dados db.t4g.micro: 128 MB