Problemi e limitazioni note per Amazon RDS for MySQL
I problemi e le limitazioni note per l’utilizzo di Amazon RDS for MySQL sono sotto riportarti.
Argomenti
Parola riservata InnoDB
InnoDB è una parola riservata per RDS per MySQL. Non è possibile utilizzare questo nome per un database MySQL.
Comportamento in caso di storage pieno per Amazon RDS for MySQL
Quando lo storage diventa pieno per un'istanza di database MySQL, possono verificarsi delle incongruenze di metadati, disallineamenti del dizionario e tabelle orfane. Per evitare questi problemi, Amazon RDS interrompe automaticamente un'istanza database che raggiunge lo stato storage-full.
Un'istanza MySQL database raggiunge lo stato storage-full nei seguenti casi:
-
L'istanza database ha meno di 20.000 MiB di storage e lo storage disponibile raggiunge almeno 200 MiB.
-
L'istanza database ha più di 102.400 MiB di storage e lo storage disponibile raggiunge 1024 MiB o meno.
-
L'istanza database ha tra 20.000 MiB e 102.400 MiB di storage e ha meno dell'1% di storage disponibile.
Dopo che Amazon RDS interrompe automaticamente un'istanza database perché ha raggiunto lo stato storage-full, è comunque possibile modificarla. Per riavviare l'istanza database, completa almeno una delle seguenti operazioni:
-
Modifica l'istanza database per abilitare il dimensionamento automatico dello storage.
Per ulteriori informazioni sul dimensionamento automatico dello storage, consulta Gestione della capacità automaticamente con Auto Scaling dello storage Amazon RDS.
-
Modifica l'istanza database per aumentarne la capacità di storage.
Per ulteriori informazioni sull'aumento della capacità di storage, consulta Aumento della capacità di storage dell'istanza database.
Dopo aver apportato una di queste modifiche, l'istanza database viene riavviata automaticamente. Per ulteriori informazioni sulla modifica di un'istanza di database, consulta Modifica di un'istanza database Amazon RDS.
Dimensione del pool di buffer Innodb incoerente
Per MySQL 5.7, esiste attualmente un bug nel modo in cui viene gestita la dimensione del pool di buffer InnoDB. MySQL 5.7 potrebbe regolare il valore del parametro innodb_buffer_pool_size in un valore maggiore che possa far sì che il pool di buffer InnoDB diventi troppo grande e utilizzi troppa memoria. Questo effetto può causare l'arresto del motore database MySQL o impedirne l'avvio. Questo problema è più comune per le classi di istanze database con meno memoria disponibile.
Per risolvere questo problema, impostare il valore del parametro innodb_buffer_pool_size su un multiplo del prodotto del valore del parametro innodb_buffer_pool_instances e del valore del parametro innodb_buffer_pool_chunk_size. Ad esempio, si potrebbe impostare il valore del parametro innodb_buffer_pool_size su un multiplo di otto volte del prodotto del valore del parametro innodb_buffer_pool_instances e innodb_buffer_pool_chunk_size, come mostrato nel seguente esempio.
innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184
Per informazioni dettagliate su questo bug di MySQL 5.7, consulta https://bugs.mysql.com/bug.php?id=79379
L'ottimizzazione dell'unione dell'indice restituisce risultati errati
Le query che utilizzano l’ottimizzazione dell’unione degli indici possono restituire risultati errati a causa di un bug nello strumento di ottimizzazione delle query MySQL introdotto in MySQL 5.5.37. Quando esegui una query su una tabella con più indici, lo strumento di ottimizzazione analizza gli intervalli di riga in base a più indici, ma non unisce i risultati correttamente. Per ulteriori informazioni sul bug di Query Optimizer, consulta http://bugs.mysql.com/bug.php?id=72745
Ad esempio, si consideri una query su una tabella con due indici in cui gli argomenti di ricerca fanno riferimento alle colonne indicizzate.
SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';
In questo caso, la ricerca verrà effettuata su entrambi gli indici. A causa del bug, tuttavia, i risultati uniti non sono corretti.
Per risolvere il problema, è possibile procedere in uno dei seguenti modi:
Imposta il parametro
optimizer_switchsuindex_merge=offnel gruppo di parametri di database per l'istanza di database MySQL. Per informazioni sull'impostazione dei parametri appartenenti a un gruppo di parametri di database, consulta Gruppi di parametri per Amazon RDS.-
Aggiorna l'istanza database MySQL a MySQL versione 5.7 o 8.0. Per ulteriori informazioni, consulta Aggiornamenti del motore di database RDS per MySQL.
-
Se non riesci ad aggiornare l'istanza o a modificare il parametro
optimizer_switch, puoi aggirare il bug identificando in modo esplicito un indice per la query, ad esempio:SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';
Per ulteriori informazioni, consulta Index merge optimization
Eccezioni dei parametri di MySQL per le istanze database Amazon RDS
Alcuni parametri MySQL richiedono considerazioni speciali quando vengono utilizzati con un'istanza database Amazon RDS.
lower_case_table_names
Poiché Amazon RDS usa un file system che fa distinzione tra maiuscole e minuscole, l'impostazione del valore del parametro server lower_case_table_names su 2 (nomi archiviati come dati ma confrontati in lettere minuscole) non è supportata. Di seguito sono riportati i valori supportati per le istanze database Amazon RDS for MySQL:
-
0 (nomi archiviati come dati e confronti con distinzione tra minuscole e maiuscole) è supportato per tutte le versioni di per MySQL.
-
1 (nomi memorizzati in minuscolo e confronti non fanno distinzione tra maiuscole e minuscole) è supportato per RDS per MySQL versione 5.7, versione 8.0.28, versioni successive alla 8.0 e versione 8.4.
Prima di creare un'istanza database, il parametro lower_case_table_names dovrebbe essere impostato come parte di un gruppo di parametri database personalizzato. Quindi, specificare il gruppo di parametri database personalizzato quando viene creata l'istanza database.
Quando un gruppo di parametri è associato a un'istanza database MySQL con una versione inferiore a 8.0, si consiglia di evitare di modificare il parametro lower_case_table_names nel gruppo di parametri. La modifica di questo valore potrebbe causare incoerenze con i backup di ripristino point-in-time (PITR) e le istanze database della replica di lettura.
Quando un gruppo di parametri è associato a un’istanza database MySQL versione 8.0 o 8.4, non è possibile modificare il parametro lower_case_table_names nel gruppo di parametri.
Le repliche di lettura dovrebbero sempre usare lo stesso valore del parametro lower_case_table_names in qualità di istanza DB di origine.
long_query_time
È possibile impostare il parametro long_query_time su un valore del punto variabile che consenta di registrare query lente nel log delle query lente MySQL con risoluzione al microsecondo. È possibile impostare un valore come 0,1 secondi, che sarebbe 100 millisecondi, per aiutare durante il debug delle transazioni lente che richiedono meno di un secondo.
Limiti delle dimensioni dei file MySQL in Amazon RDS
Per le istanze database MySQL versione 8.0 e successive, la dimensione massima del file è di 16 TiB. Quando si utilizzano tablespace file-per-table, le dimensioni massime del file limitano le dimensioni di una tabella InnoDB a 16 TiB. I tablespace file-per-table InnoDB (con ciascuna tabella nel relativo tablespace) sono impostati di default per le istanze database MySQL. Per ulteriori informazioni, consulta InnoDB Limits
Nota
Alcune istanze database esistenti hanno un limite inferiore. Ad esempio, le istanze database MySQL create prima di aprile 2014 hanno un limite di dimensioni di file e tabelle di 2 TB. Questo limite di 2 TB delle dimensioni si applica anche alle istanze database o alle repliche di lettura create da snapshot DB effettuati prima di aprile 2014, a prescindere dalla data di creazione dell'istanza database.
Ci sono vantaggi e svantaggi nell'utilizzare i tablespaces file-per-table InnoDB, a seconda dell'applicazione. Per stabilire l'approccio migliore per l'applicazione, consulta File-Per-Table Tablespaces
Non è consigliabile consentire alle tabelle di crescere fino alla dimensione massima del file. In generale, una pratica migliore consiste nel partizionare i dati in tabelle più piccole, che possano migliorare le prestazioni e i tempi di ripristino.
Un'opzione che è possibile utilizzare per suddividere una tabella di grandi dimensioni in tabelle più piccole è rappresentata dal partizionamento. Il partizionamento distribuisce porzioni della tabella di grandi dimensioni in file separati in base alle regole specificate. Ad esempio, se si archiviano le transazioni per data, è possibile creare regole di partizionamento che distribuiscono le transazioni meno recenti in file separati mediante il partizionamento. Quindi, periodicamente, è possibile archiviare i dati storici della transazione che non devono essere prontamente disponibili per l'applicazione. Per ulteriori informazioni, consulta Partitioning
Poiché non esiste un'unica tabella o vista di sistema che fornisca le dimensioni di tutte le tabelle e dello spazio tabella del sistema InnoDB, è necessario eseguire query su più tabelle per determinare la dimensione degli spazi tabella.
Determinazione della dimensione dello spazio tabella del sistema InnoDB e dello spazio tabella del dizionario dati
-
Utilizza il seguente comando SQL per stabilire se qualche spazio tabella supera le dimensioni consentite e può essere scelta per il partizionamento.
Nota
Il tablespace del dizionario dati è specifico di MySQL 8.0 e versioni successive.
select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE) /1024/1024/1024), 2) as "File Size (GB)" from information_schema.FILES where tablespace_name in ('mysql','innodb_system');
Determinazione della dimensione delle tabelle utente di InnoDB al di fuori dello spazio tabella del sistema InnoDB (per le versioni 5.7 di MySQL)
-
Utilizza il seguente comando SQL per stabilire se qualche tabella supera le dimensioni consentite e può essere scelta per il partizionamento.
SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
Determinazione della dimensione delle tabelle utente di InnoDB al di fuori del tablespace di sistema InnoDB (per MySQL 8.0 e versioni successive)
-
Utilizza il seguente comando SQL per stabilire se qualche tabella supera le dimensioni consentite e può essere scelta per il partizionamento.
SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_TABLESPACES ORDER BY 3 DESC;
Determinazione della dimensione delle tabelle utente non InnoDB
-
Utilizza il seguente comando SQL per stabilire se qualche tabella utente non InnoDB ha dimensioni eccessive.
SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH+DATA_FREE) / 1024 / 1024/ 1024), 2) As "Approximate size (GB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') and ENGINE<>'InnoDB';
Per abilitare gli spazi tabelle file-per-table InnoDB
-
Imposta il parametro innodb_file_per_table su
1nel gruppo di parametri dell'istanza database.
Per disabilitare gli spazi tabelle file-per-table InnoDB
-
Imposta il parametro innodb_file_per_table su
0nel gruppo di parametri dell'istanza database.
Per informazioni sull'aggiornamento di un gruppo di parametri database, consulta Gruppi di parametri per Amazon RDS.
Quando hai abilitato o disabilitato i tablespace file-per-table InnoDB, puoi inviare un ALTER
TABLE comando per spostare una tabella dal tablespace globale al proprio o viceversa, come mostrato nell'esempio seguente:
ALTER TABLE table_name TABLESPACE=innodb_file_per_table;
Plugin Keyring MySQL non supportato
Al momento, Amazon RDS per MySQL non supporta il plugin Keyring Amazon Web Services MySQL keyring_aws.
Porte personalizzate
Amazon RDS blocca le connessioni alla porta personalizzata 33060 per il motore MySQL. Scegli una porta diversa per il motore MySQL.
Limitazioni delle stored procedure di MySQL
Le stored procedure mysql.rds_kill e mysql.rds_kill_query non possono terminare sessioni o query di proprietà di utenti MySQL con nomi utente più lunghi di 16 caratteri nelle seguenti versioni di RDS per MySQL:
-
8.0.32 e versioni precedenti alla 8
-
5.7.41 e versioni precedenti alla 5.7
Replica basata su GTID con un'istanza di origine esterna
Amazon RDS supporta la replica basata su identificatori di transazione globali (GTID) da un’istanza MySQL esterna in un’istanza database Amazon RDS per MySQL che richiede l’impostazione del parametro GTID_PURGED durante la configurazione. Tuttavia, solo RDS per MySQL 8.0.37 e versioni successive supportano questa funzionalità.
Plugin di autenticazione MySQL predefinito
RDS per MySQL versione 8.0.34 e versioni successive alla 8.0 utilizzano il plugin mysql_native_password. Non è possibile modificare l'impostazione default_authentication_plugin.
RDS per MySQL versione 8.4 e versioni successive utilizzano caching_sha2_password come plugin di autenticazione predefinito. È possibile modificare il plugin di autenticazione predefinito per MySQL 8.4. Il plugin mysql_native_password funziona ancora in MySQL 8.4, ma il relativo supporto termina con questa versione di MySQL. Per modificare il plugin di autenticazione predefinito, creare un gruppo di parametri personalizzato e modificare il valore authentication_policy. Per ulteriori informazioni, consulta Gruppi di parametri predefiniti e personalizzati.
Sovrascrivere innodb_buffer_pool_size
Con classi di istanze database micro o piccole, il valore predefinito per il parametro innodb_buffer_pool_size potrebbe differire da quello restituito eseguendo questo comando:
mysql> SELECT @@innodb_buffer_pool_size;
Questa differenza può verificarsi quando Amazon RDS deve sovrascrivere il valore predefinito nell’ambito della gestione delle classi di istanze database. Se necessario, si può sovrascrivere il valore predefinito e impostarlo su un valore supportato dalla classe dell’istanza database. Per determinare un valore valido, aggiungi l’utilizzo della memoria e la memoria totale disponibile all’istanza database. Per ulteriori informazioni, consulta Tipi di istanza Amazon RDS
Se l’istanza database in uso ha solo 4 GB di memoria, non è possibile impostare il parametro innodb_buffer_pool_size su 8 GB, ma potrebbe essere possibile impostarlo su 3 GB, in base alle quantità di memoria allocata per altri parametri.
Se il valore immesso è troppo grande, Amazon RDS lo riduce ai seguenti limiti:
-
Classi di istanze database micro: 256 MB
-
Classi di istanze database db.t4g.micro: 128 MB
Aggiornamento da MySQL 5.7 a MySQL 8.4
Non è possibile eseguire l’aggiornamento direttamente da MySQL 5.7 a MySQL 8.4, ma è necessario eseguire prima l’aggiornamento da MySQL 5.7 a MySQL 8.0 e successivamente da MySQL 8.0 a MySQL 8.4. Per ulteriori informazioni, consulta Aggiornamenti a versioni principali per RDS per MySQL.
Compressione di pagine InnoDB
La compressione delle pagine InnoDB non funziona con le istanze database di Amazon RDS con una dimensione di blocco del file system di 16 KB perché tale dimensione deve essere inferiore a quella della pagina InnoDB. A partire da febbraio 2024, tutte le istanze database di nuova creazione hanno una dimensione di blocco del file system di 16 KB, che aumenta il throughput e riduce il consumo di IOPS durante lo svuotamento delle pagine.