Bekannte Probleme und Einschränkungen für MySQL in Amazon RDS - Amazon Relational Database Service

Bekannte Probleme und Einschränkungen für MySQL in Amazon RDS

Bekannte Fehler und Einschränkungen bei der Arbeit mit MySQL in Amazon RDS sind die Folgenden.

Inkonsistente Größe des InnoDB-Buffer-Pools

Für MySQL 5.7 gibt es aktuell einen Bug beim Verwalten der Größe des InnoDB-Buffer-Pools. MySQL 5.7 könnte den Wert des Parameters innodb_buffer_pool_size an einen großen Wert anpassen, was dazu führen kann, dass der InnoDB-Buffer-Pool zu groß wird und dadurch zu viel Arbeitsspeicher verbraucht. Dieser Effekt kann die Ausführung der MySQL-Datenbank-Engine beenden oder sie vom Hochfahren abhalten. Dieses Problem ist häufiger bei DB-Instance-Klassen vorhanden, die weniger Arbeitsspeicher zur Verfügung haben.

Setzen Sie den Wert des Parameters innodb_buffer_pool_size auf ein Vielfaches des Produkts der Parameterwerte innodb_buffer_pool_instances und innodb_buffer_pool_chunk_size, um das Problem zu beheben. Sie könnten beispielsweise den Parameterwert innodb_buffer_pool_size auf das achtfache des Produkts der Parameterwerte innodb_buffer_pool_instances und innodb_buffer_pool_chunk_size setzen, wie im folgenden Beispiel gezeigt.

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

Weitere Details zu diesem MySQL 5.7-Bug finden Sie unter https://bugs.mysql.com/bug.php?id=79379 in der MySQL-Dokumentation.

Index-Merge-Optimierung zeigt falsche Ergebnisse an

Abfragen über die Index-Merge-Optimierung führen aufgrund eines Fehlers im MySQL-Abfrageoptimierer, der in MySQL 5.5.37 eingeführt wurde, möglicherweise zu falschen Ergebnissen. Bei der Erstellung einer Tabelle mit mehreren Indizes scannt der Optimierer die Zeilenbereiche anhand der Indizes, führt jedoch keine korrekte Zusammenführung der Ergebnisse durch. Weitere Informationen zum Bug im Abfragenoptimierer finden Sie unter http://bugs.mysql.com/bug.php?id=72745 und http://bugs.mysql.com/bug.php?id=68194 in der MySQL-Bug-Datenbank.

Denken Sie beispielsweise an eine Abfrage für eine Tabelle mit zwei Indizes, wobei die Suchmuster auf die indizierten Spalten verweisen.

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

In diesem Fall durchsucht die Suchmaschine beide Indizes. Jedoch werden die zusammengeführten Informationen aufgrund des Programmfehlers unrichtig sein.

Um dieses Problem zu beheben, können Sie eine der folgenden Aktionen ausführen:

  • Stellen Sie den Parameter optimizer_switch in Ihrer DB-Parametergruppe für Ihre MySQL-DB-Instance auf index_merge=off ein. Weitere Informationen über das Einstellen von Parametern in DB-Parametergruppen finden Sie unter Arbeiten mit DB-Parametergruppen.

  • Führen Sie für Ihre MySQL-DB-Instance ein Upgrade auf MySQL-Version 5.6, 5.7 oder 8.0 durch. Weitere Informationen finden Sie unter Upgrade eines MySQL-DB-Snapshots.

  • Wenn Sie Ihre Instance nicht upgraden oder den Parameter optimizer_switch nicht ändern können, können Sie alternativ einen Index für die Abfrage explizit bestimmen, beispielsweise so:

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

Weitere Informationen finden Sie unter Index-Merge-Optimierung.

Protokolldateigröße

Für MySQL besteht ein Größenlimit für BLOBs, die im Redo-Log geschrieben werden. Um das Limit zu erfassen, stellen Sie sicher, dass der Parameter innodb_log_file_size für Ihre MySQL-DB-Instance zehnmal größer ist, als die größte BLOB-Datei in Ihren Tabellen, zuzüglich der Länge anderer Felder mit variabler Länge (VARCHAR, VARBINARY, TEXT) in den selben Tabellen. Weitere Informationen über das Einstellen von Parameterwerten finden Sie unter Arbeiten mit DB-Parametergruppen. Weitere Informationen zu Redo-Log-BLOB-Größenlimits finden Sie unter Changes in MySQL 5.6.20.

MySQL-Parameterausnahmen für Amazon RDS-DB-Instances

Einige MySQL-Parameter erfordern besondere Beachtung bei der Verwendung in einer Amazon RDS-DB-Instance.

lower_case_table_names

Da Amazon RDS ein System mit Groß- und Kleinschreibung verwendet, wird das Einstellen des Serverparameters lower_case_table_names auf 2 ("Namen werden wie gegeben gespeichert, aber in Kleinbuchstaben verglichen") nicht unterstützt. Nachfolgend sind die unterstützten Werte für Amazon RDS for MySQL DB-Instances aufgeführt:

  • 0 ("Namen werden wie bereitgestellt gespeichert und Vergleiche berücksichtigen Groß-/Kleinschreibung") wird für alle Amazon RDS for MySQL-Versionen unterstützt.

  • 1 ("Namen werden in Kleinbuchstaben gespeichert und Vergleiche berücksichtigen keine Groß-/Kleinschreibung") wird für Amazon RDS for MySQL-Version 5.5, -Version 5.6, -Version 5.7 und -Version 8.0.19 und höhere -8.0-Versionen unterstützt.

