Warum verwendet meine Amazon RDS für Oracle DB-Instance mehr Speicher als erwartet?

Lesedauer: 4 Minute
0

Meine Amazon Relational Database Service (Amazon RDS) für MySQL-DB-Instance belegt mehr Speicherplatz als erwartet. Warum passiert das und wie kann ich den Festplattenspeicher optimieren?

Behebung

Sie können die FreeStorageSpace Amazon CloudWatch-Metrik verwenden, um den verfügbaren Speicherplatz für eine RDS-DB-Instance zu überwachen. FreeStorageSpace beschreibt jedoch nicht, wie die DB-Instance Speicherplatz verbraucht.

Verwenden Sie die folgenden Strategien, um Speicherplatz zurückzugewinnen:

Führen Sie TABELLE OPTIMIEREN aus

Tabellen belegen einen Teil des Speicherplatzes, der nicht aktiv genutzt wird, aber Amazon RDS weist diesen Speicherplatz den Tabellen trotzdem zu. Wenn innodb_file_per_table aktiviert ist (standardmäßig aktiviert), können Sie diesen Speicherplatz mit TABELLE OPTIMIEREN zurückgewinnen. OPTIMIZE TABLE funktioniert für InnoDB-, MyISAM- und ARCHIVE-Tabellen. Amazon RDS akzeptiert zwar den Befehl TABELLE OPTIMIEREN, führt aber stattdessen den Befehl TABELLE ÄNDERN... ERZWINGEN aus. In diesem Fall erhalten Sie eine Warnmeldung, die der folgenden ähnelt: „Die Tabelle unterstützt die Optimierung nicht, sondern führt stattdessen neu erstellen + analysieren.“ Weitere Informationen finden Sie in der MySQL-Dokumentation zu TABELLE OPTIMIEREN.

Führen Sie eine Abfrage wie folgt aus, um nach Fragmentierung zu suchen:

SELECT
	table_name,
	data_length,
	max_data_length,
	index_length,
	data_free
FROM
	information_schema.tables
WHERE table_schema='schema_name'
;

Die Spalte data_free hebt die Menge an freiem Speicherplatz hervor, die einer Tabelle zugewiesen ist, die nicht aktiv genutzt wird. Möglicherweise können Sie diesen Speicherplatz zurückgewinnen, indem Sie **TABELLE OPTIMIEREN verwenden.**TABELLE OPTIMIEREN funktioniert, wenn die Tabelle gemäß der Amazon RDS-Standardkonfigurationseinstellung innodb_file_per_table in einem separaten Tablespace erstellt wird. Weitere Informationen finden Sie in der MySQL-Dokumentation für File-per-Table-Tablespaces.

Reduzieren Sie den Speicherplatz in Anwendungstabellen

Führen Sie eine Abfrage wie diese aus, um zu sehen, wie viel Speicherplatz von Anwendungstabellen auf Ihrer DB-Instance verwendet wird:

SELECT
	table_schema,
	SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
	SUM(data_length)/1024/1024 AS data_mb,
	SUM(index_length)/1024/1024 AS index_mb,
	SUM(data_free)/1024/1024 AS free_mb,
	COUNT(*) AS tables,
	CURDATE() AS today
FROM
	information_schema.tables
	GROUP BY table_schema
	ORDER BY 2 DESC
;

Führen Sie eine Abfrage wie diese aus, um die größte Anwendungstabelle auf Ihrer DB-Instance zu finden:

SELECT
	table_schema,
	table_name,
	(data_length + index_length + data_free)/1024/1024 AS total_mb,
	(data_length)/1024/1024 AS data_mb,
	(index_length)/1024/1024 AS index_mb,
	(data_free)/1024/1024 AS free_mb,
	CURDATE() AS today
FROM
	information_schema.tables
	ORDER BY 3 DESC
;

