Perché la mia istanza database Amazon RDS per MySQL utilizza più spazio di archiviazione del previsto?

5 minuti di lettura
0

La mia istanza database Amazon Relational Database Service (Amazon RDS) per MySQL utilizza più spazio del previsto. Perché si verifica questo problema e come posso ottimizzare l'archiviazione su disco?

Risoluzione

Puoi utilizzare il parametro FreeStorageSpace di Amazon CloudWatch per monitorare lo spazio di archiviazione disponibile per un'istanza database RDS. Il parametro FreeStorageSpace, tuttavia, non specifica il modo in cui l'istanza database utilizza lo spazio di archiviazione.

Per recuperare lo spazio di archiviazione, utilizza le strategie seguenti:

Eseguire OPTIMIZE TABLE

Amazon RDS assegna un determinato spazio di archiviazione alle tabelle, anche se tale spazio non viene attivamente utilizzato. Se innodb_file_per_table è attivato (per impostazione predefinita), puoi recuperare tale spazio tramite OPTIMIZE TABLE. È possibile utilizzare OPTIMIZE TABLE con le tabelle InnoDB, MyISAM e ARCHIVE. Amazon RDS accetta il comando OPTIMIZE TABLE, ma in realtà esegue ALTER TABLE...FORCE. In questo caso, viene visualizzato un messaggio di avviso simile al seguente: "La tabella non supporta l'ottimizzazione; si stanno eseguendo le attività di ricreazione e analisi". Per ulteriori informazioni, consulta la documentazione di MySQL relativa al comando OPTIMIZE TABLE.

Per verificare la frammentazione, esegui una query simile alla seguente:

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

La colonna data_free evidenzia la quantità di spazio disponibile allocato per una tabella ma non usato attivamente. Potresti riuscire a recuperare tale spazio tramite **OPTIMIZE TABLE.È possibile utilizzare **OPTIMIZE TABLE se la tabella viene creata in un tablespace separato, in base all'impostazione di configurazione predefinita innodb_file_per_table di Amazon RDS. Per ulteriori informazioni, consulta la documentazione di MySQL relativa a File-per-table tablespaces.

Ridurre lo spazio di archiviazione delle tabelle dell'applicazione

Per verificare lo spazio di archiviazione utilizzato dalle tabelle dell'applicazione nell'istanza database, esegui una query simile alla seguente:

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
;

Per individuare la tabella dell'applicazione più grande nell'istanza database, esegui una query simile alla seguente:

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
;

Nota: non è possibile calcolare lo spazio di archiviazione totale utilizzato da un singolo database e da una singola tabella se il database include tabelle con colonne di lunghezza variabile superiori a 768 byte. Ad esempio, ciò include BLOB, TEXT, VARCHAR o VARBINARY.

Ridurre lo spazio di archiviazione del log binario

L'aggiunta di una replica di lettura fa sì che il log binario dell'istanza di origine utilizzi spazio di archiviazione aggiuntivo. Per determinare la quantità di spazio di archiviazione utilizzata dal log binario sull'istanza di origine, verifica il parametro BinLogDiskUsage di CloudWatch. Una crescita elevata potrebbe indicare che una o più repliche di lettura non sono sincronizzate.

Ridurre o disattivare l'archiviazione del log generale e del log query lente

Quando disattivi i parametri del log generale e del log query lente, l'istanza inizia ad archiviare tali log e i relativi backup. Per ruotare questi file e controllare l'utilizzo del disco, consulta mysql.rds_rotate_general_log e mysql.rds_rotate_slow_log.

Nota: per risolvere il problema, disattiva il log generale e il log query lente quando non vengono utilizzati attivamente.

Gestire o ridurre le dimensioni del tablespace di sistema InnoDB

Il tablespace di sistema contiene il dizionario dei dati InnoDB e lo spazio di annullamento. La sua dimensione minima corrisponde a 10 MB. Dopo l'allocazione dello spazio, il file avrà sempre almeno tale dimensione, anche se le transazioni di lunga durata possono occupare più spazio di archiviazione disponibile.

Per impostazione predefinita, Amazon RDS imposta innodb_file_per_table su 1. Ciò significa che i dati di ogni tablespace vengono archiviati nel proprio file .ibd. Per recuperare lo spazio contrassegnato come riutilizzabile per le tabelle correlate, usa OPTIMIZE TABLE al fine di ridimensionare i file tablespace per tabella o eliminare una tabella.

Se innodb_file_per_table è impostato su 0, tutte le tabelle vengono allocate anche al tablespace di sistema. Con l'eliminazione di tabelle o indici e la cancellazione o il troncamento dei dati dalle tabelle allocate nel tablespace di sistema si contrassegna lo spazio precedentemente occupato come riutilizzabile. Tuttavia, innodb_file_per_table non libera spazio nel file system.

Dal momento che non è possibile ridurre lo spazio del tablespace di sistema sul posto, puoi esportare i dati del database corrente e importarli in una nuova istanza. Per ridurre i tempi di inattività, configura la nuova istanza MySQL come replica dell'istanza Amazon RDS di origine. Quando la replica è sincronizzata con l'istanza Amazon RDS di origine, passa alla nuova istanza.

Nota: il ripristino da uno snapshot o la creazione di una replica di lettura non consentono di recuperare spazio dal tablespace di sistema. Entrambi i metodi utilizzano infatti uno snapshot del volume di archiviazione dell'istanza di origine che contiene il tablespace di sistema.


Informazioni correlate

Mancanza di spazio di storage per l'istanza di database Amazon RDS Modifica di un'istanza database Amazon RDS

Come posso risolvere l'errore "MySQL HA_ERR_RECORD_FILE_FULL" quando utilizzo Amazon RDS per MySQL?