Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Riferimento alle descrizioni di precontrollo per Aurora MySQL
I precontrolli di aggiornamento per Aurora MySQL sono descritti qui in dettaglio.
Indice
Errori
I seguenti precontrolli generano errori quando il precontrollo fallisce e l'aggiornamento non può procedere.
Precontrolli MySQL che segnalano errori
I seguenti controlli preliminari provengono da Community MySQL:
- checkTableMysqlSchema
-
Livello di precontrollo: errore
Problemi segnalati dal
check table x for upgrade
comando per lo schemamysql
Prima di iniziare l'aggiornamento ad Aurora MySQL versione 3,
check table for upgrade
viene eseguito su ogni tabella dello schema dell'mysql
istanza DB. Ilcheck table for upgrade
comando esamina le tabelle per individuare eventuali problemi che potrebbero insorgere durante l'aggiornamento a una versione più recente di MySQL. L'esecuzione di questo comando prima di tentare un aggiornamento può aiutare a identificare e risolvere eventuali incompatibilità in anticipo, rendendo più agevole l'effettivo processo di aggiornamento.Questo comando esegue diversi controlli su ogni tabella, come i seguenti:
-
Verifica della compatibilità della struttura della tabella e dei metadati con la versione di MySQL di destinazione
-
Verifica della presenza di eventuali funzionalità obsolete o rimosse utilizzate dalla tabella
-
Garantire che la tabella possa essere aggiornata correttamente senza perdita di dati
Per ulteriori informazioni, vedere l'istruzione CHECK TABLE
nella documentazione di MySQL. Esempio di output:
{ "id": "checkTableMysqlSchema", "title": "Issues reported by 'check table x for upgrade' command for mysql schema.", "status": "OK", "detectedProblems": [] }
L'output di questo precontrollo dipende dall'errore riscontrato e dal momento in cui si verifica, poiché
check table for upgrade
esegue più controlli.Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. -
- circularDirectoryCheck
-
Livello di precontrollo: errore
Riferimenti circolari alle directory nei percorsi dei file di dati del tablespace
A partire da MySQL
8.0.17, la clausola non consente più riferimenti CREATE TABLESPACE ... ADD DATAFILE
circolari alle directory. Per evitare problemi di aggiornamento, rimuovi tutti i riferimenti circolari alle directory dai percorsi dei file di dati del tablespace prima di eseguire l'aggiornamento ad Aurora MySQL versione 3.Esempio di output:
{ "id": "circularDirectory", "title": "Circular directory references in tablespace data file paths", "status": "OK", "description": "Error: Following tablespaces contain circular directory references (e.g. the reference '/../') in data file paths which as of MySQL 8.0.17 are not permitted by the CREATE TABLESPACE ... ADD DATAFILE clause. An exception to the restriction exists on Linux, where a circular directory reference is permitted if the preceding directory is a symbolic link. To avoid upgrade issues, remove any circular directory references from tablespace data file paths before upgrading.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-innodb-changes", "detectedProblems": [ { "level": "Error", "dbObject": "ts2", "description": "circular reference in datafile path: '/home/ec2-user/dbdata/mysql_5_7_44/../ts2.ibd'", "dbObjectType": "Tablespace" } ] }
Se ricevi questo errore, ricostruisci le tabelle utilizzando un file-per-table tablespace
. Utilizza i percorsi di file predefiniti per tutte le tablespace e le definizioni delle tabelle. Nota
Aurora MySQL non supporta tablespace o comandi generici.
CREATE TABLESPACE
Prima di ricostruire i tablespace, consulta le operazioni DDL online nella
documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. Dopo la ricostruzione, il controllo preliminare viene superato e l'aggiornamento può procedere.
{ "id": "circularDirectoryCheck", "title": "Circular directory references in tablespace data file paths", "status": "OK", "detectedProblems": [] },
- columnsWhichCannotHaveDefaultsCheck
-
Livello di precontrollo: errore
Colonne che non possono avere valori predefiniti
Prima di MySQL 8.0.13
BLOB
,,TEXT
GEOMETRY
,JSON
e le colonne non possono avere valori predefiniti.Rimuovi tutte le clausole predefinite su queste colonne prima di eseguire l'aggiornamento ad Aurora MySQL versione 3. Per ulteriori informazioni sulle modifiche alla gestione predefinita per questi tipi di dati, consulta i Valori predefiniti del tipo di dati nella documentazione di MySQL. Esempio di output:
{ "id": "columnsWhichCannotHaveDefaultsCheck", "title": "Columns which cannot have default values", "status": "OK", "description": "Error: The following columns are defined as either BLOB, TEXT, GEOMETRY or JSON and have a default value set. These data types cannot have default values in MySQL versions prior to 8.0.13, while starting with 8.0.13, the default value must be specified as an expression. In order to fix this issue, please use the ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT statement.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#data-type-defaults-explicit", "detectedProblems": [ { "level": "Error", "dbObject": "test.test_blob_default.geo_col", "description": "geometry" } ] },
Il precontrollo restituisce un errore perché la
geo_col
colonna dellatest.test_blob_default
tabella utilizza un tipo diJSON
datiBLOB
TEXT
GEOMETRY
,, o con un valore predefinito specificato.Guardando la definizione della tabella, possiamo vedere che la
geo_col
colonna è definita comegeo_col geometry NOT NULL default ''
.mysql> show create table test_blob_default\G *************************** 1. row *************************** Table: test_blob_default Create Table: CREATE TABLE `test_blob_default` ( `geo_col` geometry NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=latin1
Rimozione di questa clausola predefinita per consentire il superamento del precontrollo.
Nota
Prima di eseguire
ALTER TABLE
istruzioni o ricostruire tablespace, consulta le operazioni DDL online nelladocumentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. mysql> ALTER TABLE test_blob_default modify COLUMN geo_col geometry NOT NULL; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table test_blob_default\G *************************** 1. row *************************** Table: test_blob_default Create Table: CREATE TABLE `test_blob_default` ( `geo_col` geometry NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
Il controllo preliminare viene superato e puoi riprovare a eseguire l'aggiornamento.
{ "id": "columnsWhichCannotHaveDefaultsCheck", "title": "Columns which cannot have default values", "status": "OK", "detectedProblems": [] },
- depreciatedSyntaxCheck
-
Livello di precontrollo: errore
Utilizzo di parole chiave deprezzate nella definizione
MySQL 8.0 ha rimosso la cache delle query.
Di conseguenza, è stata rimossa una parte della sintassi SQL specifica della cache delle query. Se uno qualsiasi degli oggetti del database contiene le SQL_NO_CACHE
parole chiave, oQUERY CACHE
SQL_CACHE
, viene restituito un errore di precontrollo. Per risolvere questo problema, ricreate questi oggetti, rimuovendo le parole chiave menzionate.Esempio di output:
{ "id": "depreciatedSyntaxCheck", "title": "Usage of depreciated keywords in definition", "status": "OK", "description": "Error: The following DB objects contain keywords like 'QUERY CACHE', 'SQL_CACHE', 'SQL_NO_CACHE' which are not supported in major version 8.0. It is recommended to drop these DB objects or rebuild without any of the above keywords before upgrade.", "detectedProblems": [ { "level": "Error", "dbObject": "test.no_query_cache_check", "description": "PROCEDURE uses depreciated words in definition" } ] }
Il precontrollo riporta che la
test.no_query_cache_check
stored procedure utilizza una delle parole chiave rimosse. Guardando la definizione della procedura, possiamo vedere che utilizzaSQL_NO_CACHE
.mysql> show create procedure test.no_query_cache_check\G *************************** 1. row *************************** Procedure: no_query_cache_check sql_mode: Create Procedure: CREATE DEFINER=`reinvent`@`%` PROCEDURE `no_query_cache_check`() BEGIN SELECT SQL_NO_CACHE k from sbtest1 where id > 10 and id < 20 group by k asc; END character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
Rimuovi la parola chiave.
mysql> drop procedure test.no_query_cache_check; Query OK, 0 rows affected (0.01 sec) mysql> delimiter // mysql> CREATE DEFINER=`reinvent`@`%` PROCEDURE `no_query_cache_check`() BEGIN SELECT k from sbtest1 where id > 10 and id < 20 group by k asc; END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
Dopo aver rimosso la parola chiave, il precontrollo viene completato correttamente.
{ "id": "depreciatedSyntaxCheck", "title": "Usage of depreciated keywords in definition", "status": "OK", "detectedProblems": [] }
- engineMixupCheck
-
Livello di precontrollo: errore
Tabelle riconosciute da InnoDB che appartengono a un motore diverso
Analogamente schemaInconsistencyCheck, questo precontrollo verifica che i metadati delle tabelle in MySQL siano coerenti prima di procedere con l'aggiornamento.
Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. Esempio di output:
{ "id": "engineMixupCheck", "title": "Tables recognized by InnoDB that belong to a different engine", "status": "OK", "description": "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 removes InnoDB table files manually from the disk and creates e.g. a MyISAM table with the same name.\n\nA possible way to solve this situation is to e.g. in case of MyISAM table:\n\n1. Rename the MyISAM table to a temporary name (RENAME TABLE).\n2. Create some dummy InnoDB table (its definition does not need to match), then copy (copy, not move) and rename the dummy .frm and .ibd files to the orphan name using OS file commands.\n3. The orphan table can be then dropped (DROP TABLE), as well as the dummy table.\n4. Finally the MyISAM table can be renamed back to its original name.", "detectedProblems": [ { "level": "Error", "dbObject": "mysql.general_log_backup", "description": "recognized by the InnoDB engine but belongs to CSV" } ] }
- enumSetElementLengthCheck
-
Livello di precontrollo: errore
ENUM
e definizioni diSET
colonna contenenti elementi più lunghi di 255 caratteriLe tabelle e le stored procedure non devono contenere elementi
ENUM
oSET
colonne che superino i 255 caratteri o 1020 byte. Prima di MySQL 8.0, la lunghezza massima combinata era di 64K, ma 8.0 limita i singoli elementi a 255 caratteri o 1020 byte (supporto multibyte). Se si verifica un errore di precontrollo perenumSetElementLengthCheck
, modifica tutti gli elementi che superano questi nuovi limiti prima di riprovare l'aggiornamento.Esempio di output:
{ "id": "enumSetElementLengthCheck", "title": "ENUM/SET column definitions containing elements longer than 255 characters", "status": "OK", "description": "Error: The following columns are defined as either ENUM or SET and contain at least one element longer that 255 characters. They need to be altered so that all elements fit into the 255 characters limit.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html", "detectedProblems": [ { "level": "Error", "dbObject": "test.large_set.s", "description": "SET contains element longer than 255 characters" } ] },
Il precontrollo riporta un errore perché la colonna
s
dellatest.large_set
tabella contiene unSET
elemento più grande di 255 caratteri.Dopo aver ridotto le
SET
dimensioni di questa colonna, il precontrollo viene eseguito e l'aggiornamento può continuare.{ "id": "enumSetElementLenghtCheck", "title": "ENUM/SET column definitions containing elements longer than 255 characters", "status": "OK", "detectedProblems": [] },
- foreignKeyLengthControlla
-
Livello di precontrollo: errore
Nomi di vincoli di chiave esterna più lunghi di 64 caratteri
In MySQL, la lunghezza degli identificatori è limitata a 64 caratteri, come indicato nella documentazione di MySQL.
A causa dei problemi identificati per cui la lunghezza delle chiavi esterne poteva essere uguale o superiore a questo valore, con conseguenti errori di aggiornamento, è stato implementato questo controllo preliminare. Se si verificano errori con questo precontrollo, è necessario modificare o rinominare il vincolo in modo che sia inferiore a 64 caratteri prima di riprovare l'aggiornamento. Esempio di output:
{ "id": "foreignKeyLength", "title": "Foreign key constraint names longer than 64 characters", "status": "OK", "detectedProblems": [] }
- getDuplicateTriggers
-
Livello di precontrollo: errore
Tutti i nomi dei trigger in un database devono essere univoci.
A causa delle modifiche nell'implementazione del dizionario dei dati, MySQL 8.0 non supporta i trigger con distinzione tra maiuscole e minuscole all'interno di un database. Questo precontrollo verifica che il cluster DB non disponga di uno o più database contenenti trigger duplicati. Per ulteriori informazioni, consulta Identifier case sensitive
nella documentazione di MySQL. Esempio di output:
{ "id": "getDuplicateTriggers", "title": "MySQL pre-checks that all trigger names in a database are unique or not.", "status": "OK", "description": "Error: You have one or more database containing duplicate triggers. Mysql 8.0 does not support case sensitive triggers within a database https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html. To upgrade to MySQL 8.0, drop the triggers with case-insensitive duplicate names and recreate with distinct names.", "detectedProblems": [ { "level": "Error", "dbObject": "test", "description": "before_insert_product" }, { "level": "Error", "dbObject": "test", "description": "before_insert_PRODUCT" } ] }
Il precontrollo riporta un errore indicante che il cluster di database ha due trigger con lo stesso nome, ma che utilizzano casi diversi:
test.before_insert_product
e.test.before_insert_PRODUCT
Prima dell'aggiornamento, rinomina i trigger o eliminali e ricreali con un nuovo nome.
Dopo la
test.before_insert_PRODUCT
ridenominazione in, il precontrollo ha esito positivo.test.before_insert_product_2
{ "id": "getDuplicateTriggers", "title": "MySQL pre-checks that all trigger names in a database are unique or not.", "status": "OK", "detectedProblems": [] }
- getEventsWithNullDefiner
-
Livello di precontrollo: errore
La colonna definer per non
mysql.event
può essere nulla o vuota.L'
DEFINER
attributo specifica l'account MySQL che possiede una definizione di oggetto memorizzato, come un trigger, una stored procedure o un evento. Questo attributo è particolarmente utile in situazioni in cui si desidera controllare il contesto di sicurezza in cui viene eseguito l'oggetto archiviato. Quando si crea un oggetto memorizzato, seDEFINER
non è specificato un, l'impostazione predefinita è l'utente che ha creato l'oggetto.Quando si esegue l'aggiornamento a MySQL 8.0, non è possibile avere oggetti memorizzati che abbiano un definitore o
null
vuoto nel dizionario dei dati MySQL. Se si dispone di tali oggetti memorizzati, viene generato un errore di precontrollo. È necessario correggerlo prima di procedere con l'aggiornamento.Esempio di errore:
{ "id": "getEventsWithNullDefiner", "title": "The definer column for mysql.event cannot be null or blank.", "status": "OK", "description": "Error: Set definer column in mysql.event to a valid non-null definer.", "detectedProblems": [ { "level": "Error", "dbObject": "test.get_version", "description": "Set definer for event get_version in Schema test" } ] }
Il precontrollo restituisce un errore per l'
test.get_version
eventoperché ha un null
definitore.Per risolvere questo problema puoi controllare la definizione dell'evento. Come puoi vedere, il definitore è
null
o vuoto.mysql> select db,name,definer from mysql.event where name='get_version'; +------+-------------+---------+ | db | name | definer | +------+-------------+---------+ | test | get_version | | +------+-------------+---------+ 1 row in set (0.00 sec)
Elimina o ricrea l'evento con un definitore valido.
Nota
Prima di eliminare o ridefinire un
DEFINER
, esamina e verifica attentamente i requisiti dell'applicazione e dei privilegi. Per ulteriori informazioni, vedere Stored object access controlnella documentazione di MySQL. mysql> drop event test.get_version; Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> delimiter $$ mysql> CREATE EVENT get_version -> ON SCHEDULE -> EVERY 1 DAY -> DO -> ///DO SOMETHING // -> $$ Query OK, 0 rows affected (0.01 sec) mysql> DELIMITER ; mysql> select db,name,definer from mysql.event where name='get_version'; +------+-------------+------------+ | db | name | definer | +------+-------------+------------+ | test | get_version | reinvent@% | +------+-------------+------------+ 1 row in set (0.00 sec)
Ora il precontrollo passa.
{ "id": "getEventsWithNullDefiner", "title": "The definer column for mysql.event cannot be null or blank.", "status": "OK", "detectedProblems": []},
- getMismatchedMetadata
-
Livello di precontrollo: errore
Mancata corrispondenza della definizione delle colonne tra il dizionario dei dati InnoDB e la definizione effettiva della tabella
Analogamente schemaInconsistencyCheck, questo precontrollo verifica che i metadati delle tabelle in MySQL siano coerenti prima di procedere con l'aggiornamento. In questo caso, il precontrollo verifica che le definizioni delle colonne corrispondano tra il dizionario dei dati InnoDB e la definizione della tabella MySQL. Se viene rilevata una mancata corrispondenza, l'aggiornamento non procede.
Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. Esempio di output:
{ "id": "getMismatchedMetadata", "title": "Column definition mismatch between InnoDB Data Dictionary and actual table definition.", "status": "OK", "description": "Error: Your database has mismatched metadata. The upgrade to mysql 8.0 will not succeed until this is fixed.", "detectedProblems": [ { "level": "Error", "dbObject": "test.mismatchTable", "description": "Table `test/mismatchTable` column names mismatch with InnoDb dictionary column names: iD <> id" } ] }
Il precontrollo riporta una mancata corrispondenza nei metadati per la
id
colonna della tabella.test.mismatchTable
In particolare, i metadati MySQL hanno il nome della colonna asiD
, mentre InnoDB lo ha come.id
- getTriggersWithNullDefiner
-
Livello di precontrollo: errore
La colonna del definitore per non
information_schema.triggers
può esserenull
o vuota.Il precontrollo verifica che il database non abbia trigger definiti con
null
o definitori vuoti. Per ulteriori informazioni sui requisiti di definizione per gli oggetti archiviati, vedere. getEventsWithNullDefinerEsempio di output:
{ "id": "getTriggersWithNullDefiner", "title": "The definer column for information_schema.triggers cannot be null or blank.", "status": "OK", "detectedProblems": [ { "level": "Error", "dbObject": "test.example_trigger", "description": "Set definer for trigger example_trigger in Schema test" } ] }
Il precontrollo restituisce un errore perché il
example_trigger
trigger nellotest
schema ha unnull
definitore. Per correggere questo problema, correggi il definitore ricreando il trigger con un utente valido oppure elimina il trigger. Per ulteriori informazioni, consulta l'esempio in. getEventsWithNullDefinerNota
Prima di eliminare o ridefinire un
DEFINER
, esamina e controlla attentamente i requisiti dell'applicazione e dei privilegi. Per ulteriori informazioni, vedere Stored object access controlnella documentazione di MySQL. - getValueOfVariabileLower_case_table_names
-
Livello di precontrollo: errore
Tutti i nomi di database o tabelle devono essere in minuscolo quando il
lower_case_table_names
parametro è impostato su.1
Prima di MySQL 8.0, i nomi dei database, i nomi delle tabelle e altri oggetti corrispondevano ai file nella directory dei dati, come i metadati basati su file (.frm). La variabile di sistema lower_case_table_names
consente agli utenti di controllare il modo in cui il server gestisce la distinzione tra maiuscole e minuscole degli identificatori per gli oggetti del database e l'archiviazione di tali oggetti di metadati. Questo parametro può essere modificato su un server già inizializzato dopo un riavvio. Tuttavia, in MySQL 8.0, sebbene questo parametro controlli ancora il modo in cui il server gestisce la distinzione tra maiuscole e minuscole degli identificatori, non può essere modificato dopo l'inizializzazione del dizionario dei dati. Quando si aggiorna o si crea un database MySQL 8.0, il valore impostato per
lower_case_table_names
la prima volta che il dizionario dei dati viene avviato su MySQL, viene utilizzato per tutta la durata del database. Questa restrizione è stata messa in atto come parte dell'implementazione dell'implementazione dell'Atomic Data Dictionary, in cui gli oggetti del database vengono migrati dai metadati basati su file alle tabelle InnoDB interne dello schema. mysql
Per ulteriori informazioni, consulta Modifiche al dizionario dei dati
nella documentazione di MySQL. Per evitare problemi durante l'aggiornamento dei metadati basati su file al nuovo Atomic Data Dictionary, questo precontrollo verifica che, quando
lower_case_table_names = 1
, tutte le tabelle vengano archiviate su disco in lettere minuscole. In caso contrario, viene restituito un errore di precontrollo ed è necessario correggere i metadati prima di procedere con l'aggiornamento.Esempio di output:
{ "id": "getValueOfVariablelower_case_table_names", "title": "MySQL pre-checks that all database or table names are lowercase when the lower_case_table_names parameter is set to 1.", "status": "OK", "description": "Error: You have one or more databases or tables with uppercase letters in the names, but the lower_case_table_names parameter is set to 1. To upgrade to MySQL 8.0, either change all database or table names to lowercase, or set the parameter to 0.", "detectedProblems": [ { "level": "Error", "dbObject": "test.TEST", "description": "Table test.TEST contains one or more capital letters in name while lower_case_table_names = 1" } ] }
Viene restituito un errore perché la tabella
test.TEST
contiene lettere maiuscole, malower_case_table_names
è impostata su.1
Per risolvere questo problema, è possibile rinominare la tabella in lettere minuscole o modificare il
lower_case_table_names
parametro sul cluster DB prima di iniziare l'aggiornamento.Nota
Verifica ed esamina attentamente la documentazione sulla distinzione tra maiuscole e minuscole
in MySQL e su come tali modifiche potrebbero influire sulla tua applicazione. Consulta anche la documentazione di MySQL 8.0 su come lower_case_table_names vengono gestiti in modo diverso
in MySQL 8.0. - groupByAscSyntaxCheck
-
Livello di precontrollo: errore
Utilizzo della sintassi rimossa
GROUP BY ASC/DESC
A partire da MySQL 8.0.13, la sintassi o
ASC
obsoleta per le clausole è stata rimossaDESC
.GROUP BY
Le query che si basano sull'ordinamento potrebbero ora produrre risultati diversi.GROUP BY
Per ottenere un ordinamento specifico, utilizzate invece unaORDER BY
clausola. Se nel database sono presenti oggetti che utilizzano questa sintassi, è necessario ricrearli utilizzando unaORDER BY
clausola prima di riprovare l'aggiornamento. Per ulteriori informazioni, vedere Modifiche SQLnella documentazione di MySQL. Esempio di output:
{ "id": "groupbyAscSyntaxCheck", "title": "Usage of removed GROUP BY ASC/DESC syntax", "status": "OK", "description": "Error: The following DB objects use removed GROUP BY ASC/DESC syntax. They need to be altered so that ASC/DESC keyword is removed from GROUP BY clause and placed in appropriate ORDER BY clause.", "documentationLink": "https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-13.html#mysqld-8-0-13-sql-syntax", "detectedProblems": [ { "level": "Error", "dbObject": "test.groupbyasc", "description": "PROCEDURE uses removed GROUP BY ASC syntax", "dbObjectType": "Routine" } ] }
- mysqlEmptyDotTableSyntaxCheck
-
Livello di precontrollo: errore
Verifica la presenza di una
.<table>
sintassi obsoleta utilizzata nelle routine.In MySQL 8.0, le routine non possono più contenere la sintassi dell'identificatore obsoleta ().
\".<table>\"
Se alcune routine o trigger memorizzati contengono tali identificatori, l'aggiornamento non riesce. Ad esempio, il seguente.dot_table
riferimento non è più consentito:mysql> show create procedure incorrect_procedure\G *************************** 1. row *************************** Procedure: incorrect_procedure sql_mode: Create Procedure: CREATE DEFINER=`reinvent`@`%` PROCEDURE `incorrect_procedure`() BEGIN delete FROM .dot_table; select * from .dot_table where 1=1; END character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
Dopo aver ricreato le routine e i trigger per utilizzare la sintassi dell'identificatore e l'escape corretti, il precontrollo viene superato e l'aggiornamento può procedere. Per ulteriori informazioni sugli identificatori, vedere Nomi degli oggetti dello schema
nella documentazione di MySQL. Esempio di output:
{ "id": "mysqlEmptyDotTableSyntaxCheck", "title": "Check for deprecated '.<table>' syntax used in routines.", "status": "OK", "description": "Error: The following routines contain identifiers in deprecated identifier syntax (\".<table>\"), and should be corrected before upgrade:\n", "detectedProblems": [ { "level": "Error", "dbObject": "test.incorrect_procedure", "description": " routine body contains deprecated identifiers." } ] }
Il precheck restituisce un errore per la
incorrect_procedure
routine neltest
database perché contiene una sintassi obsoleta.Dopo aver corretto la routine, il precontrollo ha esito positivo ed è possibile ripetere l'aggiornamento.
- mysqlIndexTooLargeCheck
-
Livello di precontrollo: errore
Verifica la presenza di indici troppo grandi per funzionare su versioni di MySQL superiori alla 5.7
Per i formati di riga compatti o ridondanti, non dovrebbe essere possibile creare un indice con un prefisso superiore a 767 byte. Tuttavia, prima della versione 5.7.35 di MySQL questo era possibile. Per ulteriori informazioni, consulta le note di rilascio di MySQL 5.7.35
. Tutti gli indici interessati da questo bug diventeranno inaccessibili dopo l'aggiornamento a MySQL 8.0. Questo precontrollo identifica gli indici pericolosi che devono essere ricostruiti prima che l'aggiornamento possa procedere.
{ "id": "mysqlIndexTooLargeCheck", "title": "Check for indexes that are too large to work on higher versions of MySQL Server than 5.7", "status": "OK", "description": "Error: The following indexes ware made too large for their format in an older version of MySQL (older than 5.7.34). Normally those indexes within tables with compact or redundant row formats shouldn't be larger than 767 bytes. To fix this problem those indexes should be dropped before upgrading or those tables will be inaccessible.", "detectedProblems": [ { "level": "Error", "dbObject": "test.table_with_large_idx", "description": "IDX_2" } ] }
Il precontrollo restituisce un errore perché la
test.table_with_large_idx
tabella contiene un indice su una tabella che utilizza un formato di riga compatto o ridondante di dimensioni superiori a 767 byte. Queste tabelle diventerebbero inaccessibili dopo l'aggiornamento a MySQL 8.0. Prima di procedere con l'aggiornamento, effettuate una delle seguenti operazioni:-
Eliminate l'indice indicato nel precontrollo.
-
Aggiungi un indice menzionato nel precontrollo.
-
Cambia il formato di riga usato dalla tabella.
Qui ricostruiamo la tabella per risolvere l'errore di precontrollo. Prima di ricostruire la tabella, assicurati che innodb_file_format sia impostato su e innodb_default_row_format
sia impostato Barracuda
su.dynamic
Queste sono le impostazioni predefinite in MySQL 5.7. Per ulteriori informazioni, consulta i formati di riga InnoDB e la gestione dei formatidi file InnoDB nella documentazione MySQL . Nota
Prima di ricostruire i tablespace, consulta le operazioni DDL online nella
documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. mysql > select @@innodb_file_format,@@innodb_default_row_format; +----------------------+-----------------------------+ | @@innodb_file_format | @@innodb_default_row_format | +----------------------+-----------------------------+ | Barracuda | dynamic | +----------------------+-----------------------------+ 1 row in set (0.00 sec) mysql> optimize table table_with_large_idx; +---------------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------------+----------+----------+-------------------------------------------------------------------+ | test.table_with_large_idx | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.table_with_large_idx | optimize | status | OK | +---------------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (0.02 sec) # Verify FILE_FORMAT and ROW_FORMAT mysql> select * from information_schema.innodb_sys_tables where name like 'test/table_with_large_idx'; +----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+ | TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | +----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+ | 43 | test/table_with_large_idx | 33 | 4 | 26 | Barracuda | Dynamic | 0 | Single | +----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+ 1 row in set (0.00 sec)
Dopo aver ricostruito la tabella, il precontrollo viene superato e l'aggiornamento può procedere.
{ "id": "mysqlIndexTooLargeCheck", "title": "Check for indexes that are too large to work on higher versions of MySQL Server than 5.7", "status": "OK", "detectedProblems": [] },
-
- MySQL è valido 57 NamesCheck
-
Livello di precontrollo: errore
Verifica la presenza di nomi di tabelle e schemi non validi utilizzati in MySQL 5.7
Durante la migrazione al nuovo dizionario dei dati in MySQL 8.0, l'istanza del database non può contenere schemi o tabelle con il prefisso.
#mysql50#
Se esistono oggetti di questo tipo, l'aggiornamento non riesce. Per risolvere questo problema, esegui mysqlcheck sugli schemi e sulletabelle restituiti. Nota
Esempio di output:
{ "id": "mysqlInvalid57NamesCheck", "title": "Check for invalid table names and schema names used in 5.7", "status": "OK", "description": "The following tables and/or schemas have invalid names. In order to fix them use the mysqlcheck utility as follows:\n\n $ mysqlcheck --check-upgrade --all-databases\n $ mysqlcheck --fix-db-names --fix-table-names --all-databases\n\nOR via mysql client, for eg:\n\n ALTER DATABASE `#mysql50#lost+found` UPGRADE DATA DIRECTORY NAME;", "documentationLink": "https://dev.mysql.com/doc/refman/5.7/en/identifier-mapping.html https://dev.mysql.com/doc/refman/5.7/en/alter-database.html https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals", "detectedProblems": [ { "level": "Error", "dbObject": "#mysql50#fix_db_names", "description": "Schema name" } ] }
Il precontrollo riporta che lo schema
#mysql50#fix_db_names
ha un nome non valido.Dopo aver corretto il nome dello schema, il precontrollo viene eseguito e l'aggiornamento può procedere.
{ "id": "mysqlInvalid57NamesCheck", "title": "Check for invalid table names and schema names used in 5.7", "status": "OK", "detectedProblems": [] },
- mysqlOrphanedRoutinesControlla
-
Livello di precontrollo: errore
Verifica la presenza di routine orfane in 5.7
Durante la migrazione al nuovo dizionario dei dati in MySQL 8.0, se nel database sono presenti procedure memorizzate in cui lo schema non esiste più, l'aggiornamento non riesce. Questo precontrollo verifica che tutti gli schemi a cui si fa riferimento nelle stored procedure sull'istanza DB esistano ancora. Per consentire il proseguimento dell'aggiornamento, elimina queste stored procedure.
Esempio di output:
{ "id": "mysqlOrphanedRoutinesCheck", "title": "Check for orphaned routines in 5.7", "status": "OK", "description": "Error: The following routines have been orphaned. Schemas that they are referencing no longer exists.\nThey have to be cleaned up or the upgrade will fail.", "detectedProblems": [ { "level": "Error", "dbObject": "dropped_db.get_version", "description": "is orphaned" } ] },
Il precontrollo riporta che la
get_version
stored procedure neldropped_db
database è orfana.Per ripulire questa procedura, è possibile ricreare lo schema mancante.
mysql> create database dropped_db; Query OK, 1 row affected (0.01 sec)
Dopo aver ricreato lo schema, è possibile interrompere la procedura per consentire il proseguimento dell'aggiornamento.
{ "id": "mysqlOrphanedRoutinesCheck", "title": "Check for orphaned routines in 5.7", "status": "OK", "detectedProblems": [] },
- mysqlSchemaCheck
-
Livello di precontrollo: errore
I nomi delle tabelle nello
mysql
schema sono in conflitto con le nuove tabelle in MySQL 8.0Il nuovo Atomic Data Dictionary
introdotto in MySQL 8.0 memorizza tutti i metadati in un set di tabelle InnoDB interne nello schema. mysql
Durante l'aggiornamento, le nuove tabelle interne del dizionario dei dati vengono create nello schema. mysql
Per evitare collisioni di denominazione, che potrebbero causare errori di aggiornamento, il controllo preliminare esamina tutti i nomi delle tabelle dellomysql
schema per assicurarsi che nessuno dei nuovi nomi di tabella sia già in uso. In caso affermativo, viene restituito un errore e l'aggiornamento non può continuare.Esempio di output:
{ "id": "mysqlSchema", "title": "Table names in the mysql schema conflicting with new tables in the latest MySQL.", "status": "OK", "description": "Error: The following tables in mysql schema have names that will conflict with the ones introduced in the latest version. They must be renamed or removed before upgrading (use RENAME TABLE command). This may also entail changes to applications that use the affected tables.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrade-before-you-begin.html", "detectedProblems": [ { "level": "Error", "dbObject": "mysql.tablespaces", "description": "Table name used in mysql schema.", "dbObjectType": "Table" } ] }
Viene restituito un errore perché
mysql
nello schema è presente una tabella denominatatablespaces
. Questo è uno dei nuovi nomi di tabella del dizionario dati interno di MySQL 8.0. È necessario rinominare o rimuovere tali tabelle prima dell'aggiornamento, utilizzando il comando.RENAME TABLE
- nonNativePartitioningControlla
-
Livello di precontrollo: errore
Tabelle partizionate utilizzando motori con partizionamento non nativo
Secondo la documentazione di MySQL 8.0
, due motori di archiviazione attualmente forniscono supporto nativo per il partizionamento: InnoDB e NDB. Di questi, solo InnoDB è supportato in Aurora MySQL versione 3, compatibile con MySQL 8.0. Qualsiasi tentativo di creare tabelle partizionate in MySQL 8.0 utilizzando qualsiasi altro motore di archiviazione fallisce. Questo precontrollo cerca le tabelle nel cluster DB che utilizzano il partizionamento non nativo. Se ne vengono restituiti alcuni, è necessario rimuovere il partizionamento o convertire il motore di archiviazione in InnoDB. Esempio di output:
{ "id": "nonNativePartitioning", "title": "Partitioned tables using engines with non native partitioning", "status": "OK", "description": "Error: In the latest MySQL storage engine is responsible for providing its own partitioning handler, and the MySQL server no longer provides generic partitioning support. InnoDB and NDB are the only storage engines that provide a native partitioning handler that is supported in the latest MySQL. A partitioned table using any other storage engine must be altered—either to convert it to InnoDB or NDB, or to remove its partitioning—before upgrading the server, else it cannot be used afterwards.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-configuration-changes", "detectedProblems": [ { "level": "Error", "dbObject": "test.partMyisamTable", "description": "MyISAM engine does not support native partitioning", "dbObjectType": "Table" } ] }
Qui una tabella MyISAM utilizza il partizionamento, che richiede un'azione prima che l'aggiornamento possa procedere.
- oldTemporalCheck
-
Livello di precontrollo: errore
Utilizzo del vecchio tipo temporale
I «vecchi temporali» si riferiscono alle colonne di tipo temporale (come
TIMESTAMP
eDATETIME
) create nelle versioni di MySQL 5.5 e precedenti. In MySQL 8.0, il supporto per questi vecchi tipi di dati temporali viene rimosso, il che significa che gli aggiornamenti in loco da MySQL 5.7 a 8.0 non sono possibili se il database contiene questi vecchi tipi temporali. Per risolvere questo problema, è necessario ricostruiretutte le tabelle contenenti questi vecchi tipi di date temporali prima di procedere con l'aggiornamento. Per ulteriori informazioni sulla deprecazione dei vecchi tipi di dati temporali in MySQL 5.7, consulta questo blog.
Per ulteriori informazioni sulla rimozione dei vecchi tipi di dati temporali in MySQL 8.0, consulta questo blog. Nota
Prima di ricostruire i tablespace, consulta le operazioni DDL online nella
documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. Esempio di output:
{ "id": "oldTemporalCheck", "title": "Usage of old temporal type", "status": "OK", "description": "Error: Following table columns use a deprecated and no longer supported temporal disk storage format. They must be converted to the new format before upgrading. It can by done by rebuilding the table using 'ALTER TABLE <table_name> FORCE' command", "documentationLink": "https://dev.mysql.com/blog-archive/mysql-8-0-removing-support-for-old-temporal-datatypes/", "detectedProblems": [ { "level": "Error", "dbObject": "test.55_temporal_table.timestamp_column", "description": "timestamp /* 5.5 binary format */", "dbObjectType": "Column" } ] },
Viene segnalato un errore per la colonna
timestamp_column
della tabellatest.55_temporal_table
, poiché utilizza un vecchio formato di archiviazione su disco temporale che non è più supportato.Per risolvere questo problema e consentire il proseguimento dell'aggiornamento, ricostruisci la tabella per convertire il vecchio formato di archiviazione su disco temporale in quello nuovo introdotto in MySQL 5.6. Per ulteriori informazioni e prerequisiti prima di procedere, consulta Conversione tra set di caratteri Unicode a 3 e 4 byte nella documentazione
di MySQL. L'esecuzione del comando seguente per ricostruire le tabelle menzionate in questo precontrollo converte i vecchi tipi temporali nel formato più recente con una precisione di frazioni di secondo.
ALTER TABLE ... ENGINE=InnoDB;
Per ulteriori informazioni sulla ricostruzione delle tabelle, vedere l'istruzione ALTER TABLE
nella documentazione di MySQL. Dopo aver ricostruito la tabella in questione e riavviato l'aggiornamento, il controllo di compatibilità viene superato e l'aggiornamento può procedere.
{ "id": "oldTemporalCheck", "title": "Usage of old temporal type", "status": "OK", "detectedProblems": [] }
-
Livello di precontrollo: errore
Utilizzo di tabelle partizionate in tablespace condivisi
A partire da MySQL
8.0.13, il supporto per l'inserimento di partizioni di tabelle in tablespace condivisi è stato rimosso. Prima dell'aggiornamento, sposta tali tabelle dai tablespace condivisi ai tablespace. file-per-table Nota
Prima di ricostruire i tablespace, consulta Operazioni di partizionamento
nella documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. Esempio di output:
{ "id": "partitionedTablesInSharedTablespaceCheck", "title": "Usage of partitioned tables in shared tablespaces", "status": "OK", "description": "Error: The following tables have partitions in shared tablespaces. They need to be moved to file-per-table tablespace before upgrading. You can do this by running query like 'ALTER TABLE table_name REORGANIZE PARTITION X INTO (PARTITION X VALUES LESS THAN (30) TABLESPACE=innodb_file_per_table);'", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals", "detectedProblems": [ { "level": "Error", "dbObject": "test.partInnoDBTable", "description": "Partition p1 is in shared tablespace innodb", "dbObjectType": "Table" } ] }
Il precontrollo fallisce perché la partizione della
p1
tabellatest.partInnoDBTable
si trova nel tablespace del sistema.Per risolvere questo problema, ricostruite la
test.partInnodbTable
tabella inserendo la partizione che causa il problema in una tablespace.p1
file-per-tablemysql > ALTER TABLE partInnodbTable REORGANIZE PARTITION p1 -> INTO (PARTITION p1 VALUES LESS THAN ('2014-01-01') TABLESPACE=innodb_file_per_table); Query OK, 0 rows affected, 1 warning (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
Dopo averlo fatto, il precontrollo passa.
{ "id": "partitionedTablesInSharedTablespaceCheck", "title": "Usage of partitioned tables in shared tablespaces", "status": "OK", "detectedProblems": [] }
- removedFunctionsCheck
-
Livello di precontrollo: errore
Utilizzo di funzioni rimosse dall'ultima versione di MySQL
In MySQL 8.0, sono state rimosse diverse funzioni integrate. Questo controllo preliminare esamina il database alla ricerca di oggetti che potrebbero utilizzare queste funzioni. Se vengono trovati, viene restituito un errore. È necessario risolvere i problemi prima di riprovare l'aggiornamento.
La maggior parte delle funzioni rimosse sono funzioni spaziali
, che sono state sostituite con funzioni equivalenti ST_*
. In questi casi, si modificano gli oggetti del database per utilizzare la nuova denominazione delle procedure. Per ulteriori informazioni, consulta Features Removed in MySQL 8.0nella documentazione MySQL. Esempio di output:
{ "id": "removedFunctionsCheck", "title": "Usage of removed functions", "status": "OK", "description": "Error: The following DB objects use functions that were removed in the latest MySQL version. Please make sure to update them to use supported alternatives before upgrade.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals", "detectedProblems": [ { "level": "Error", "dbObject": "test.GetLocationsInPolygon", "description": "PROCEDURE uses removed function POLYGONFROMTEXT (consider using ST_POLYGONFROMTEXT instead)", "dbObjectType": "Routine" }, { "level": "Error", "dbObject": "test.InsertLocation", "description": "PROCEDURE uses removed function POINTFROMTEXT (consider using ST_POINTFROMTEXT instead)", "dbObjectType": "Routine" } ] },
Il precontrollo riporta che la
test.GetLocationsInPolygon
stored procedure utilizza due funzioni rimosse: POLYGONFROMTEXT e POINTFROMTEXT. Suggerisce inoltre di utilizzare i nuovi ST_POLYGONFROMTEXT e ST_POINTFROMTEXT come sostituti. Dopo aver ricreato la procedura utilizzando i suggerimenti, il precontrollo viene completato correttamente. { "id": "removedFunctionsCheck", "title": "Usage of removed functions", "status": "OK", "detectedProblems": [] },
Nota
Sebbene nella maggior parte dei casi le funzioni obsolete siano sostituite direttamente, assicuratevi di testare l'applicazione e di consultare la documentazione per eventuali modifiche di comportamento dovute alla modifica.
- routineSyntaxCheck
-
Livello di precontrollo: errore
Controllo della sintassi MySQL per oggetti simili a routine
MySQL 8.0 ha introdotto parole chiave riservate che non erano riservate
in precedenza. Il prechecker di aggiornamento valuta l'utilizzo di parole chiave riservate nei nomi degli oggetti del database e nelle relative definizioni e nel corpo. Se rileva l'uso di parole chiave riservate negli oggetti del database, ad esempio stored procedure, funzioni, eventi e trigger, l'aggiornamento non riesce e viene pubblicato un errore nel file. upgrade-prechecks.log
Per risolvere il problema, è necessario aggiornare le definizioni degli oggetti e racchiudere tali riferimenti tra virgolette singole (') prima dell'aggiornamento. Per ulteriori informazioni sull'escape delle parole riservate in MySQL, consulta String literalsnella documentazione di MySQL. In alternativa, è possibile modificare il nome con un nome diverso, il che potrebbe richiedere modifiche all'applicazione.
Esempio di output:
{ "id": "routineSyntaxCheck", "title": "MySQL syntax check for routine-like objects", "status": "OK", "description": "The following objects did not pass a syntax check with the latest MySQL grammar. A common reason is that they reference names that conflict with new reserved keywords. You must update these routine definitions and `quote` any such references before upgrading.", "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html", "detectedProblems": [ { "level": "Error", "dbObject": "test.select_res_word", "description": "at line 2,18: unexpected token 'except'", "dbObjectType": "Routine" } ] }
Per risolvere questo problema, controlla la definizione della routine.
SHOW CREATE PROCEDURE test.select_res_word\G *************************** 1. row *************************** Procedure: select_res_word sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE PROCEDURE 'select_res_word'() BEGIN SELECT * FROM except; END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
La procedura utilizza una tabella denominata
except
, che è una nuova parola chiave in MySQL 8.0. Ricrea la procedura evitando il valore letterale della stringa.> drop procedure if exists select_res_word; Query OK, 0 rows affected (0.00 sec) > DELIMITER $$ > CREATE PROCEDURE select_res_word() -> BEGIN -> SELECT * FROM 'except'; -> END$$ Query OK, 0 rows affected (0.00 sec) > DELIMITER ;
Il precontrollo ora passa.
{ "id": "routineSyntaxCheck", "title": "MySQL syntax check for routine-like objects", "status": "OK", "detectedProblems": [] }
- schemaInconsistencyCheck
-
Livello di precontrollo: errore
Incoerenze dello schema derivanti dalla rimozione o dal danneggiamento dei file
Come descritto in precedenza, MySQL 8.0 ha introdotto l'Atomic Data
Dictionary, che memorizza tutti i metadati in un set di tabelle InnoDB interne nello schema. mysql
Questa nuova architettura offre un modo transazionale e conforme agli standard ACIDper gestire i metadati del database, risolvendo il problema della «DDL atomica» derivante dal vecchio approccio basato su file. Prima di MySQL 8.0, era possibile che gli oggetti dello schema diventassero orfani se un'operazione DDL veniva interrotta inaspettatamente. La migrazione dei metadati basati su file nelle nuove tabelle Atomic Data Dictionary durante l'aggiornamento garantisce che non vi siano tali oggetti dello schema orfani nell'istanza DB. Se vengono rilevati oggetti orfani, l'aggiornamento non riesce. Per aiutare a rilevare questi oggetti orfani prima di iniziare l'aggiornamento, viene eseguito il
schemaInconsistencyCheck
precontrollo per garantire che tutti gli oggetti di metadati del dizionario di dati siano sincronizzati. Se vengono rilevati oggetti di metadati orfani, l'aggiornamento non procede. Per procedere con l'aggiornamento, pulite questi oggetti di metadati orfani.Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. Esempio di output:
{ "id": "schemaInconsistencyCheck", "title": "Schema inconsistencies resulting from file removal or corruption", "status": "OK", "description": "Error: Following tables show signs that either table datadir directory or frm file was removed/corrupted. Please check server logs, examine datadir to detect the issue and fix it before upgrade", "detectedProblems": [ { "level": "Error", "dbObject": "test.schemaInconsistencyCheck_failure", "description": "present in INFORMATION_SCHEMA's INNODB_SYS_TABLES table but missing from TABLES table" } ] }
Il precontrollo riporta che la
test.schemaInconsistencyCheck_failure
tabella contiene metadati incoerenti. In questo caso, la tabella esiste nei metadati del motore di archiviazione InnoDB (information_schema.INNODB_SYS_TABLES
), ma non nei metadati MySQL ().information_schema.TABLES
Precontrolli Aurora MySQL che segnalano errori
I seguenti controlli preliminari sono specifici di Aurora MySQL:
- Controllo Aurora DDLRecovery
-
Livello di precontrollo: errore
Verifica la presenza di artefatti relativi alla funzione di ripristino Aurora DDL
Come parte dell'implementazione di ripristino DDL (Data Definition Language) in Aurora MySQL, i metadati sulle istruzioni DDL in volo vengono mantenuti nelle tabelle e nello schema.
ddl_log_md_table
ddl_log_table
mysql
L'implementazione di Aurora del ripristino DDL non è supportata dalla versione 3 in poi, poiché la funzionalità fa parte della nuova implementazione di Atomic DataDictionary in MySQL 8.0. Se durante i controlli di compatibilità sono in esecuzione delle istruzioni DDL, questo precontrollo potrebbe non riuscire. Si consiglia di provare l'aggiornamento mentre non è in esecuzione alcuna istruzione DDL. Se questo precontrollo fallisce senza alcuna istruzione DDL in esecuzione, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. Se sono in esecuzione delle istruzioni DDL, l'output del precheck stampa il seguente messaggio:
“There are DDL statements in process. Please allow DDL statements to finish before upgrading.”
Esempio di output:
{ "id": "auroraCheckDDLRecovery", "title": "Check for artifacts related to Aurora DDL recovery feature", "status": "OK", "description": "Aurora implementation of DDL recovery is not supported from 3.x onwards. This check verifies that the database do not have artifacts realted to the feature", "detectedProblems": [ { "level": "Error", "dbObject": "mysql.ddl_log_md_table", "description": "Table mysql.ddl_log_md_table is not empty. Your database has pending DDL recovery operations. Reachout to AWS support for assistance." }, { "level": "Error", "dbObject": "mysql.ddl_log_table", "description": "Table mysql.ddl_log_table is not empty. Your database has pending DDL recovery operations. Reachout to AWS support for assistance." }, { "level": "Error", "dbObject": "information_schema.processlist", "description": "There are DDL statements in process. Please allow DDL statements to finish before upgrading." } ] }
Il precontrollo ha restituito un errore dovuto a un DDL in volo eseguito contemporaneamente ai controlli di compatibilità. Si consiglia di riprovare l'aggiornamento senza che venga eseguito. DDLs
- auroraCheckRdsUpgradePrechecksTable
-
Livello di precontrollo: errore
Verifica l'esistenza della tabella
mysql.rds_upgrade_prechecks
Si tratta di un controllo preliminare esclusivamente interno eseguito dal servizio RDS. Eventuali errori verranno gestiti automaticamente durante l'aggiornamento e possono essere tranquillamente ignorati.
Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. { "id": "auroraCheckRdsUpgradePrechecksTable", "title": "Check existence of mysql.rds_upgrade_prechecks table", "status": "OK", "detectedProblems": [] }
- aurora Check FODUpgrade
-
Livello di precontrollo: errore
Verifica la presenza di artefatti relativi alla funzione Aurora fast DDL
L'ottimizzazione Fast DDL è stata introdotta in modalità lab su Aurora MySQL versione 2 per migliorare l'efficienza di alcune operazioni DDL. In Aurora MySQL versione 3, la modalità lab è stata rimossa e l'implementazione Fast DDL è stata sostituita dalla funzionalità MySQL 8.0 denominata Instant DDL.
Prima dell'aggiornamento ad Aurora MySQL versione 3, tutte le tabelle che utilizzano Fast DDL in modalità lab dovranno essere ricostruite eseguendo il comando
OPTIMIZE TABLE
o per garantire la compatibilità con Aurora MySQL versione 3.ALTER TABLE ... ENGINE=InnoDB
Questo precontrollo restituisce un elenco di tali tabelle. Dopo che le tabelle restituite sono state ricostruite, è possibile riprovare a eseguire l'aggiornamento.
Esempio di output:
{ "id": "auroraFODUpgradeCheck", "title": "Check for artifacts related to Aurora fast DDL feature", "status": "OK", "description": "Aurora fast DDL is not supported from 3.x onwards. This check verifies that the database does not have artifacts related to the feature", "documentationLink": "https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.FastDDL.html#AuroraMySQL.Managing.FastDDL-v2", "detectedProblems": [ { "level": "Error", "dbObject": "test.test", "description": "Your table has pending Aurora fast DDL operations. Run 'OPTIMIZE TABLE <table name>' for the table to apply all the pending DDL updates. Then try the upgrade again." } ] }
Il precontrollo riporta che nella tabella sono presenti operazioni
test.test
Fast DDL in sospeso.Per consentire il proseguimento dell'aggiornamento, è possibile ricostruire la tabella, quindi ritentare l'aggiornamento.
Nota
Prima di ricostruire i tablespace, consulta le operazioni DDL online nella
documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. mysql> optimize table test.test; +-----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +-----------+----------+----------+-------------------------------------------------------------------+ | test.test | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.test | optimize | status | OK | +-----------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (0.04 sec)
Dopo aver ricostruito la tabella, il precontrollo ha esito positivo.
{ "id": "auroraFODUpgradeCheck", "title": "Check for artifacts related to Aurora fast DDL feature", "status": "OK", "detectedProblems": [] }
- auroraGetDanglingFulltextIndex
-
Livello di precontrollo: errore
Tabelle con riferimento all'indice pendente
FULLTEXT
Prima di MySQL 5.6.26, era possibile che, dopo aver eliminato un indice di ricerca completo, le colonne nascoste e quelle nascoste diventassero orfane.
FTS_DOC_ID
FTS_DOC_ID_INDEX
Per ulteriori informazioni, vedere Bug #76012.Se sono presenti tabelle create su versioni precedenti di MySQL in cui ciò si è verificato, l'aggiornamento ad Aurora MySQL versione 3 può fallire. Questo precontrollo verifica che nel cluster DB non esistano tali indici full-text orfani o «sospesi» prima dell'aggiornamento a MySQL 8.0. Se questo precontrollo fallisce, ricostruisci tutte le tabelle che contengono tali indici full-text sospesi.
Esempio di output:
{ "id": "auroraGetDanglingFulltextIndex", "title": "Tables with dangling FULLTEXT index reference", "status": "OK", "description": "Error: The following tables contain dangling FULLTEXT index which is not supported. It is recommended to rebuild the table before upgrade.", "detectedProblems": [ { "level": "Error", "dbObject": "test.table_with_fts_index", "description": "Table `test.table_with_fts_index` contains dangling FULLTEXT index. Kindly recreate the table before upgrade." } ] },
Il precontrollo riporta un errore per la
test.table_with_fts_index
tabella perché contiene un indice di testo completo sospeso. Per consentire il proseguimento dell'aggiornamento, ricostruite la tabella per ripulire le tabelle ausiliarie con indice full-text. UtilizzaOPTIMIZE TABLE test.table_with_fts_index
oALTER TABLE test.table_with_fts_index, ENGINE=INNODB
.Dopo aver ricostruito la tabella, il precontrollo viene superato.
{ "id": "auroraGetDanglingFulltextIndex", "title": "Tables with dangling FULLTEXT index reference", "status": "OK", "detectedProblems": [] },
- auroraUpgradeCheckForDatafilePathInconsistency
-
Livello di precontrollo: errore
Verifica l'eventuale presenza di incongruenze relative al
ibd
percorso del fileQuesto controllo preliminare si applica solo a Aurora MySQL versione 3.03.0 e precedenti. Se si verifica un errore con questo precontrollo, esegui l'aggiornamento a Aurora MySQL versione 3.04 o successiva.
Esempio di output:
{ "id": "auroraUpgradeCheckForDatafilePathInconsistency", "title": "Check for inconsistency related to ibd file path.", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForFtsSpaceIdZero
-
Livello di precontrollo: errore
Verifica la presenza di un indice di testo completo con ID di spazio pari a zero
In MySQL, quando si aggiunge un indice full-text a una
tabella InnoDB, vengono creati numerosi tablespace di indici ausiliari. A causa di un bug nelle versioni precedenti di MySQL, corretto nella versione 5.6.20, era possibile che queste tabelle di indici ausiliarie fossero state create nel tablespace di sistema , anziché nel proprio tablespace InnoDB. Se esistono tablespace ausiliarie di questo tipo, l'aggiornamento avrà esito negativo. Ricreate gli indici full-text menzionati nell'errore di precheck, quindi riprovate a eseguire l'aggiornamento.
Esempio di output:
{ "id": "auroraUpgradeCheckForFtsSpaceIdZero", "title": "Check for fulltext index with space id as zero", "status": "OK", "description": "The auxiliary tables of FTS indexes on the table are created in system table-space. Due to this DDL queries executed on MySQL8.0 shall cause database unavailability. To avoid that, drop and recreate all the FTS indexes on the table or rebuild the table using ALTER TABLE query before the upgrade.", "detectedProblems": [ { "level": "Error", "dbObject": "test.fts_space_zero_check", "description": " The auxiliary tables of FTS indexes on the table 'test.fts_space_zero_check' are created in system table-space due to https://bugs.mysql.com/bug.php?id=72132. In MySQL8.0, DDL queries executed on this table shall cause database unavailability. To avoid that, drop and recreate all the FTS indexes on the table or rebuild the table using ALTER TABLE query before the upgrade." } ] },
Il precontrollo riporta un errore per la
test.fts_space_zero_check
tabella, poiché nel tablespace di sistema sono presenti tabelle ausiliarie di ricerca full-text (FTS).Dopo aver eliminato e ricreato gli indici FTS associati a questa tabella, il precontrollo ha esito positivo.
Nota
Prima di ricostruire i tablespace, consulta Operazioni di partizionamento
nella documentazione di MySQL per comprendere gli effetti del blocco e dello spostamento dei dati sulle transazioni in primo piano. { "id": "auroraUpgradeCheckForFtsSpaceIdZero", "title": "Check for fulltext index with space id as zero", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForIncompleteXATransactions
-
Livello di precontrollo: errore
Verifica la presenza di transazioni XA in stato di preparazione
Durante l'esecuzione del processo di aggiornamento della versione principale, è essenziale che l'istanza DB Aurora MySQL versione 2 sia sottoposta a un arresto completo.
Ciò garantisce che tutte le transazioni vengano eseguite o ripristinate e che InnoDB abbia eliminato tutti i record del registro di annullamento. Poiché il rollback delle transazioni è necessario, se il database contiene transazioni XA in uno stato preparato, può impedire il proseguimento del clean shutdown. Per questo motivo, se vengono rilevate transazioni XA preparate, l'aggiornamento non potrà procedere finché non si interverrà per confermarle o ripristinarle. Per ulteriori informazioni sulla ricerca di transazioni XA in uno stato preparato utilizzando
XA RECOVER
, consulta le istruzioni SQL delle transazioni XA nella documentazione di MySQL. Per ulteriori informazioni sugli stati delle transazioni XA, consulta gli stati delle transazioni XA nella documentazione di MySQL. Esempio di output:
{ "id": "auroraUpgradeCheckForIncompleteXATransactions", "title": "Pre-checks for XA Transactions in prepared state.", "status": "OK", "description": "Your cluster currently has XA transactions in the prepared state. To proceed with the upgrade, commit or rollback these transactions.", "detectedProblems": [ { "level": "Error", "dbObject": "all", "description": "Your cluster currently has XA transactions in the prepared state. To proceed with the upgrade, commit or rollback these transactions." } ] }
Questo precontrollo riporta un errore perché ci sono transazioni in uno stato preparato che devono essere eseguite o ripristinate.
Dopo aver effettuato l'accesso al database, puoi controllare la tabella information_schema.innodb_trx
e l'output per ulteriori informazioni. XA RECOVER
Importante
Prima di eseguire il commit o il rollback di una transazione, ti consigliamo di consultare la documentazione di MySQL
e i requisiti dell'applicazione. mysql> select trx_started, trx_mysql_thread_id, trx_id,trx_state, trx_operation_state, trx_rows_modified, trx_rows_locked from information_schema.innodb_trx; +---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+ | trx_started | trx_mysql_thread_id | trx_id | trx_state | trx_operation_state | trx_rows_modified | trx_rows_locked | +---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+ | 2024-08-12 01:09:39 | 0 | 2849470 | RUNNING | NULL | 1 | 0 | +---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+ 1 row in set (0.00 sec) mysql> xa recover; +----------+--------------+--------------+--------+ | formatID | gtrid_length | bqual_length | data | +----------+--------------+--------------+--------+ | 1 | 6 | 0 | xatest | +----------+--------------+--------------+--------+ 1 row in set (0.00 sec)
In questo caso, ripristiniamo la transazione preparata.
mysql> XA ROLLBACK 'xatest'; Query OK, 0 rows affected (0.00 sec) v mysql> xa recover; Empty set (0.00 sec)
Dopo il rollback della transazione XA, il precontrollo ha esito positivo.
{ "id": "auroraUpgradeCheckForIncompleteXATransactions", "title": "Pre-checks for XA Transactions in prepared state.", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForInstanceLimit
-
Livello di precontrollo: errore
Verifica se l'aggiornamento è supportato nella classe di istanza corrente
L'esecuzione di un aggiornamento sul posto da Aurora MySQL versione 2.12.0 o 2.12.1, in cui la classe di istanza Writer DB è db.r6i.32xlarge, attualmente non è supportata. In questo caso, il precontrollo restituisce un errore. Per consentire il proseguimento dell'aggiornamento, puoi modificare la classe dell'istanza DB in db.r6i.24xlarge o inferiore. Oppure puoi eseguire l'aggiornamento ad Aurora MySQL versione 2.12.2 o successiva, dove l'aggiornamento in loco ad Aurora MySQL versione 3 è supportato su db.r6i.32xlarge.
Esempio di output:
{ "id": "auroraUpgradeCheckForInstanceLimit", "title": "Checks if upgrade is supported on the current instance class", "status": "OK", "description": "Upgrade from Aurora Version 2.12.0 and 2.12.1 may fail for 32.xl and above instance class.", "detectedProblems": [ { "level": "Error", "dbObject": "all", "description": "Upgrade is not supported on this instance size for Aurora MySql Version 2.12.1. Before upgrading to Aurora MySql 3, please consider either: 1. Changing the instance class to 24.xl or lower. -or- 2. Upgrading to patch version 2.12.2 or higher." } ] },
Il precontrollo restituisce un errore perché l'istanza Writer DB utilizza la classe di istanza db.r6i.32xlarge ed è in esecuzione su Aurora MySQL versione 2.12.1.
- auroraUpgradeCheckForInternalUsers
-
Livello di precontrollo: errore
Verifica la presenza di utenti interni 8.0
Questo controllo preliminare si applica solo a Aurora MySQL versione 3.03.0 e precedenti. Se si verifica un errore con questo precontrollo, esegui l'aggiornamento a Aurora MySQL versione 3.04 o successiva.
Esempio di output:
{ "id": "auroraUpgradeCheckForInternalUsers", "title": "Check for 8.0 internal users.", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForMasterUser
-
Livello di precontrollo: errore
Verifica se esiste un utente principale RDS
MySQL 8 ha aggiunto un nuovo modello di privilegi con supporto per i ruoli e i privilegi dinamici
per rendere la gestione dei privilegi più semplice e dettagliata. Come parte di questa modifica, Aurora MySQL ha introdotto il nuovo rds_superuser_role
, che viene automaticamente concesso all'utente principale del database al momento dell'aggiornamento da Aurora MySQL versione 2 alla versione 3.Per ulteriori informazioni sui ruoli e i privilegi assegnati all'utente master in Aurora MySQL, vedere. Privilegi dell'account utente master Per ulteriori informazioni sul modello di privilegi basato sui ruoli in Aurora MySQL versione 3, vedere. Privilegio basato sui ruoli
Questo precontrollo verifica che l'utente principale esista nel database. Se l'utente principale non esiste, il precontrollo ha esito negativo. Per consentire il proseguimento dell'aggiornamento, ricreate l'utente master reimpostando la password dell'utente principale o creando manualmente l'utente. Quindi riprova a eseguire l'aggiornamento. Per ulteriori informazioni sulla reimpostazione della password dell'utente principale, vedere. Modifica della password per l'utente master del database
Esempio di output:
{ "id": "auroraUpgradeCheckForMasterUser", "title": "Check if master user exists", "status": "OK", "description": "Throws error if master user has been dropped!", "documentationLink": "https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.MasterAccounts.html", "detectedProblems": [ { "level": "Error", "dbObject": "all", "description": "Your Master User on host '%' has been dropped. To proceed with the upgrade, recreate the master user `reinvent` on default host '%'" } ] }
Dopo aver reimpostato la password dell'utente principale, il precontrollo verrà superato e potrai riprovare a eseguire l'aggiornamento.
L'esempio seguente utilizza il AWS CLI per reimpostare la password. Le modifiche alla password vengono applicate immediatamente.
aws rds modify-db-cluster \ --db-cluster-identifier
my-db-cluster
\ --master-user-passwordmy-new-password
Quindi il precontrollo ha esito positivo.
{ "id": "auroraUpgradeCheckForMasterUser", title": "Check if master user exists", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForPrefixIndexOnGeometryColumns
-
Livello di precontrollo: errore
Verifica la presenza di colonne geometriche negli indici dei prefissi
A partire da MySQL
8.0.12, non è più possibile creare un indice con prefisso su una colonna utilizzando il tipo di dati GEOMETRY. Per ulteriori informazioni, vedere WL #11808. Se esistono indici di questo tipo, l'aggiornamento avrà esito negativo. Per risolvere il problema, elimina gli
GEOMETRY
indici con prefisso nelle tabelle menzionate nell'errore di precontrollo.Esempio di output:
{ "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns", "title": "Check for geometry columns on prefix indexs", "status": "OK", "description": "Consider dropping the prefix Indexes of geometry columns and restart the upgrade.", "detectedProblems": [ { "level": "Error", "dbObject": "test.geom_index_prefix", "description": "Table `test`.`geom_index_prefix` has an index `LatLon` on geometry column/s. Mysql 8.0 does not support this type of index on a geometry column https://dev.mysql.com/worklog/task/?id=11808. To upgrade to MySQL 8.0, Run 'DROP INDEX `LatLon` ON `test`.`geom_index_prefix`;" } ] }
Il precontrollo riporta un errore perché la
test.geom_index_prefix
tabella contiene un indice con un prefisso su unaGEOMETRY
colonna.Dopo aver eliminato questo indice, il precontrollo ha esito positivo.
{ "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns", "title": "Check for geometry columns on prefix indexs", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForSpecialCharactersInProcedures
-
Livello di precontrollo: errore
Verificare l'eventuale presenza di incongruenze relative ai caratteri speciali nelle procedure memorizzate
Prima di MySQL 8.0, i nomi dei database, i nomi delle tabelle e altri oggetti corrispondevano ai file nella directory dei dati, ovvero ai metadati basati su file. Come parte dell'aggiornamento a MySQL 8.0, tutti gli oggetti del database vengono migrati nelle nuove tabelle interne del dizionario dei dati che vengono archiviate nello schema per supportare
mysql
l'Atomic Data Dictionary appena implementato.Come parte della migrazione delle stored procedure, la definizione e il corpo della procedura per ciascuna procedura vengono convalidati man mano che vengono inseriti nel nuovo dizionario di dati. Prima di MySQL 8, in alcuni casi era possibile creare routine memorizzate, o inserire direttamente nella tabella, procedure che
mysql.proc
contenevano caratteri speciali. Ad esempio, era possibile creare una stored procedure che contenesse un commento con il carattere di spazio non conforme e non divisibile.\xa0
Se viene rilevata una di queste procedure, l'aggiornamento non riesce.Questo precontrollo verifica che i corpi e le definizioni delle stored procedure non contengano tali caratteri. Per consentire il proseguimento dell'aggiornamento, ricreate queste stored procedure senza caratteri nascosti o speciali.
Esempio di output:
{ "id": "auroraUpgradeCheckForSpecialCharactersInProcedures", "title": "Check for inconsistency related to special characters in stored procedures.", "status": "OK", "description": "Following procedure(s) has special characters inconsistency.", "detectedProblems": [ { "level": "Error", "dbObject": "information_schema.routines", "description": "Data Dictionary Metadata is inconsistent for the procedure `get_version_proc` in the database `test` due to usage of special characters in procedure body. To avoid that, drop and recreate the procedure without any special characters before proceeding with the Upgrade." } ] }
Il precheck riporta che il cluster DB contiene una procedura chiamata
get_version_proc
neltest
database che contiene caratteri speciali nel corpo della procedura.Dopo aver eliminato e ricreato la stored procedure, il precontrollo ha esito positivo e consente di procedere con l'aggiornamento.
{ "id": "auroraUpgradeCheckForSpecialCharactersInProcedures", "title": "Check for inconsistency related to special characters in stored procedures.", "status": "OK", "detectedProblems": [] },
- auroraUpgradeCheckForSysSchemaObjectTypeMismatch
-
Livello di precontrollo: errore
Verifica che il tipo di oggetto non corrisponda allo schema
sys
Lo schema sys
è un insieme di oggetti e viste in un database MySQL che aiuta gli utenti a risolvere i problemi, ottimizzare e monitorare le proprie istanze DB. Quando si esegue un aggiornamento della versione principale da Aurora MySQL versione 2 alla versione 3, le viste sys
dello schema vengono ricreate e aggiornate alle nuove definizioni di Aurora MySQL versione 3.Come parte dell'aggiornamento, se alcuni oggetti
sys
dello schema vengono definiti utilizzando motori di archiviazione (sys_config/BASE TABLE
in INFORMATION_SCHEMA.TABLES), anziché viste, l'aggiornamento avrà esito negativo. Tali tabelle sono disponibili nella tabella. information_schema.tables
Questo non è un comportamento previsto, ma in alcuni casi può verificarsi a causa di un errore dell'utente.Questo precontrollo convalida tutti gli oggetti
sys
dello schema per garantire che utilizzino le definizioni di tabella corrette e che le viste non vengano erroneamente definite come tabelle InnoDB o MyISAM. Per risolvere il problema, correggi manualmente gli oggetti restituiti rinominandoli o eliminandoli. Quindi riprova a eseguire l'aggiornamento.Esempio di output:
{ "id": "auroraUpgradeCheckForSysSchemaObjectTypeMismatch", "title": "Check object type mismatch for sys schema.", "status": "OK", "description": "Database contains objects with type mismatch for sys schema.", "detectedProblems": [ { "level": "Error", "dbObject": "sys.waits_global_by_latency", "description": "Your object sys.waits_global_by_latency has a type mismatch. To fix the inconsistency we recommend to rename or remove the object before upgrading (use RENAME TABLE command). " } ] }
Il precheck riporta che la vista sys.waits_global_by_latency
sys
nello schema presenta una mancata corrispondenza di tipo che impedisce il proseguimento dell'aggiornamento.Dopo aver effettuato l'accesso all'istanza DB, puoi vedere che questo oggetto è definito come una tabella InnoDB, quando dovrebbe essere una vista.
mysql> show create table sys.waits_global_by_latency\G *************************** 1. row *************************** Table: waits_global_by_latency Create Table: CREATE TABLE `waits_global_by_latency` ( `events` varchar(128) DEFAULT NULL, `total` bigint(20) unsigned DEFAULT NULL, `total_latency` text, `avg_latency` text, `max_latency` text ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
Per risolvere questo problema possiamo eliminare e ricreare la vista con la definizione corretta
o rinominarla. Durante il processo di aggiornamento, verrà creata automaticamente con la definizione di tabella corretta. mysql> RENAME TABLE sys.waits_global_by_latency to sys.waits_global_by_latency_old; Query OK, 0 rows affected (0.01 sec)
Dopo aver fatto ciò, il precontrollo passa.
{ "id": "auroraUpgradeCheckForSysSchemaObjectTypeMismatch", "title": "Check object type mismatch for sys schema.", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckForViewColumnNameLength
-
Livello di precontrollo: errore
Controlla il limite superiore per il nome della colonna visualizzata
La lunghezza massima consentita del nome di colonna
in MySQL è di 64 caratteri. Prima di MySQL 8.0, in alcuni casi era possibile creare una vista con un nome di colonna più grande di 64 caratteri. Se sull'istanza del database sono presenti viste di questo tipo, viene restituito un errore di precontrollo e l'aggiornamento avrà esito negativo. Per consentire il proseguimento dell'aggiornamento, è necessario ricreare le viste in questione, assicurandosi che la lunghezza delle colonne sia inferiore a 64 caratteri. Quindi riprova a eseguire l'aggiornamento. Esempio di output:
{ "id": "auroraUpgradeCheckForViewColumnNameLength", "title": "Check for upperbound limit related to column name in view.", "status": "OK", "description": "Following view(s) has column(s) with length greater than 64.", "detectedProblems": [ { "level": "Error", "dbObject": "test.colname_view_test.col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad", "description": "View `test`.`colname_view_test`has column `col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad` with invalid column name length. To avoid Upgrade errors, view should be altered by renaming the column name so that its length is not 0 and doesn't exceed 64." } ] }
Il precontrollo riporta che la
test.colname_view_test
vista contiene una colonnacol2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad
che supera la lunghezza massima consentita della colonna di 64 caratteri.Guardando la definizione della vista, possiamo vedere la colonna offensiva.
mysql> desc `test`.`colname_view_test`; +------------------------------------------------------------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------------------------------------------------+-------------+------+-----+---------+-------+ | col1 | varchar(20) | YES | | NULL | | | col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad | int(11) | YES | | NULL | | +------------------------------------------------------------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
Per consentire l'aggiornamento di procedere, ricrea la vista, assicurandoti che la lunghezza della colonna non superi i 64 caratteri.
mysql> drop view `test`.`colname_view_test`; Query OK, 0 rows affected (0.01 sec) mysql> create view `test`.`colname_view_test`(col1, col2_nopad) as select inf, fodcol from test; Query OK, 0 rows affected (0.01 sec) mysql> desc `test`.`colname_view_test`; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | col1 | varchar(20) | YES | | NULL | | | col2_nopad | int(11) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
Dopo aver eseguito questa operazione, il precontrollo ha esito positivo.
{ "id": "auroraUpgradeCheckForViewColumnNameLength", "title": "Check for upperbound limit related to column name in view.", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckIndexLengthLimitOnTinyColumns
-
Livello di precontrollo: errore
Verifica la presenza di tabelle con indici definiti con una lunghezza del prefisso superiore a 255 byte su colonne minuscole
Quando si crea un indice su una colonna utilizzando un tipo di dati binario
in MySQL, è necessario aggiungere una lunghezza del prefisso nella definizione dell'indice. Prima di MySQL 8.0, in alcuni casi era possibile specificare una lunghezza del prefisso maggiore della dimensione massima consentita per tali tipi di dati. Un esempio è TINYTEXT
andTINYBLOB
columns, in cui la dimensione massima consentita dei dati è di 255 byte, ma erano consentiti prefissi di indice più grandi di questa. Per ulteriori informazioni, consulta i limiti di InnoDB nella documentazionedi MySQL. Se questo precontrollo fallisce, elimina l'indice incriminato o riduci la lunghezza del prefisso
TINYTEXT
e delleTINYBLOB
colonne dell'indice a meno di 255 byte. Quindi riprova a eseguire l'aggiornamento.Esempio di output:
{ "id": "auroraUpgradeCheckIndexLengthLimitOnTinyColumns", "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny columns", "status": "OK", "description": "Prefix length of the indexes defined on tiny columns cannot exceed 255 bytes. With utf8mb4 char set, this limits the prefix length supported upto 63 characters only. A larger prefix length was allowed in MySQL5.7 using innodb_large_prefix parameter. This parameter is deprecated in MySQL 8.0.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html, https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html", "detectedProblems": [ { "level": "Error", "dbObject": "test.tintxt_prefixed_index.col1", "description": "Index 'PRIMARY' on tinytext/tinyblob column `col1` of table `test.tintxt_prefixed_index` is defined with prefix length exceeding 255 bytes. Reduce the prefix length to <=255 bytes depending on character set used. For utf8mb4, it should be <=63." } ] }
Il precontrollo riporta un errore per la
test.tintxt_prefixed_index
tabella, poiché ha un indicePRIMARY
con un prefisso maggiore di 255 byte su una colonna TINYTEXT o TINYBLOB.Guardando la definizione di questa tabella, possiamo vedere che la chiave primaria ha un prefisso 65 sulla colonna.
TINYTEXT
col1
Poiché la tabella è definita utilizzando il set diutf8mb4
caratteri, che memorizza 4 byte per carattere, il prefisso supera il limite di 255 byte.mysql> show create table `test`.`tintxt_prefixed_index`\G *************************** 1. row *************************** Table: tintxt_prefixed_index Create Table: CREATE TABLE `tintxt_prefixed_index` ( `col1` tinytext NOT NULL, `col2` tinytext, `col_id` tinytext, PRIMARY KEY (`col1`(65)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC 1 row in set (0.00 sec)
La modifica del prefisso dell'indice su 63 durante l'utilizzo del set di
utf8mb4
caratteri consentirà di procedere con l'aggiornamento.mysql> alter table `test`.`tintxt_prefixed_index` drop PRIMARY KEY, ADD PRIMARY KEY (`col1`(63)); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
Dopo aver eseguito questa operazione, il precontrollo ha esito positivo.
{ "id": "auroraUpgradeCheckIndexLengthLimitOnTinyColumns", "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny columns", "status": "OK", "detectedProblems": [] }
- auroraUpgradeCheckMissingInnodbMetadataForMysqlHostTable
-
Livello di precontrollo: errore
Verifica l'incoerenza dei metadati InnoDB mancanti per la tabella
mysql.host
Si tratta di un controllo preliminare solo interno eseguito dal servizio RDS. Eventuali errori verranno gestiti automaticamente durante l'aggiornamento e possono essere tranquillamente ignorati.
Se riscontri errori con questo precontrollo, apri un caso con AWS Support
per richiedere che l'incoerenza dei metadati venga risolta. In alternativa, puoi riprovare l'aggiornamento eseguendo un dump logico, quindi eseguendo il ripristino su un nuovo cluster DB Aurora MySQL versione 3. - auroraUpgradeCheckForInvalidUtf8 mb3 ColumnComments
-
Livello di precontrollo: errore
Verifica la presenza di commenti non validi nella colonna utf8mb3
Questo precontrollo identifica le tabelle che contengono commenti di colonna con codifica dei caratteri utf8mb3 non valida. In MySQL 8.0, viene applicata una convalida più rigorosa alla codifica dei caratteri nei metadati, inclusi i commenti delle colonne. Se un commento di colonna contiene caratteri che non sono validi nel set di caratteri utf8mb3, l'aggiornamento avrà esito negativo.
La causa più comune di questo problema è la presenza di caratteri non BMP (Basic Multilingual Plane) nei commenti delle colonne. I caratteri non BMP richiedono la codifica UTF-8 a 4 byte (utf8mb4), ma utf8mb3 supporta solo sequenze a 3 byte, che non possono rappresentare questi caratteri.
Per risolvere questo problema, è necessario modificare i commenti delle colonne per rimuovere o sostituire eventuali caratteri non BMP prima di tentare l'aggiornamento. È possibile utilizzare l'
ALTER TABLE
istruzione per aggiornare i commenti della colonna.Esempio di output:
{ "id": "auroraUpgradeCheckForInvalidUtf8mb3ColumnComments", "title": "Check for invalid utf8mb3 column comments.", "status": "OK", "description": "Following table(s) has/have invalid utf8mb3 comments on the column/columns.", "detectedProblems": [ { "level": "Error", "dbObject": "test.t2", "description": "Table test.t2 has invalid utf8mb3 comments in it's column/columns. This is due to non-BMP characters in the comment field. To fix the inconsistency, we recommend you to modify comment fields to not use non-BMP characters and try the upgrade again." } ] }
Il precontrollo riporta che la
test.t2
tabella contiene caratteri utf8mb3 non validi in uno o più commenti di colonna, in particolare a causa della presenza di caratteri non BMP.Per risolvere questo problema, è possibile identificare le colonne problematiche e aggiornarne i commenti. Innanzitutto, esamina la struttura della tabella per identificare le colonne con commenti:
mysql> SHOW CREATE TABLE test.t2\G
Dopo aver identificato le colonne con commenti problematici, aggiornale utilizzando l'
ALTER TABLE
istruzione. Per esempio:mysql> ALTER TABLE test.t2 MODIFY COLUMN column_name data_type COMMENT 'Updated comment without non-BMP characters';
In alternativa, puoi rimuovere completamente il commento:
mysql> ALTER TABLE test.t2 MODIFY COLUMN column_name data_type COMMENT '';
Dopo aver aggiornato tutti i commenti delle colonne problematiche, il precontrollo verrà superato e l'aggiornamento potrà procedere:
{ "id": "auroraUpgradeCheckForInvalidUtf8mb3ColumnComments", "title": "Check for invalid utf8mb3 column comments.", "status": "OK", "detectedProblems": [] }
Nota
Prima di modificare i commenti delle colonne, assicuratevi che qualsiasi codice dell'applicazione o documentazione che si basa su questi commenti venga aggiornato di conseguenza. Prendete in considerazione la migrazione al set di caratteri utf8mb4 per un migliore supporto Unicode se l'applicazione richiede caratteri non BMP.
Avvisi
I seguenti precontrolli generano avvisi quando il precontrollo fallisce, ma l'aggiornamento può continuare.
Precontrolli MySQL che segnalano avvisi
I seguenti controlli preliminari provengono da Community MySQL:
- defaultAuthenticationPlugin
-
Livello di precontrollo: avviso
Nuove considerazioni sul plug-in di autenticazione predefinito
In MySQL 8.0, è stato introdotto
caching_sha2_password
il plug-in di autenticazione, che fornisce una crittografia delle password più sicura e prestazioni migliori rispetto al plug-in obsoleto.mysql_native_password
Per Aurora MySQL versione 3, il plug-in di autenticazione predefinito utilizzato per gli utenti del database è il plug-in.mysql_native_password
Questo precontrollo avverte che questo plugin verrà rimosso e l'impostazione predefinita verrà modificata in una futura versione principale. Valuta la possibilità di valutare la compatibilità dei client e degli utenti delle applicazioni prima di questa modifica.
Per ulteriori informazioni, consulta i problemi e le soluzioni di compatibilità con caching_sha2_password
nella documentazione di MySQL. Esempio di output:
{ "id": "defaultAuthenticationPlugin", "title": "New default authentication plugin considerations", "description": "Warning: The new default authentication plugin 'caching_sha2_password' offers more secure password hashing than previously used 'mysql_native_password' (and consequent improved client connection authentication). However, it also has compatibility implications that may affect existing MySQL installations. If your MySQL installation must serve pre-8.0 clients and you encounter compatibility issues after upgrading, the simplest way to address those issues is to reconfigure the server to revert to the previous default authentication plugin (mysql_native_password). For example, use these lines in the server option file:\n\n[mysqld]\ndefault_authentication_plugin=mysql_native_password\n\nHowever, the setting should be viewed as temporary, not as a long term or permanent solution, because it causes new accounts created with the setting in effect to forego the improved authentication security.\nIf you are using replication please take time to understand how the authentication plugin changes may impact you.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues\nhttps://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication" },
- maxdbFlagCheck
-
Livello di precontrollo: avviso
Utilizzo di una bandiera obsoleta
MAXDB
sql_mode
In MySQL 8.0, sono state rimosse diverse opzioni di variabili di sistema sql_mode obsolete
, una delle quali era. MAXDB
Questo controllo preliminare esamina tutte le sessioni attualmente connesse, insieme alle routine e ai trigger, per garantire che nessuna sia impostata su alcuna combinazione che includa.sql_mode
MAXDB
Esempio di output:
{ "id": "maxdbFlagCheck", "title": "Usage of obsolete MAXDB sql_mode flag", "status": "OK", "description": "Warning: The following DB objects have the obsolete MAXDB option persisted for sql_mode, which will be cleared during the upgrade. It can potentially change the datatype DATETIME into TIMESTAMP if it is used inside object's definition, and this in turn can change the behavior in case of dates earlier than 1970 or later than 2037. If this is a concern, please redefine these objects so that they do not rely on the MAXDB flag before running the upgrade.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals", "detectedProblems": [ { "level": "Warning", "dbObject": "test.maxdb_stored_routine", "description": "PROCEDURE uses obsolete MAXDB sql_mode", "dbObjectType": "Routine" } ] }
Il precheck riporta che la
test.maxdb_stored_routine
routine contiene un'opzione non supportatasql_mode
.Dopo aver effettuato l'accesso al database, è possibile visualizzare la definizione di routine che contiene.
sql_mode
MAXDB
> SHOW CREATE PROCEDURE test.maxdb_stored_routine\G *************************** 1. row *************************** Procedure: maxdb_stored_routine sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER Create Procedure: CREATE DEFINER="msandbox"@"localhost" PROCEDURE "maxdb_stored_routine"() BEGIN SELECT * FROM test; END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
Per risolvere il problema, ricrea la procedura dopo aver impostato quella corretta
sql_mode
sul client.Nota
Secondo la documentazione di MySQL
, MySQL memorizza le impostazioni in vigore quando una sql_mode
routine viene creata o modificata. Esegue sempre la routine con questa impostazione, indipendentemente dall'impostazione al momento dell'avvio dellasql_mode
routine.Prima di modificare
sql_mode
, consulta le modalità SQL del servernella documentazione di MySQL. Valuta attentamente qualsiasi potenziale impatto di questa operazione sulla tua applicazione. Ricrea la procedura senza elementi non
sql_mode
supportati.mysql > set sql_mode='PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql > DROP PROCEDURE test.maxdb_stored_routine\G Query OK, 0 rows affected (0.00 sec) mysql > mysql > DELIMITER $$ mysql > mysql > CREATE PROCEDURE test.maxdb_stored_routine() -> SQL SECURITY DEFINER -> BEGIN -> SELECT * FROM test; -> END$$ Query OK, 0 rows affected (0.00 sec) mysql > mysql > DELIMITER ; mysql > show create procedure test.maxdb_stored_routine\G *************************** 1. row *************************** Procedure: maxdb_stored_routine sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE Create Procedure: CREATE DEFINER="msandbox"@"localhost" PROCEDURE "maxdb_stored_routine"() BEGIN SELECT * FROM test; END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)
Il precontrollo ha esito positivo.
{ "id": "maxdbFlagCheck", "title": "Usage of obsolete MAXDB sql_mode flag", "status": "OK", "detectedProblems": [] }
- mysqlDollarSignNameCheck
-
Livello di precontrollo: avviso
Verifica l'uso obsoleto dei simboli del singolo dollaro nei nomi degli oggetti
A partire da MySQL
8.0.32, l'uso del simbolo del dollaro $
() come primo carattere di un identificatore non quotato è obsoleto. Se sono presenti schemi, tabelle, viste, colonne o routine che contengono un come primo carattere, questo precontrollo restituisce un avviso.$
Sebbene questo avviso non impedisca il proseguimento dell'aggiornamento, ti consigliamo di agire subito per risolvere il problema. Da MySQL8.4 qualsiasi identificatore di questo tipo restituirà un errore di sintassi anziché un avviso. Esempio di output:
{ "id": "mysqlDollarSignNameCheck", "title": "Check for deprecated usage of single dollar signs in object names", "status": "OK", "description": "Warning: The following objects have names with deprecated usage of dollar sign ($) at the begining of the identifier. To correct this warning, ensure, that names starting with dollar sign, also end with it, similary to quotes ($example$). ", "detectedProblems": [ { "level": "Warning", "dbObject": "test.$deprecated_syntx", "description": " name starts with $ sign." } ] },
Il precontrollo riporta un avviso perché la
$deprecated_syntx
tabella nellotest
schema contiene un$
come primo carattere. - reservedKeywordsCheck
-
Livello di precontrollo: avviso
Utilizzo di oggetti di database con nomi in conflitto con nuove parole chiave riservate
Questo controllo è simile al routineSyntaxCheck, in quanto verifica l'utilizzo di oggetti di database con nomi in conflitto con nuove parole chiave riservate. Sebbene non blocchino gli aggiornamenti, è necessario valutare attentamente gli avvisi.
Esempio di output:
Utilizzando l'esempio precedente con la tabella denominata
except
, il precontrollo restituisce un avviso:{ "id": "reservedKeywordsCheck", "title": "Usage of db objects with names conflicting with new reserved keywords", "status": "OK", "description": "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.", "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html", "detectedProblems": [ { "level": "Warning", "dbObject": "test.except", "description": "Table name", "dbObjectType": "Table" } ] }
Questo avviso segnala che potrebbero esserci alcune domande relative all'applicazione da esaminare. Se le query dell'applicazione non escono correttamente dalle stringhe letterali
, potrebbero verificarsi degli errori dopo l'aggiornamento a MySQL 8.0. Esamina le tue applicazioni per confermarle, testale con un clone o un'istantanea del cluster Aurora MySQL DB in esecuzione sulla versione 3. Esempio di una query applicativa senza escape che avrà esito negativo dopo l'aggiornamento:
SELECT * FROM escape;
Esempio di una query applicativa con escape corretto che avrà esito positivo dopo l'aggiornamento:
SELECT * FROM 'escape';
- Controllo UTF8 MB3
-
Livello di precontrollo: avviso
Utilizzo del set di
utf8mb3
caratteriIn MySQL 8.0
utf8mb3
il set di caratteri è obsoleto e verrà rimosso in una futura versione principale di MySQL. Questo precontrollo è implementato per generare un avviso se vengono rilevati oggetti di database che utilizzano questo set di caratteri. Anche se ciò non impedirà il proseguimento dell'aggiornamento, consigliamo vivamente di prendere in considerazione la migrazione delle tabelle al set diutf8mb4
caratteri, che è l'impostazione predefinita a partire da MySQL 8.0. Per ulteriori informazioni su utf8mb3 e utf8mb4, vedere Conversione tra set di caratteri Unicode a 3 e 4 byte nella documentazione di MySQL. Esempio di output:
{ "id": "utf8mb3", "title": "Usage of utf8mb3 charset", "status": "OK", "description": "Warning: The following objects use the deprecated utf8mb3 character set. It is recommended to convert them to use utf8mb4 instead, for improved Unicode support. The utf8mb3 character is subject to removal in the future.", "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html", "detectedProblems": [ { "level": "Warning", "dbObject": "test.t1.col1", "description": "column's default character set: utf8", "dbObjectType": "Column" }, { "level": "Warning", "dbObject": "test.t1.col2", "description": "column's default character set: utf8", "dbObjectType": "Column" } ] }
Per risolvere questo problema, ricostruite gli oggetti e le tabelle a cui si fa riferimento. Per ulteriori informazioni e prerequisiti prima di procedere, consulta Conversione tra set di caratteri Unicode a 3 e 4 byte nella documentazione
di MySQL. - zeroDatesCheck
-
Livello di precontrollo: avviso
Zero valori di data, datetime e timestamp
MySQL ora applica regole più rigide per quanto riguarda l'uso di valori zero nelle colonne date, datetime e timestamp. Si consiglia di utilizzare le
NO_ZERO_DATE SQL
modalitàNO_ZERO_IN_DATE
and insieme astrict
mode, poiché verranno unite astrict
mode in una futura versione di MySQL.Se l'
sql_mode
impostazione per una qualsiasi delle connessioni al database, al momento dell'esecuzione del precontrollo, non include queste modalità, viene generato un avviso nel precontrollo. Gli utenti potrebbero comunque essere in grado di inserire valori di data, datetime e timestamp contenenti valori zero. Tuttavia, consigliamo vivamente di sostituire i valori zero con valori validi, poiché il loro comportamento potrebbe cambiare in futuro e potrebbero non funzionare correttamente. Poiché si tratta di un avviso, non bloccherà gli aggiornamenti, ma ti consigliamo di iniziare a pianificare le azioni necessarie.Esempio di output:
{ "id": "zeroDatesCheck", "title": "Zero Date, Datetime, and Timestamp values", "status": "OK", "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.", "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/", "detectedProblems": [ { "level": "Warning", "dbObject": "global.sql_mode", "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" }, { "level": "Warning", "dbObject": "session.sql_mode", "description": " of 10 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" } ] }
Aurora MySQL precontrolli che segnalano gli avvisi
I seguenti controlli preliminari sono specifici di Aurora MySQL:
- auroraUpgradeCheckForRollbackSegmentHistoryLength
-
Livello di precontrollo: avviso
Verifica se la lunghezza dell'elenco della cronologia dei segmenti di rollback per il cluster è elevata
Come indicato in auroraUpgradeCheckForIncompleteXATransactions, durante l'esecuzione del processo di aggiornamento della versione principale, è essenziale che l'istanza DB Aurora MySQL versione 2 venga arrestata da zero.
Ciò garantisce che tutte le transazioni vengano eseguite o ripristinate e che InnoDB abbia eliminato tutti i record del registro di annullamento. Se il tuo cluster DB ha un'elevata lunghezza dell'elenco della cronologia dei segmenti di rollback (HLL), può prolungare il tempo impiegato da InnoDB per completare l'eliminazione dei record di registro degli annullamenti, con conseguenti tempi di inattività prolungati durante il processo di aggiornamento della versione principale. Se il precontrollo rileva che l'HLL sul cluster DB è elevato, genera un avviso. Sebbene ciò non impedisca il proseguimento dell'aggiornamento, ti consigliamo di monitorare attentamente l'HLL sul tuo cluster DB. Mantenerlo a livelli bassi riduce i tempi di inattività necessari durante l'aggiornamento di una versione principale. Per ulteriori informazioni sul monitoraggio di HLL, vedere. La lunghezza dell'elenco della cronologia di InnoDB è aumentata in modo significativo
Esempio di output:
{ "id": "auroraUpgradeCheckForRollbackSegmentHistoryLength", "title": "Checks if the rollback segment history length for the cluster is high", "status": "OK", "description": "Rollback Segment History length is greater than 1M. Upgrade may take longer time.", "detectedProblems": [ { "level": "Warning", "dbObject": "information_schema.innodb_metrics", "description": "The InnoDB undo history list length('trx_rseg_history_len') is 82989114. Upgrade may take longer due to purging of undo information for old row versions." } ] }
Il precontrollo restituisce un avviso perché ha rilevato che l'HLL di annullamento di InnoDB era alto nel cluster di database (82989114). Sebbene l'aggiornamento proceda, a seconda della quantità di annullamenti da eliminare, può prolungare i tempi di inattività necessari durante il processo di aggiornamento.
Ti consigliamo di esaminare le transazioni aperte sul tuo cluster DB prima di eseguire l'aggiornamento in produzione, per assicurarti che l'HLL mantenga una dimensione gestibile.
- auroraUpgradeCheckForUncommittedRowModifications
-
Livello di precontrollo: avviso
Verifica se ci sono molte modifiche non confermate alle righe
Come indicato in auroraUpgradeCheckForIncompleteXATransactions, durante l'esecuzione del processo di aggiornamento della versione principale, è essenziale che l'istanza DB Aurora MySQL versione 2 venga arrestata da zero.
Ciò garantisce che tutte le transazioni vengano eseguite o ripristinate e che InnoDB abbia eliminato tutti i record del registro di annullamento. Se il tuo cluster DB ha transazioni che hanno modificato un gran numero di righe, può prolungare il tempo impiegato da InnoDB per completare un rollback di questa transazione come parte del processo di chiusura pulita. Se il precontrollo rileva transazioni di lunga durata, con un gran numero di righe modificate sul cluster DB, genera un avviso. Sebbene ciò non impedisca il proseguimento dell'aggiornamento, ti consigliamo di monitorare attentamente la dimensione delle transazioni attive sul tuo cluster DB. Mantenerlo a livelli bassi riduce i tempi di inattività necessari durante l'aggiornamento di una versione principale.
Esempio di output:
{ "id": "auroraUpgradeCheckForUncommittedRowModifications", "title": "Checks if there are many uncommitted modifications to rows", "status": "OK", "description": "Database contains uncommitted row changes greater than 10M. Upgrade may take longer time.", "detectedProblems": [ { "level": "Warning", "dbObject": "information_schema.innodb_trx", "description": "The database contains 11000000 uncommitted row change(s) in 1 transaction(s). Upgrade may take longer due to transaction rollback." } ] },
Il precheck riporta che il cluster DB contiene una transazione con 11.000.000 di modifiche di riga senza commit che dovranno essere ripristinate durante il processo di chiusura completa. L'aggiornamento continuerà, ma per ridurre i tempi di inattività durante il processo di aggiornamento, si consiglia di monitorarlo e analizzarlo prima di eseguire l'aggiornamento sui cluster di produzione.
Per visualizzare le transazioni attive sulla tua istanza Writer DB, puoi utilizzare la tabella information_schema.innodb_trx
. La seguente query sull'istanza Writer DB mostra le transazioni correnti, il tempo di esecuzione, lo stato e le righe modificate per il cluster DB. # Example of uncommitted transaction mysql> SELECT trx_started, TIME_TO_SEC(TIMEDIFF(now(), trx_started)) AS seconds_trx_has_been_running, trx_mysql_thread_id AS show_processlist_connection_id, trx_id, trx_state, trx_rows_modified AS rows_modified FROM information_schema.innodb_trx; +---------------------+------------------------------+--------------------------------+----------+-----------+---------------+ | trx_started | seconds_trx_has_been_running | show_processlist_connection_id | trx_id | trx_state | rows_modified | +---------------------+------------------------------+--------------------------------+----------+-----------+---------------+ | 2024-08-12 18:32:52 | 1592 | 20041 | 52866130 | RUNNING | 11000000 | +---------------------+------------------------------+--------------------------------+----------+-----------+---------------+ 1 row in set (0.01 sec) # Example of transaction rolling back mysql> SELECT trx_started, TIME_TO_SEC(TIMEDIFF(now(), trx_started)) AS seconds_trx_has_been_running, trx_mysql_thread_id AS show_processlist_connection_id, trx_id, trx_state, trx_rows_modified AS rows_modified FROM information_schema.innodb_trx; +---------------------+------------------------------+--------------------------------+----------+--------------+---------------+ | trx_started | seconds_trx_has_been_running | show_processlist_connection_id | trx_id | trx_state | rows_modified | +---------------------+------------------------------+--------------------------------+----------+--------------+---------------+ | 2024-08-12 18:32:52 | 1719 | 20041 | 52866130 | ROLLING BACK | 10680479 | +---------------------+------------------------------+--------------------------------+----------+--------------+---------------+ 1 row in set (0.01 sec)
Dopo il commit o il rollback della transazione, il precontrollo non restituisce più un avviso. Consulta la documentazione di MySQL e il tuo team applicativo prima di eseguire il rollback di transazioni di grandi dimensioni, poiché il completamento del rollback può richiedere del tempo, a seconda delle dimensioni della transazione.
{ "id": "auroraUpgradeCheckForUncommittedRowModifications", "title": "Checks if there are many uncommitted modifications to rows", "status": "OK", "detectedProblems": [] },
Per ulteriori informazioni sull'ottimizzazione della gestione delle transazioni InnoDB e sul potenziale impatto dell'esecuzione e del rollback di transazioni di grandi dimensioni sulle istanze del database MySQL, vedere Ottimizzazione della gestione delle transazioni InnoDB
nella documentazione MySQL.
Note
Il seguente precontrollo genera un avviso quando il precontrollo fallisce, ma l'aggiornamento può procedere.
- sqlModeFlagVerificare
-
Livello di precontrollo: Avviso
Utilizzo di bandiere obsolete
sql_mode
Inoltre
MAXDB
, sono state rimossesql_mode
diverse altre opzioni: DB2
,,,MSSQL
MYSQL323
,MYSQL40
,ORACLE
,POSTGRESQL
NO_FIELD_OPTIONS
NO_KEY_OPTIONS
, e.NO_TABLE_OPTIONS
A partire da MySQL 8.0, nessuno di questi valori può essere assegnato alla variabile di sistema.sql_mode
Se questo precontrollo rileva sessioni aperte che utilizzano questesql_mode
impostazioni, assicurati che l'istanza DB e i gruppi di parametri del cluster DB, nonché le applicazioni e le configurazioni client, siano aggiornati per disabilitarle.- Per ulteriori informazioni, consulta la documentazione di MySQL.Esempio di output:
{ "id": "sqlModeFlagCheck", "title": "Usage of obsolete sql_mode flags", "status": "OK", "detectedProblems": [] }
Per risolvere uno di questi errori di precontrollo, vedere. maxdbFlagCheck
Errori, avvertenze o avvisi
Il seguente precontrollo può restituire un errore, un avviso o un avviso a seconda dell'output del precontrollo.
- checkTableOutput
-
Livello di precontrollo: errore, avviso o avviso
Problemi segnalati dal comando
check table x for upgrade
Prima di iniziare l'aggiornamento ad Aurora MySQL versione 3,
check table for upgrade
viene eseguito su ogni tabella degli schemi utente del cluster DB. Questo precontrollo non è lo stesso di Schema. checkTableMysqlIl
check table for upgrade
comando esamina le tabelle per individuare eventuali problemi che potrebbero insorgere durante l'aggiornamento a una versione più recente di MySQL. L'esecuzione di questo comando prima di tentare un aggiornamento può aiutare a identificare e risolvere eventuali incompatibilità in anticipo, rendendo più agevole l'effettivo processo di aggiornamento.Questo comando esegue diversi controlli su ogni tabella, come i seguenti:
-
Verifica della compatibilità della struttura della tabella e dei metadati con la versione di MySQL di destinazione
-
Verifica della presenza di eventuali funzionalità obsolete o rimosse utilizzate dalla tabella
-
Garantire che la tabella possa essere aggiornata correttamente senza perdita di dati
A differenza di altri controlli preliminari, può restituire un errore, un avviso o un avviso a seconda dell'
check table
output. Se questo precontrollo restituisce delle tabelle, esaminale attentamente, insieme al codice restituito e al messaggio prima di iniziare l'aggiornamento. Per ulteriori informazioni, vedere l'istruzione CHECK TABLEnella documentazione di MySQL. Qui forniamo un esempio di errore e un esempio di avviso.
Esempio di errore:
{ "id": "checkTableOutput", "title": "Issues reported by 'check table x for upgrade' command", "status": "OK", "detectedProblems": [ { "level": "Error", "dbObject": "test.parent", "description": "Table 'test.parent' doesn't exist" } ] },
Il precontrollo riporta un errore indicante che la
test.parent
tabella non esiste.Il
mysql-error.log
file per l'istanza Writer DB mostra che c'è un errore di chiave esterna.2024-08-13T15:32:10.676893Z 62 [Warning] InnoDB: Load table `test`.`parent` failed, the table has missing foreign key indexes. Turn off 'foreign_key_checks' and try again. 2024-08-13T15:32:10.676905Z 62 [Warning] InnoDB: Cannot open table test/parent from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.
Accedi all'istanza Writer DB ed
show engine innodb status\G
eseguila per ottenere maggiori informazioni sull'errore della chiave esterna.mysql> show engine innodb status\G *************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 2024-08-13 15:33:33 0x14ef7b8a1700 INNODB MONITOR OUTPUT ===================================== . . . ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2024-08-13 15:32:10 0x14ef6dbbb700 Error in foreign key constraint of table test/child: there is no index in referenced table which would contain the columns as the first columns, or the data types in the referenced table do not match the ones in table. Constraint: , CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`) The index in the foreign key in table is p_name_idx Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html for correct foreign key definition. . .
Il
LATEST FOREIGN KEY ERROR
messaggio segnala che il vincolo di chiavefk_pname
esterna nellatest.child
tabella, che fa riferimento allatest.parent
tabella, presenta un indice mancante o una mancata corrispondenza del tipo di dati. La documentazione MySQL sui vincoli di chiave esternaafferma che le colonne a cui si fa riferimento in una chiave esterna devono avere un indice associato e le colonne padre/figlio devono utilizzare lo stesso tipo di dati. Per verificare se ciò è correlato a una mancata corrispondenza dell'indice o del tipo di dati, accedi al database e controlla le definizioni della tabella disabilitando temporaneamente la variabile di sessione foreign_key_checks.
Dopo averlo fatto, possiamo vedere che il vincolo secondario in question () fk_pname
utilizza per fare riferimento alla tabella principale.p_name varchar(20) CHARACTER SET latin1 DEFAULT NULL
name varchar(20) NOT NULL
La tabella principale utilizzaDEFAULT CHARSET=utf8
, ma lap_name
colonna della tabella secondaria utilizzalatin1
, quindi viene generato l'errore di mancata corrispondenza del tipo di dati.mysql> show create table parent\G ERROR 1146 (42S02): Table 'test.parent' doesn't exist mysql> show create table child\G *************************** 1. row *************************** Table: child Create Table: CREATE TABLE `child` ( `id` int(11) NOT NULL, `p_name` varchar(20) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`), KEY `p_name_idx` (`p_name`), CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> set foreign_key_checks=0; Query OK, 0 rows affected (0.00 sec) mysql> show create table parent\G *************************** 1. row *************************** Table: parent Create Table: CREATE TABLE `parent` ( `name` varchar(20) NOT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql> show create table child\G *************************** 1. row *************************** Table: child Create Table: CREATE TABLE `child` ( `id` int(11) NOT NULL, `p_name` varchar(20) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`), KEY `p_name_idx` (`p_name`), CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
Per risolvere questo problema, possiamo modificare la tabella figlio in modo che utilizzi lo stesso set di caratteri della tabella principale oppure modificare la tabella principale per utilizzare lo stesso set di caratteri della tabella figlio. Qui, poiché la tabella secondaria utilizza esplicitamente
latin1
nella definizione dellap_name
colonna,ALTER TABLE
eseguiamo la modifica del set di caratteri inutf8
.mysql> alter table child modify p_name varchar(20) character set utf8 DEFAULT NULL; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> flush tables; Query OK, 0 rows affected (0.01 sec)
Dopo averlo fatto, il precontrollo viene superato e l'aggiornamento può procedere.
Esempio di avviso:
{ "id": "checkTableOutput", "title": "Issues reported by 'check table x for upgrade' command", "status": "OK", "detectedProblems": [ { "level": "Warning", "dbObject": "test.orders", "description": "Trigger test.orders.delete_audit_trigg does not have CREATED attribute." } ] }
Il precontrollo riporta un avviso per il
delete_audit_trigg
trigger sullatest.orders
tabella perché non ha unCREATED
attributo. In base a Checking version compatibilitynella documentazione di MySQL, questo messaggio è informativo e viene stampato per i trigger creati prima di MySQL 5.7.2. Poiché si tratta di un avviso, non impedisce il proseguimento dell'aggiornamento. Tuttavia, se desideri risolvere il problema, puoi ricreare il trigger in questione e il precontrollo ha esito positivo senza avvisi.
{ "id": "checkTableOutput", "title": "Issues reported by 'check table x for upgrade' command", "status": "OK", "detectedProblems": [] },
-