Der Parameter lower_case_table_names sollte als Teil einer benutzerdefinierten DB-Parametergruppe eingestellt werden, bevor eine DB-Instance erstellt wird. Sie sollten es vermeiden, den Parameter lower_case_table_names für bestehende Datenbanken zu ändern, da dies zu Unbeständigkeiten bei Backups für die zeitpunktbezogene Wiederherstellung und Lesereplikat-DB-Instances führen kann.

Lesereplikate sollten immer den selben lower_case_table_names-Parameterwert wie die Quell-DB-Instance verwenden.

long_query_time

Sie können den Parameter long_query_time auf einen Fließkommawert einstellen, was Ihnen ermöglicht, langsame Abfragen an den MySQL slow query log in Mikrosekunden-Auflösung zu protokollieren. Sie können einen Wert von z. B. 0,1 Sekunden einstellen (100 Millisekunden), um das Debuggen bei langsamen Transaktionen, die weniger als eine Sekunde dauern, zu erleichtern.

MySQL-Dateigrößenlimits in Amazon RDS

Bei MySQL-DB-Instances in Amazon RDS schränkt der maximal bereitgestellte Speicher die Tabellengröße auf maximal 16 TB ein, sofern InnoDB-Tabellenräume (innodb_file_per_table) verwendet werden. Dieses Limit beschränkt auch den Tabellenraum des Systems auf maximal 16 TB. Die Option "innodb_file_per_table", bei der für jede Tabelle ein eigener Tabellenraum angelegt wird, ist die Standardeinstellung für MySQL-DB-Instances in Amazon RDS.

Anmerkung

Einige existierende DB-Instances haben eine Untergrenze. Beispielsweise haben MySQL-DB-Instances, die vor April 2014 erstellt wurden, ein Datei- und Tabellenlimit von 2 TB. Dieses Dateilimit von 2 TB gilt auch für DB-Instances oder Lesereplikate, die aus DB-Snapshots erstellt wurden, die vor April 2014 gemacht wurden, unabhängig davon wann die DB-Instance erstellt wurde.

Die Option der InnoDB-Tabellenräumen (innodb_file_per_table) bietet abhängig von der Anwendung sowohl Vor- als auch Nachteile. Hilfe bei der Auswahl der besten Methode für Ihre Anwendung finden Sie unter File-Per-Table Tablespaces in der MySQL-Dokumentation.

Es wird nicht empfohlen, die Tabellen bis zur maximal möglichen Größe anwachsen zu lassen. Generell hat es sich bewährt, Daten in kleinere Tabellen zu partitionieren, wodurch sich die Leistung und die Wiederherstellungszeiten verbessern.

Eine Möglichkeit, mit der Sie eine große Tabelle in kleinere Tabellen aufteilen können, ist die Partitionierung. Bei der Partitionierung werden – basierend auf von Ihnen definierten Regeln – Teile der großen Tabelle auf separate Dateien verteilt. Wenn Sie beispielsweise Transaktionen nach Datum speichern, können Sie Partitionierungsregeln erstellen, mit denen ältere Transaktionen in separate Dateien partitioniert werden. Anschließend können Sie regelmäßig die historischen Transaktionsdaten archivieren, die für Ihre Anwendung nicht ständig verfügbar sein müssen. Weitere Informationen finden Sie unter Partitioning in der MySQL-Dokumentation.

So bestimmen Sie die Dateigröße einer Tabelle

  • Verwenden Sie den folgenden SQL-Befehl, um zu bestimmen, ob eine Ihrer Tabellen zu groß ist und evtl. partitioniert werden sollte.

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) As "Approximate size (MB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema');

So aktivieren Sie InnoDB-Datei-pro-Tabelle-Tabellenräume

  • Setzen Sie den Parameter innodb_file_per_table in der Parametergruppe für die DB-Instance auf 1, um „innodb_file_per_table“-Tabellenräume zu aktivieren.

So deaktivieren Sie InnoDB-Datei-pro-Tabelle-Tabellenräume

  • Setzen Sie den Parameter innodb_file_per_table in der Parametergruppe für die DB-Instance auf 0, um InnoDB-Datei-pro-Tabelle-Tabellenräume zu deaktivieren.

Weitere Informationen über das Updaten von Parametergruppen finden Sie unter Arbeiten mit DB-Parametergruppen.

Wenn Sie InnoDB-Datei-pro-Tabelle-Tabellenräume aktiviert oder deaktiviert haben, können Sie einen ALTER TABLE-Befehl ausführen, um eine Tabelle aus dem globalen Tabellenraum in ihren eigenen Tabellenraum zu verschieben, oder umgekehrt, ihren eigenen Tabellenraum in den globalen Tabellenraum, wie in folgenden Beispiel gezeigt wird:

ALTER TABLE table_name ENGINE=InnoDB;

MySQL Keyring-Plugin wird nicht unterstützt

Derzeit unterstützt Amazon RDS for MySQL das MySQL keyring_aws Amazon Web Services Keyring-Plugin nicht.