Esta página descreve problemas conhecidos e incompatibilidades com que se pode deparar durante as operações de pré-verificação quando faz uma atualização da versão principal do Cloud SQL para MySQL 5.7 para o Cloud SQL para MySQL 8.0.
Para mais informações sobre a atualização da versão principal, consulte os artigos Atualize a versão principal da base de dados no local e Veja os registos de erros.
Alterações de SQL incompatíveis
Esta secção lista as incompatibilidades de SQL no Cloud SQL 5.7 e no Cloud SQL 8.0 que pode encontrar ao executar o utilitário de pré-verificação ou durante a atualização, e fornece sugestões sobre como corrigir cada uma delas.
Palavras-chave reservadas
O seguinte erro ocorre quando tenta usar uma palavra-chave reservada:
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.
Este erro ocorre se tentar usar palavras-chave agora classificadas como reservadas na versão 8.0 do MySQL, como as seguintes:
GROUPSLEADRANK
Isto significa que algumas palavras usadas anteriormente como identificadores podem agora ser consideradas ilegais. Para resolver este problema, corrija as declarações afetadas usando as aspas do identificador ou mude o nome do identificador.
Para ver uma lista completa de palavras-chave, consulte o artigo Palavras-chave e palavras reservadas.
Remoção de ASC/DESC com cláusula GROUP BY
Ocorre o seguinte erro quando tenta usar ASC/DESC com a cláusula GROUP BY:
[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'
Segue-se outra mensagem de erro que pode receber neste caso:
[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.
Este erro ocorre se tentar ordenar a sua consulta através de GROUP BY.
As consultas que anteriormente dependiam da ordenação GROUP BY podem produzir resultados diferentes das versões anteriores do MySQL. Para preservar uma determinada ordem de ordenação,
forneça uma cláusula ORDER BY.
Para resolver o problema, use a cláusula ORDER BY. Por exemplo, 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 precisa de uma cláusula ORDER BY.
Para mais informações, consulte o artigo Remova a sintaxe para GROUP BY ASC e DESC.
Mistura de dados espaciais com outros tipos como chave
O seguinte erro ocorre quando usa a chave de prefixo errada:
[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
Este erro ocorre se tentar usar uma combinação de dados espaciais com outros tipos como chave.
Na versão 8.0 e posteriores do MySQL, um índice não pode conter uma combinação de tipos de dados espaciais e outros. Tem de remover a chave e criar uma nova suportada na versão 8.0 ou posterior do MySQL. Para mais informações, consulte o artigo Índices espaciais.
Para resolver este problema, identifique os índices de dados espaciais através de uma consulta semelhante à seguinte:
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';
Carateres UTF8 inválidos
O seguinte erro ocorre quando usa strings de carateres UTF8 inválidas:
[ERROR] [MY-010765] [Server] Error in Creating DD entry for %s.%s [ERROR] [MY-013140] [Server] Invalid utf8 character string: invalid_string
Este erro ocorre se existirem carateres UTF8 inválidos nos comandos. Por exemplo, se uma definição de tabela contiver carateres UTF8 inválidos, a conversão das definições de tabela no dicionário de dados pode falhar.
Para resolver este problema, substitua os carateres inválidos pelos carateres UTF8 correspondentes ou remova-os por completo.
Para identificar e resolver carateres inválidos, pode usar uma consulta semelhante à seguinte:
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 comprometidas
O seguinte erro ocorre quando existem transações XA preparadas:
[ERROR] [MY-013527] [Server] Upgrade cannot proceed due to an existing prepared XA transactions
Este erro ocorre se existirem transações XA não comprometidas, o que faz com que a atualização da versão principal no local falhe.
Para resolver este problema, execute uma declaração XA RECOVER antes de concluir a atualização. Esta declaração verifica a existência de transações XA não comprometidas.
Se for devolvida uma resposta, confirme as transações XA emitindo um comando XA COMMIT ou reverta as transações XA emitindo uma declaração XA ROLLBACK.
Para verificar as transações XA existentes, pode executar 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, podemos ver que os valores de gtrid e bqual são fornecidos no formato hexadecimal, mas estão concatenados de forma incorreta. Para resolver este problema, tem de criar manualmente estes valores através dos seguintes campos:
gtrid = 0x787887111212345678bqual = 0x812676152F12345678
Para confirmar ou reverter estas transações XA, pode criar um xid
a partir destas informações através de um comando semelhante ao seguinte:
xid: gtrid [, bqual [, formatID ]] mysql> XA ROLLBACK|COMMIT 0x787887111212345678,0x812676152F12345678,787611;
Excede o comprimento máximo da chave
O seguinte erro ocorre quando uma chave especificada é demasiado longa:
[ERROR] [MY-013140] [Server] Specified key was too long; max key length is [INTEGER] bytes
Este erro ocorre se o comprimento da chave fornecida exceder o limite permitido.
Este problema pode ser causado pela configuração do sql_mode. Na versão 5.7 do MySQL, a ausência de modos rigorosos significava que os índices podiam ser criados com restrições no prefixo ou no comprimento do índice.
No entanto, na versão 8.0 do MySQL, foram introduzidos modos rigorosos, como STRICT_ALL_TABLES
ou STRICT_TRANS_TABLES, que aplicavam regras mais rigorosas
no comprimento do índice, o que causa este erro.
Para resolver o problema, atualize o comprimento do prefixo do índice para o número máximo de bytes indicado na mensagem de erro. Com o protocolo predefinido UTFMB4, cada caráter pode ocupar até 4 bytes, o que significa que o número máximo de carateres pode ser determinado dividindo o número máximo de bytes por 4.
Informações de metadados não correspondentes
O seguinte erro ocorre quando existem metadados não correspondentes:
[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
Segue-se outra mensagem de erro que pode receber neste caso:
[ERROR] [MY-010767] [Server] Error in fixing SE data for db_name.table_name
Este erro ocorre se tentar atualizar tabelas com metadados incompatíveis.
Por exemplo, se tentar atualizar tabelas com metadados incompatíveis entre o ficheiro FRM e o
dicionário de dados InnoDB, a atualização falha. Neste caso, o ficheiro FRM pode estar danificado. Para resolver este problema, tem de exportar e restaurar as tabelas afetadas antes de tentar fazer a atualização.
Para mais informações, consulte o artigo Tentativa de atualizar tabelas com metadados em conflito.
Para exportar e restaurar as tabelas afetadas, pode executar um comando semelhante ao seguinte:
mysqldump --databases database_name --host=$host --user=$user --password=$password > database_dump.sql mysql> source database_dump.sql;
O nome da chave externa tem mais de 64 carateres
O seguinte erro ocorre quando tenta usar um nome de restrição de chave externa demasiado longo:
[ERROR] [MY-012054] [InnoDB] Foreign key name:key_name is too long
Este erro ocorre se o nome da chave externa tiver mais de 64 carateres.
Para resolver o problema, identifique as tabelas com nomes de restrições demasiado longos usando um comando semelhante ao seguinte:
SELECT CONSTRAINT_NAME, TABLE_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CHAR_LENGTH(CONSTRAINT_NAME) > 64;
Se uma tabela contiver um nome de restrição com mais de 64 carateres, use o comando ALTER TABLE para mudar o nome da restrição dentro deste limite de carateres:
ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;
Diferença entre letras maiúsculas e minúsculas nos nomes das tabelas
O seguinte erro ocorre quando não usa nomes de tabelas precisos:
[ERROR] [MY-013521] [Server] Table name 'SCHEMA_NAME.TABLE_NAME' containing upper case characters is not allowed with lower_case_table_names = 1.
Este erro ocorre se houver maiúsculas e minúsculas diferentes entre os nomes das tabelas.
Para resolver este problema, 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 têm de ser convertidos em letras minúsculas antes de atualizar para a versão 8.0 do MySQL.
Em alternativa, pode desativar o requisito (lower_case_table_names=0)
e, em seguida, atualizar a instância. Lembre-se de que, se alterar o valor do campo lower_case_table_names de 1 para 0, não pode voltar a alterar o valor na versão 8.0 do MySQL.
Tabelas reconhecidas pelo InnoDB que pertencem a um motor diferente
O seguinte erro ocorre quando uma tabela é reconhecida pelo InnoDB, mas, na verdade, pertence a um motor diferente:
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.
Este erro ocorre se eliminar uma tabela e, em seguida, criar uma nova tabela com o mesmo nome, usando um motor diferente.
Se existirem tabelas na base de dados que o motor InnoDB reconhece, mas a camada SQL não, a atualização falha.
Para resolver este problema, encontre todas as tabelas na base de dados que não estão a usar o motor 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 alterar o respetivo motor de armazenamento para InnoDB.
ALTER TABLE db_name.table_name ENGINE='INNODB';
Motor de armazenamento desconhecido partition
O seguinte erro ocorre quando tenta usar um motor de armazenamento desconhecido:
[System] [MY-011012] [Server] Starting upgrade of data directory. [ERROR] [MY-013140] [Server] Unknown storage engine 'partition'
Este erro ocorre se existirem partições não suportadas no motor.
A versão 8.0 do MySQL só permite as seguintes partições no motor de armazenamento:
InnoDBndbcluster
Para resolver este problema, tem de verificar se existem tabelas com partições e cujo motor não seja InnoDB.
Para identificar estas tabelas, use a seguinte consulta:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
Todas as tabelas comunicadas pela consulta têm de ser atualizadas para usar InnoDB ou configuradas para não serem particionadas. Para alterar um motor de armazenamento de tabelas para InnoDB, execute esta declaração:
ALTER TABLE db_name.table_name ENGINE = INNODB;
Operação de MVU em execução durante um período mais longo
Existem duas tarefas subjacentes associadas a uma atualização da versão principal:
- Operação de pré-verificação: devolve um erro de limite de tempo se não for concluída em três horas.
- Operação de atualização: devolve um erro de limite de tempo se não for concluída no prazo de seis horas.
Se a instância tiver uma operação MAJOR_VERSION_UPGRADE em curso durante um período mais longo do que o esperado, pode investigar os registos de erros do MySQL para verificar se está bloqueada numa atualização de metadados ou bloqueada num passo de pré-verificação. As causas mais comuns deste problema incluem o seguinte:
- Um número muito elevado de tabelas, vistas ou índices
- Recursos insuficientes, como CPU ou memória
- Transações importantes que bloqueiam o encerramento das bases de dados para o início do processo de atualização. Pode usar a Google Cloud consola para verificar os processos atuais.
Demasiados ficheiros abertos no sistema
O seguinte erro ocorre quando existem demasiados ficheiros abertos no sistema:
[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'
Este erro ocorre se, por exemplo, a instância contiver mais de 2 milhões de tabelas. Neste caso, pode receber um erro a indicar que existem "demasiados ficheiros abertos no sistema".
Para resolver este problema, reduza o número de tabelas antes de fazer a atualização.
Erro de falta de memória
O seguinte erro ocorre quando fica sem memória:
Out of memory
Este erro ocorre se não for alocada memória suficiente às tabelas.
Quando atualiza do MySQL 5.7 para o 8.0, é necessária memória adicional para converter os metadados antigos no novo dicionário de dados.
Para resolver este problema, recomendamos que tenha, 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
Antes de iniciar a atualização, pode aumentar temporariamente a memória alterando o tipo de máquina.
Para instâncias principais partilhadas (por exemplo, núcleos micro ou pequenos, incluindo db-f1-micro, db-g1-small, HA db-f1-micro e HA db-g1-small), atualize para uma instância principal dedicada durante a operação de atualização para evitar potenciais problemas relacionados com recursos. Pode
reverter a versão após a conclusão da operação de atualização.
Erro de encerramento do MySQL
O seguinte erro ocorre quando tenta fazer a atualização após uma falha do sistema:
[ERROR] [MY-012526] [InnoDB] Upgrade after a crash is not supported.
Este erro ocorre se um encerramento anterior demorar mais tempo do que o esperado.
O Cloud SQL executa um encerramento limpo antes da atualização da versão principal. As instâncias com cargas de trabalho pesadas ou transações de longa duração podem experienciar um processo de encerramento prolongado, o que pode causar um limite de tempo e a falha da atualização.
Para resolver este problema e garantir que a atualização é bem-sucedida, planeie a atualização durante um período de baixo tráfego sem transações de longa duração.