Problemas conhecidos com o upgrade no local da versão principal para o MySQL 8.0

Nesta página, descrevemos problemas conhecidos e incompatibilidades que podem ocorrer ao fazer um upgrade de versão principal do Cloud SQL para MySQL 5.7 para o Cloud SQL para MySQL 8.0.

Para mais informações sobre o upgrade da versão principal, consulte Fazer upgrade da versão principal do banco de dados no local e Ver registros de erros.

Mudanças incompatíveis no SQL

Esta seção lista as incompatibilidades de SQL no Cloud SQL 5.7 e no Cloud SQL 8.0 que podem surgir ao executar o utilitário de pré-verificação e durante o upgrade.

Palavras-chave reservadas

Confira um exemplo de mensagem de erro:

Warning: The following objects have names that conflict with new reserved
keywords. Ensure queries sent by your applications use `quotes` when referring
to them or they will result in errors.

Algumas palavras-chave, como GROUPS, LEAD ou RANK, agora são classificadas como reservadas na versão 8.0 do MySQL. Isso significa que algumas palavras usadas anteriormente como identificadores agora podem ser consideradas ilegais. Para corrigir instruções afetadas, use aspas de identificador ou renomeie o identificador.

Para uma lista completa de palavras-chave, consulte Palavras-chave e palavras reservadas.

Remoção de ASC/DESC com a cláusula GROUP BY

Confira um exemplo de mensagem de erro:

[ERROR] [MY-013235] [Server] Error in parsing Routine db_name.routine_name during
upgrade. You may have an error in your SQL syntax; check the manual that
corresponding to your MySQL server version for the right syntax to use near
'some_text'

Confira outro exemplo de mensagem de erro:

[ERROR] [MY-013235] [Server] Unknown trigger has an error in its body: 'You have
an error in you SQL syntax;
[ERROR] [MY-010198] [Server] Error in parsing Triggers from trigger_name.TRG file.

As consultas que antes dependiam da classificação GROUP BY podem gerar resultados diferentes das versões anteriores do MySQL. Para preservar uma determinada ordem de classificação, forneça uma cláusula ORDER BY.

Se um procedimento armazenado, um acionador ou uma definição de evento contiver uma consulta que use ASC ou DESC com a cláusula GROUP BY, a consulta desse objeto precisará de uma cláusula ORDER BY.

Para mais informações, consulte Remover a sintaxe de GROUP BY ASC e DESC.

Mistura de dados espaciais com outros tipos como chave

Confira um exemplo de mensagem de erro:

[ERROR] [MY-013140] [Server] Incorrect prefix key; the used key part isn't a
string, the used length is longer than the key part, or the storage engine doesn't
support unique prefix keys
[ERROR] [MY-013140] [Server] Too many key parts specified; max 1 parts allowed

No MySQL 8.0 e versões mais recentes, um índice não pode conter uma combinação de tipos de dados espaciais e outros. Remova a chave e crie uma nova compatível com o MySQL versão 8.0 ou mais recente. Para mais informações, consulte Índices espaciais. Para identificar índices de dados espaciais, use uma consulta semelhante a esta:

  SELECT
      s.TABLE_SCHEMA,
      s.TABLE_NAME,
      s.INDEX_NAME,
      s.COLUMN_NAME,
      s.INDEX_TYPE,
      c.DATA_TYPE
  FROM
      information_schema.STATISTICS s
  JOIN
      information_schema.COLUMNS c ON s.TABLE_SCHEMA = c.TABLE_SCHEMA
      AND s.TABLE_NAME = c.TABLE_NAME
      AND s.COLUMN_NAME = c.COLUMN_NAME
  WHERE
      c.DATA_TYPE IN (
          'geometry',
          'point',
          'linestring',
          'polygon',
          'multipoint',
          'multilinestring',
          'multipolygon',
          'geometrycollection'
      )
      AND s.INDEX_TYPE = 'BTREE';

Caracteres UTF8 inválidos

Confira um exemplo de mensagem de erro:

[ERROR] [MY-010765] [Server] Error in Creating DD entry for %s.%s
[ERROR] [MY-013140] [Server] Invalid utf8 character string: invalid_string

Se uma definição de tabela contiver caracteres UTF8 inválidos, a conversão das definições em um dicionário de dados poderá falhar. Para resolver esse problema, substitua os caracteres inválidos pelos correspondentes em UTF8 ou remova-os completamente.

Para identificar e corrigir caracteres inválidos, use uma consulta semelhante a esta:

SHOW CREATE TABLE table_name;

ALTER TABLE table_name MODIFY COLUMN column_name data_type comment='';
// removing invalid utf8 character from comment

Transações XA não confirmadas

Confira um exemplo de mensagem de erro:

[ERROR] [MY-013527] [Server] Upgrade cannot proceed due to an existing prepared XA transactions

Se houver transações XA não confirmadas, o upgrade no local da versão principal vai falhar. Para resolver esse problema, execute uma instrução XA RECOVER antes de concluir o upgrade. Essa instrução verifica transações XA não confirmadas. Se uma resposta for retornada, confirme as transações XA emitindo um XA COMMIT ou reverta as transações XA emitindo uma instrução XA ROLLBACK. Para verificar as transações XA atuais, execute um comando semelhante ao seguinte:

  mysql> XA RECOVER CONVERT xid;
  +----------+--------------+--------------+--------------------------
  | formatID | gtrid_length | bqual_length | data |
  +----------+--------------+--------------+--------------------------
  | 787611   | 9            | 9            | 0x787887111212345678812676152F12345678 |
  +----------+--------------+--------------+--------------------------
  1 row in set (0.00 sec)
  

Neste exemplo, os valores de gtrid e bqual são fornecidos em formato hexadecimal, mas concatenados por engano. Para resolver esse problema, construa manualmente esses valores usando os seguintes campos:

  • gtrid = 0x787887111212345678
  • bqual = 0x812676152F12345678

Para confirmar ou desfazer essas transações XA, crie um xid com essas informações usando um comando semelhante a este:

xid: gtrid [, bqual [, formatID ]]

mysql> XA ROLLBACK|COMMIT 0x787887111212345678,0x812676152F12345678,787611;

Exceder o tamanho máximo da chave

Confira um exemplo de mensagem de erro:

[ERROR] [MY-013140] [Server] Specified key was too long; max key length is [INTEGER] bytes

Esse problema pode ser causado pela configuração sql_mode. Na versão 5.7 do MySQL, a ausência de modos estritos permitia que os índices fossem criados com restrição no prefixo ou no comprimento do índice.

No entanto, na versão 8.0 do MySQL, foram introduzidos modos estritos, como STRICT_ALL_TABLES ou STRICT_TRANS_TABLES, que aplicam regras mais rigorosas ao comprimento do índice, causando esse erro.

Para resolver o problema, atualize o comprimento do prefixo do índice para ficar dentro do número máximo de bytes indicado na mensagem de erro. Com o protocolo padrão UTFMB4, cada caractere pode ocupar até 4 bytes. Isso significa que o número máximo de caracteres pode ser determinado dividindo o número máximo de bytes por 4.

Informações de metadados incompatíveis

Confira um exemplo de mensagem de erro:

[ERROR] [MY-012084] [InnoDB] Num of Indexes in InnoDB doesn't match with Indexes from server
[ERROR] [MY-012069] [InnoDB] table: TABLE_NAME has xx columns but InnoDB dictionary has yy columns

Confira outro exemplo de mensagem de erro:

[ERROR] [MY-010767] [Server] Error in fixing SE data for db_name.table_name

Se você tentar fazer upgrade de tabelas com metadados incompatíveis entre o arquivo frm e o dicionário InnoDB, o upgrade vai falhar. Nesse caso, o arquivo .frm pode estar corrompido. Para resolver o problema, faça um dump e restaure as tabelas afetadas antes de tentar fazer o upgrade.

Para mais informações, consulte Tentativa de fazer upgrade de tabelas com metadados incompatíveis.

Para fazer o dump e restaurar as tabelas afetadas, execute um comando semelhante ao seguinte:

mysqldump --databases database_name --host=$host --user=$user --password=$password > database_dump.sql

mysql> source database_dump.sql;

Nome da chave estrangeira com mais de 64 caracteres

Confira um exemplo de mensagem de erro:

[ERROR] [MY-012054] [InnoDB] Foreign key name:key_name is too long

Esse erro indica que os nomes de restrição de chave externa das tabelas não podem ter mais de 64 caracteres. Para identificar tabelas com nomes de restrição muito longos, use um comando semelhante a este:

SELECT CONSTRAINT_NAME, TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CHAR_LENGTH(CONSTRAINT_NAME) > 64;

Se uma tabela tiver um nome de restrição com mais de 64 caracteres, use o comando ALTER TABLE para renomear a restrição dentro desse limite de caracteres:

ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;

Capitalização de letras incompatível nos nomes das tabelas

Confira um exemplo de mensagem de erro:

[ERROR] [MY-013521] [Server] Table name 'SCHEMA_NAME.TABLE_NAME' containing upper case characters is not allowed with lower_case_table_names = 1.

Se as instâncias na versão 5.7 do MySQL exigirem nomes de tabelas em letras minúsculas (lower_case_table_names=1), todos os nomes de tabelas precisarão ser convertidos para letras minúsculas antes do upgrade para a versão 8.0 do MySQL.

