Saltar al contenido

¿Cómo puedo solucionar los problemas de una instancia de RDS para MySQL o MariaDB que muestre que el almacenamiento está lleno?

8 minutos de lectura
0

Quiero solucionar un problema en una instancia de Amazon Relational Database Service (Amazon RDS) para MySQL o MariaDB que muestre que el almacenamiento está lleno.

Descripción corta

Para solucionar problemas en una instancia de Amazon RDS para MySQL o MariaDB que muestre que el espacio de almacenamiento está lleno, comprueba el espacio total que se utiliza en la instancia de base de datos para identificar qué utiliza espacio. Puedes usar el espacio de la instancia de base de datos para los siguientes objetos:

  • Bases de datos creadas por usuarios
  • Tablas temporales
  • Registros binarios o registros de retransmisión de instancias en espera de MySQL (si usas una réplica de lectura)
  • Espacio de tablas InnoDB
  • Registros generales, registros de consultas lentas y registros de errores

Después de comprobar el espacio de almacenamiento e identificar qué es lo que lo está utilizando, puedes recuperar espacio. A continuación, puedes supervisar la métrica FreeStorageSpace para evitar más problemas de espacio de almacenamiento.

Nota: Si se produce una disminución repentina del almacenamiento disponible, ejecuta el comando SHOW FULL PROCESSLIST para comprobar las consultas en curso en el nivel de instancia de base de datos. El comando SHOW FULL PROCESSLIST proporciona información sobre todas las conexiones y las consultas activas de cada conexión. Para revisar las transacciones que han estado activas durante mucho tiempo, ejecuta el comando INFORMATION_SCHEMA.INNODB_TRX o SHOW ENGINE INNODB STATUS. A continuación, revisa el resultado.

Resolución

Para solucionar problemas en una instancia de Amazon RDS para MySQL o MariaDB que muestre que el almacenamiento está lleno, sigue estos pasos:

Comprobación del espacio total utilizado en la instancia de base de datos MySQL

Identifica el tamaño de cada base de datos creada por el usuario.

SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",1) AS DATABASE_NAME, ROUND((DATA_FREE/1024/1024/1024),3) AS 'REUSABLE (GB)', ROUND(SUM((TOTAL_EXTENTS * EXTENT_SIZE)/1024/1024/1024),3) AS 'TOTAL (GB)' FROM INFORMATION_SCHEMA.FILES GROUP BY DATABASE_NAME ORDER BY 'TOTAL (GB)'  DESC;

Comprueba el tamaño de cada tabla para la base de datos de usuarios que especifiques:
Nota: Sustituye example-database-name por el nombre de la base de datos.

SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",-1) as 'TABLE_NAME', ROUND((total_extents * extent_size)/1024/1024/1024,3) AS "TableSizeinGB" from information_schema.files WHERE FILE_NAME LIKE 'example-database-name';

Comprobación del espacio total que se utiliza en la instancia de MariaDB

Identifica el tamaño de cada base de datos creada por el usuario:

mysql> SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024/1024,2) "size in GB" FROM information_schema.tables GROUP BY 1 ORDER BY 2 DESC;

Comprueba el tamaño de cada tabla para la base de datos de usuarios que especifiques:
Nota: Sustituye example-database por el nombre de la base de datos y example-table por el nombre de la tabla.

mysql> SELECT table_schema "example-database", example-table,(data_length + index_length)/1024/1024/1024 AS "TableSizeinGB" from information_schema.tables where table_schema='database_name';

Comprobación de las tablas temporales

Las tablas temporales creadas por los usuarios de InnoDB y las tablas temporales internas en el disco se crean en un archivo de espacio de tablas temporales denominado ibtmp1. Los archivos de espacio de tablas temporales pueden extenderse a ibtmp2 en el directorio de datos de MySQL. Si la tabla temporal ibtmp1 consume demasiado almacenamiento, reinicia la instancia de base de datos para liberar espacio.

Nota: Solo puedes usar las versiones 5.7 y posteriores de MySQL o versiones 8.0 y posteriores de MySQL para consultar los tamaños de los archivos del espacio de tablas de InnoDB.

Identifica el espacio de tablas temporal de InnoDB:

mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibtmp%';

Para recuperar espacio en el disco ocupado por un archivo de datos de espacio de tablas temporales global, reinicia el servidor MySQL o reinicia la instancia de base de datos. Para obtener más información, consulta Espacio de tablas temporal en el sitio web de MySQL.

Comprobación del espacio de tablas de InnoDB