**Hinweis:**Der Gesamtspeicher, der von einer einzelnen Datenbank und Tabelle verwendet wird, kann nicht berechnet werden, wenn die Datenbank Tabellen mit Spalten variabler Länge enthält, die länger als 768 Byte sind. Dazu gehören beispielsweise BLOB, TEXT, VARCHAR oder VARBINARY.

Reduzieren Sie den Speicher für binäre Protokolle

Das Hinzufügen einer Read Replica bewirkt, dass das Binärlog der Quell-Instance zusätzlichen Speicherplatz beansprucht. Um herauszufinden, wie viel Speicherplatz das Binärlog auf der Quell-Instance verwendet, überprüfen Sie die CloudWatch-Metrik BinLogDiskUsage. Ein starkes Wachstum kann darauf hindeuten, dass ein oder mehrere Read Replicas nicht synchronisiert sind.

Reduzieren oder deaktivieren Sie die Speicherung von allgemeinen Protokollen und langsamen Abfrageprotokollen

Wenn Sie die Logparameter General Log und Slow Query Log deaktivieren, beginnt Ihre Instance, diese Protokolle zu speichern. Es speichert auch die Backups dieser Protokolle. Informationen zur Rotation dieser Dateien und zur Steuerung der Festplattennutzung finden Sie unter mysql.rds_rotate_general_log und mysql.rds_rotate_slow_log.

Hinweis: Schalten Sie die allgemeinen und langsamen Abfrageprotokolle aus, wenn Sie sie nicht aktiv zur Fehlerbehebung verwenden.

Verwaltung oder Reduzierung der Tablespace-Größe des InnoDB-Systems

Der System-Tablespace enthält das InnoDB-Datenwörterbuch und den Undo-Speicherplatz und beginnt bei 10 MB. Nach der Zuweisung von Speicherplatz hat die Datei immer mindestens diese Größe, obwohl Transaktionen mit langer Laufzeit mehr verfügbaren Speicherplatz beanspruchen können.

Standardmäßig setzt Amazon RDS innodb_file_per_table auf 1. Das bedeutet, dass die Daten für jeden Tablespace in einer eigenen .ibd-Datei gespeichert werden. Um Speicherplatz wiederherzustellen, der für verwandte Tabellen als wiederverwendbar markiert ist, verwenden Sie TABELLE OPTIMIEREN, um die Größe von Tablespace-Dateien pro Tabelle zu ändern, oder löschen Sie eine Tabelle.

Wenn innodb_file_per_table auf 0 gesetzt ist, werden alle Tabellen auch dem System-Tablespace zugewiesen. Das Löschen von Tabellen oder Indizes oder das Löschen oder Abschneiden von Daten aus Tabellen, die im System-Tablespace zugewiesen sind, kennzeichnet den zuvor belegten Speicherplatz als wiederverwendbar. Innodb\ _file\ _per\ _table gibt jedoch keinen Speicherplatz für das Dateisystem frei.

Da es nicht möglich ist, den System-Tablespace direkt zu verkleinern, exportieren Sie die Daten Ihrer aktuellen Datenbank. Importieren Sie dann die Daten in eine neue Instance. Um Ausfallzeiten zu reduzieren, konfigurieren Sie Ihre neue MySQL-Instance als Replikat der Amazon RDS-Quell-Instance. Wenn das Replikat mit der Amazon RDS-Quell-Instance synchronisiert ist, wechseln Sie zur neuen Instance.

**Hinweis:**Das Wiederherstellen aus einem Snapshot oder das Erstellen einer Read Replica hilft Ihnen nicht dabei, Speicherplatz aus dem System-Tablespace wiederherzustellen. Dies liegt daran, dass beide Methoden einen Snapshot des Speichervolumes der Quell-Instance verwenden, das den System-Tablespace enthält.


Weitere Informationen

Amazon RDS-DB-Instance hat nur noch wenig Speicherplatz Ändern einer Amazon RDS-DB-Instance

Wie kann ich den Fehler „MySQL HA_ERR_RECORD_FILE_FULL“ beheben, wenn ich Amazon RDS für MySQL verwende?