Como alternativa, desative o requisito (lower_case_table_names=0) e faça upgrade da instância. Se você mudar o valor do campo lower_case_table_names de 1 para 0, não será possível mudar o valor de volta na versão 8.0 do MySQL.

Tabelas reconhecidas pelo InnoDB que pertencem a um mecanismo diferente

Confira um exemplo de mensagem de erro:

Error: Following tables are recognized by InnoDB engine while the SQL layer believes they belong to a different engine. Such situation may happen when one removed InnoDB files manually from the disk and creates a table with same name by using different engine.

Se houver tabelas no banco de dados que o mecanismo InnoDB reconhece, mas a camada SQL não, o upgrade vai falhar.

Encontre todas as tabelas no banco de dados que não estão usando o mecanismo de armazenamento InnoDB:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE != 'InnoDB'

Para cada tabela identificada, execute um comando ALTER TABLE para mudar o mecanismo de armazenamento para InnoDB.

ALTER TABLE db_name.table_name ENGINE='INNODB';

Partição de mecanismo de armazenamento desconhecida

Confira um exemplo de mensagem de erro:

[System] [MY-011012] [Server] Starting upgrade of data directory. [ERROR] [MY-013140] [Server] Unknown storage engine 'partition'

A versão 8.0 do MySQL não permite partições no mecanismo que não sejam InnoDB e ndbcluster. Verifique se há tabelas com partições e cujo mecanismo não seja o InnoDB. Para identificar essas tabelas, execute esta consulta:

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

Todas as tabelas informadas pela consulta precisam ser atualizadas para usar o InnoDB ou configuradas para não serem particionadas. Para mudar o mecanismo de armazenamento de uma tabela para InnoDB, execute esta instrução:

ALTER TABLE db_name.table_name ENGINE = INNODB;

Operação de MVU em execução por mais tempo

Há duas tarefas associadas a uma atualização de versão principal:

  • Operação de pré-verificação: retorna um erro de tempo limite se não for concluída em três horas.
  • Operação de upgrade: retorna um erro de tempo limite se não for concluída em seis horas.

Se a instância tiver uma operação MAJOR_VERSION_UPGRADE em andamento por um período maior do que o esperado, investigue os registros de erros do MySQL para verificar se ela está bloqueada em um upgrade de metadados ou travada em alguma etapa de pré-verificação. As causas mais comuns desse problema são:

  • Um número muito grande de tabelas, visualizações ou índices
  • Recursos insuficientes, como CPU ou memória
  • Transações principais bloqueando o encerramento de bancos de dados para que o processo de upgrade comece. Use o console Trusted Cloud by S3NS para verificar os processos atuais.

Há muitos arquivos abertos no sistema

Confira um exemplo de mensagem de erro:

[ERROR] [MY-012592] [InnoDB] Operating system error number 23 in a file operation
[ERROR] [MY-012596] [InnoDB] Error number 23 means 'Too many open files in system'

Se a instância tiver mais de 2 milhões de tabelas, talvez você receba um erro indicando que há "muitos arquivos abertos no sistema". Talvez seja necessário reduzir o número de tabelas para menos de 2 milhões antes de fazer upgrade.

Erro de falta de memória

Ao fazer upgrade do MySQL 5.7 para o 8.0, é necessário ter mais memória para converter metadados antigos no novo dicionário de dados. Para evitar receber um erro de "falta de memória" durante o upgrade da versão principal, o Cloud SQL recomenda ter pelo menos 100 KB de memória para cada tabela.

Para encontrar o número de tabelas, use a seguinte consulta:

SELECT table_schema AS 'Database Name', COUNT(*) AS 'Number of Tables' FROM information_schema.tables

Para resolver o problema, antes de iniciar a atualização, aumente temporariamente a memória mudando o tipo de máquina.

Para instâncias de núcleo compartilhado (por exemplo, núcleos micro ou small, incluindo db-f1-micro, db-g1-small, HA db-f1-micro, HA db-g1-small), faça upgrade para uma instância de núcleo dedicado durante a operação de upgrade para evitar possíveis problemas relacionados a recursos. É possível fazer downgrade depois que a operação de upgrade for concluída.

Erro de encerramento do MySQL

Confira um exemplo de mensagem de erro:

[ERROR] [MY-012526] [InnoDB] Upgrade after a crash is not supported.

O Cloud SQL faz um desligamento limpo antes do upgrade da versão principal. As instâncias com cargas de trabalho pesadas ou transações de longa duração podem passar por um processo de desligamento prolongado, o que pode causar um tempo limite e a falha da atualização. Para garantir que o upgrade seja bem-sucedido, planeje-o durante um período de baixo tráfego sem transações de longa duração.

A seguir