Es posible que MySQL cree tablas temporales internas que no se pueden eliminar debido a una consulta. Estas tablas temporales no forman parte de la tabla denominada tables dentro de information_schema. Para obtener más información, consulta Uso de tablas temporales internas en MySQL en el sitio web de MySQL.

Identifica las tablas temporales internas:

mysql> SELECT * FROM information_schema.innodb_sys_tables WHERE name LIKE '%#%';

Identifica el espacio de tablas del sistema InnoDB:

mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibdata%';

Nota: La consulta anterior se admite en las versiones 5.7 y posteriores de MySQL o en las versiones 8.0 y posteriores de MySQL.

Cuando el tamaño del espacio de tablas del sistema aumenta, no puedes reducirlo. Como solución alternativa, puedes volcar todas las tablas de InnoDB e importarlas a una nueva instancia de base de datos de MySQL. Para evitar grandes espacios de tablas del sistema, utiliza espacios de tablas de archivo por tabla. Para obtener más información, consulta Espacios de tablas de archivo por tabla en el sitio web de MySQL.

Si activas Innodb_file_per_table, cada tabla almacena los datos y el índice en su propio archivo de espacio de tablas. Para recuperar el espacio, ejecuta OPTIMIZE TABLE. Para obtener más información, consulta Instrucción OPTIMIZE TABLE en el sitio web de MySQL.

Nota: El comando OPTIMIZE TABLE usa el algoritmo COPY para crear tablas temporales del mismo tamaño que la tabla original. Asegúrate de que dispones de espacio en disco antes de ejecutar OPTIMIZE TABLE.

Para optimizar la tabla, ejecuta el siguiente comando:
Nota: Sustituye example-table-name por la tabla que deseas optimizar.

mysql> OPTIMIZE TABLE example-table-name;

(Opcional) Para reconstruir la tabla, ejecuta el siguiente comando:
Nota: Sustituye example-table-name por la tabla que deseas optimizar.

mysql> ALTER TABLE example-table-name ENGINE=INNODB;

Comprobación de los registros binarios

Si activas las copias de seguridad automatizadas en la instancia de Amazon RDS, los registros binarios también se activan automáticamente en la instancia de base de datos. Estos registros binarios se almacenan en el disco y consumen espacio de almacenamiento, pero se eliminan con cada configuración de retención de registros binarios. El valor de retención de binlog predeterminado para tu instancia se establece en Null y los archivos se eliminan de inmediato.

Para evitar problemas de falta de espacio de almacenamiento, define un valor adecuado para el periodo de retención de registros binarios en Amazon RDS para MySQL.

Puedes revisar el número de horas que se retiene un registro binario con la sintaxis de comando mysql.rds_show_configuration:

CALL mysql.rds_show_configuration;

Para reducir la cantidad de espacio que utilizan los registros binarios, reduce la cantidad de horas que se retiene un registro binario. El valor NULL elimina los registros inmediatamente.

Si hay una instancia en espera para la instancia activa, supervisa la métrica ReplicaLag en la instancia en espera. La métrica ReplicaLag indica cualquier retraso que se produzca durante los procesos de registros binarios en la instancia activa o los registros de retransmisión en la instancia en espera.

Si hay problemas de purga o replicación, estos registros binarios pueden acumularse con el tiempo y consumir espacio adicional en el disco. Para comprobar la cantidad de registros binarios de una instancia y el tamaño del archivo, utiliza el comando SHOW BINARY LOGS. Para obtener más información, consulta la instrucción SHOW BINARY LOGS en el sitio web de MySQL.

Si la instancia de base de datos actúa como una instancia de replicación en espera, comprueba Relay_Log_Space para ver el tamaño de los registros de retransmisión:

SHOW SLAVE STATUS\G

Comprobación de los registros de MySQL (registros generales, registros de consultas lentas y registros de errores)

Para comprobar el tamaño de las consultas lentas, los registros generales del tipo FILE y los registros de errores, visualiza un listado de los archivos de registro de la base de datos. Si el registro de consultas lentas y las tablas de registros generales consumen demasiado almacenamiento, rota manualmente las tablas de registros para administrar los registros de MySQL basados en tablas.

Para eliminar los datos antiguos y recuperar espacio en el disco, ejecuta los siguientes comandos dos veces seguidas:

mysql> CALL mysql.rds_rotate_slow_log;mysql> CALL mysql.rds_rotate_general_log;

Nota: Las tablas no proporcionan el tamaño de archivo exacto de los registros. Modifica el valor del parámetro de log_output a File para slow_log y general_log.

Supervisión y escalamiento de la instancia de base de datos de Amazon RDS

Para supervisar y escalar la instancia de Amazon RDS, lleva a cabo las siguientes acciones: