¿Por qué mi instancia de base de datos de Amazon RDS para Oracle utiliza más almacenamiento del esperado?

5 minutos de lectura
0

Mi instancia de base de datos Amazon Relational Database Service (Amazon RDS) para MySQL utiliza más espacio del esperado. ¿Por qué ocurre esto y cómo puedo optimizar el almacenamiento en disco?

Resolución

Puede utilizar la métrica FreeStorageSpace Amazon CloudWatch para supervisar el espacio de almacenamiento disponible para una instancia de base de datos de RDS. Sin embargo, FreeStorageSpace no describe cómo la instancia de base de datos consume almacenamiento.

Utilice las siguientes estrategias para recuperar espacio de almacenamiento:

Ejecutar OPTIMIZE TABLE

Las tablas consumen un poco de espacio que no se usa activamente, pero Amazon RDS asigna ese espacio a las tablas de todos modos. Si innodb_file_per_table está activado (está activado de forma predeterminada), puede recuperar ese espacio mediante OPTIMIZE TABLE. OPTIMIZE TABLE funciona para las tablas InnoDB, MyISAM y ARCHIVE. Si bien Amazon RDS acepta el comando OPTIMIZE TABLE, en realidad ejecuta el comando ALTER TABLE...FORCE en su lugar. Cuando esto ocurra, recibirá un mensaje de advertencia similar al siguiente: «La tabla no admite optimizar, sino recrear y analizar.» Para obtener más información, consulte la documentación de MySQL para OPTIMIZE TABLE.

Para comprobar la fragmentación, ejecute una consulta como esta:

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

La columna data_free resalta la cantidad de espacio libre asignado a una tabla que no está en uso activo. Es posible que pueda recuperar este espacio mediante **OPTIMIZE TABLE.**OPTIMIZE TABLE funciona si la tabla se crea en un espacio de tablas independiente, de acuerdo con la configuración predeterminada de innodb_file_per_table. Para obtener más información, consulte la documentación de MySQL sobre los espacios de tablas de archivos por tabla.

Reducir el almacenamiento de la tabla de aplicaciones

Para ver cuánto almacenamiento utilizan las tablas de aplicaciones de su instancia de base de datos, ejecute una consulta como esta:

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
;

Para localizar la tabla de aplicaciones más grande de su instancia de base de datos, ejecute una consulta como esta:

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: El almacenamiento total que utilizan una base de datos y una tabla individuales no se puede calcular si la base de datos incluye tablas con columnas de longitud variable que superan los 768 bytes de longitud. Por ejemplo, esto incluye BLOB, TEXT, VARCHAR o VARBINARY.

Reducir el almacenamiento de registros binarios

Agregar una réplica de lectura hace que el registro binario de la instancia de origen utilice almacenamiento adicional. Para saber cuánto espacio de almacenamiento utiliza el registro binario de la instancia de origen, compruebe la métrica BinLogDiskUsage de CloudWatch. Un crecimiento elevado puede indicar que una o más réplicas de lectura no están sincronizadas.

Reducir o desactivar el registro general y el almacenamiento del registro de consultas lentas

Al desactivar los parámetros de registro general y registro de consultas lentas, la instancia comienza a almacenar estos registros. También almacena las copias de seguridad de estos registros. Para rotar estos archivos y controlar el uso del disco, consulte mysql.rds_rotate_general_log y mysql.rds_rotate_slow_log.

Nota: Desactive los registros de consultas generales y lentas cuando no los utilice activamente para solucionar problemas.

Administrar o reducir el tamaño del espacio de tablas del sistema InnoDB

El espacio de tablas del sistema contiene el diccionario de datos de InnoDB y el espacio para deshacer, y comienza en 10 MB. Una vez asignado el espacio, el archivo siempre tendrá al menos ese tamaño, aunque las transacciones de larga duración pueden consumir más espacio de almacenamiento disponible.

De forma predeterminada, Amazon RDS establece innodb_file_per_table en 1. Esto significa que los datos de cada espacio de tablas se almacenan en su propio archivo .ibd. Para recuperar el espacio marcado como reutilizable para tablas relacionadas, utilice OPTIMIZE TABLE para cambiar el tamaño de los archivos del espacio de tablas por tabla o para eliminar una tabla.

Si innodb_file_per_table se establece en 0, todas las tablas también se asignan al espacio de tablas del sistema. Si se eliminan tablas o índices, o se borran o truncan los datos de las tablas asignadas en el espacio de tablas del sistema, se marca como reutilizable el espacio ocupado anteriormente. Sin embargo,innodb_file_per_table no libera espacio en el sistema de archivos.

Como no es posible reducir el espacio de tablas del sistema in situ, exporte los datos de la base de datos actual. A continuación, importe los datos a una nueva instancia. Para reducir el tiempo de inactividad, configure la nueva instancia de MySQL como una réplica de la instancia de Amazon RDS de origen. Cuando la réplica esté sincronizada con la instancia de Amazon RDS de origen, cambie a la nueva instancia.

Nota: Restaurar desde una instantánea o crear una réplica de lectura no le ayudará a recuperar espacio del espacio de tablas del sistema. Esto se debe a que ambos métodos utilizan una instantánea del volumen de almacenamiento de la instancia de origen que contiene el espacio de tablas del sistema.


Información relacionada

La instancia de base de datos de Amazon RDS se está quedando sin almacenamiento Modificación de una instancia de base de datos de Amazon RDS

¿Cómo puedo solucionar el error «MySQL HA_ERR_RECORD_FILE_FULL» al utilizar Amazon RDS para MySQL?