¿Cómo puedo solucionar los problemas de poca memoria liberable en una base de datos de Amazon RDS para MySQL?
Quiero solucionar problemas de falta de memoria cuando ejecuto una instancia de Amazon Relational Database Service (Amazon RDS) para MySQL. Dispongo de poca memoria, mi base de datos no tiene memoria o hay problemas de latencia en mi aplicación.
Solución
Importante: Información de rendimiento llegará al final de su ciclo de vida el 30 de junio de 2026. Puedes actualizar al modo avanzado de Database Insights antes del 30 de junio de 2026. Si no actualizas, los clústeres de bases de datos que utilizan Información de rendimiento adoptarán de forma predeterminada el modo estándar de Database Insights. Solo el modo avanzado de Database Insights admitirá los planes de ejecución y el análisis bajo demanda. Si los clústeres utilizan el modo estándar de forma predeterminada, es posible que no puedas usar estas características en la consola. Para activar el modo avanzado, consulta Activación del modo avanzado de Database Insights para Amazon RDS y Activación del modo avanzado de Database Insights para Amazon Aurora.
Mejora del rendimiento de las bases de datos
Para mejorar el rendimiento de la base de datos, optimiza y ajusta las consultas. Utiliza Información de rendimiento de Amazon RDS para supervisar las instancias de base de datos e identificar cualquier consulta problemática. A continuación, configura una alarma de Amazon CloudWatch en la métrica FreeableMemory para recibir una notificación cuando la memoria disponible alcance el 95 %. Se recomienda mantener libre al menos el 5 % de la memoria de la instancia.
Comprobación de la asignación de memoria en Amazon RDS para MySQL
Cálculo de la asignación de memoria
Para calcular el uso aproximado de memoria de la instancia de tu base de datos, utiliza la siguiente fórmula:
Uso total de memoria = (innodb_additional_mem_pool_size + innodb_buffer_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size + tmp_table_size) + max_connections (binlog_cache_size + join_buffer_size + read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack ) + (performance_schema max_connections * 429498)`
Asegúrate de tener suficientes recursos asignados a la base de datos para procesar las consultas. Ciertas consultas, como los procedimientos almacenados, pueden ocupar una cantidad ilimitada de memoria mientras se ejecutan. Para evitar que las transacciones se prolonguen durante mucho tiempo, divide las consultas grandes en consultas más pequeñas. Para obtener más información sobre cómo Amazon RDS para MySQL usa la memoria, consulta How MySQL Uses Memory (Cómo usa MySQL la memoria) en el sitio web de MySQL.
Se recomienda actualizar con regularidad la versión secundaria de MySQL de la instancia. Las versiones menores anteriores pueden contener errores relacionados con la pérdida de memoria. Para obtener más información sobre las versiones de MySQL, consulta MySQL 8.0 release notes (Notas de la versión de MySQL 8.0) en el sitio web de MySQL.
Comprobación del tamaño del grupo de búferes
Para ver las transacciones de larga ejecución, las estadísticas de utilización de memoria y los bloqueos, utiliza el comando SHOW ENGINE INNODB STATUS. Para obtener más información sobre la consulta SHOW ENGINE, consulta SHOW ENGINE query (Consulta SHOW ENGINE) en el sitio web de MySQL. Revisa la salida y, a continuación, comprueba si la entrada BUFFER POOL AND MEMORY proporciona información sobre la asignación de memoria para InnoDB, como la memoria total asignada, las tablas hash internas y el tamaño del grupo de búferes. Si tu carga de trabajo encuentra deadlocks con frecuencia, modifica el parámetro innodb_lock_wait_timeout en tu grupo de parámetros personalizado. InnoDB se basa en la configuración innodb_lock_wait_timeout para anular las transacciones cuando se produce un interbloqueo.
Un grupo de búferes más grande requiere que se desvíen menos operaciones de E/S al disco. De forma predeterminada, innodb_buffer_pool_size utiliza un máximo del 75 % de la memoria disponible asignada a la instancia de base de datos de Amazon RDS: innodb_buffer_pool_size = DBInstanceClassMemory*3/4. Para obtener más información sobre los grupos de búferes, consulta Buffer Pool (Grupo de búferes) en el sitio web de MySQL.
Para identificar el origen del uso de la memoria, revisa primero el tamaño de innodb_buffer_pool_size. A continuación, si es necesario, modifica el valor del parámetro en tu grupo de parámetros personalizados para reducir innodb_buffer_pool_size.
Para obtener más información, consulta Best practices for configuring parameters for Amazon RDS for MySQL, part 1: Parameters related to performance (Prácticas recomendadas para la configuración de parámetros de Amazon RDS para MySQL, parte 1: parámetros relacionados con el rendimiento).
Comprobación de los subprocesos de MySQL
También se asigna memoria para cada subproceso de MySQL que esté conectado a una instancia de base de datos de MySQL. Para obtener más información sobre los subprocesos de MySQL que requieren memoria asignada, consulta la página Diagnóstico y resolución del estado de parámetros incompatibles para un límite de memoria en la página de problemas de MySQL y MariaDB.
MySQL crea tablas internas temporales para realizar algunas operaciones. Si las tablas alcanzan el valor más bajo de tmp_table_size o max_heap_table_size, MySQL convierte las tablas basadas en memoria en tablas basadas en disco. Si varias sesiones crean tablas internas temporales, es posible que se produzca un aumento en el uso de la memoria. Para reducir el uso de memoria, utiliza solo el máximo de tablas en las consultas. Para obtener más información, consulta Server System Variables (Variables del sistema del servidor) en el sitio web de MySQL y How MySQL uses memory (Cómo MySQL usa la memoria) en el sitio web de MySQL.
Si aumentas los valores tmp_table_size y max_heap_table_size, permites que las tablas temporales más grandes permanezcan en la memoria. Para comprobar que MySQL creó una tabla temporal implícita, utiliza la variablecreated_tmp_tables. Para obtener más información sobre esta variable, consulta Created_tmp_tables en el sitio web de MySQL.
Ver las operaciones JOIN y SORT activas
Si identificas una consulta que necesita una tabla temporal, debes disponer de memoria adicional para asignarla a la tabla. Para ver las conexiones y consultas activas de la base de datos, utiliza el comando SHOW FULL PROCESSLIST. Para obtener más información sobre SHOW FULL PROCESSLIST y ejemplos de consultas, consulta SHOW PROCESSLIST query (Consulta SHOW PROCESSLIST) en el sitio web de MySQL.
Si MySQL asigna varios búferes del mismo tipo, como join_buffer_size o sort_buffer_size, durante una operación JOIN o SORT, el uso de memoria aumentará. Por ejemplo, MySQL asigna un búfer JOIN para hacer una operación JOIN entre dos tablas. En el caso de las consultas que utilizan varias tablas JOIN en las que todas las consultas requieren un búfer JOIN, MySQL asigna un búfer JOIN menos que el número total de tablas.
Si configuras las variables de sesión con un valor demasiado alto, es posible que se produzcan errores. Para resolver este error, asigna la memoria mínima necesaria a las variables de la sesión, como join_buffer_size y sort_buffer_size.
Nota: Si realizas inserciones en masa en tablas MYISAM, MySQL utilizará bulk_insert_buffer_size bytes de memoria. Para obtener más información, consulta Prácticas recomendadas para trabajar con MySQL.
Activación del esquema de rendimiento
Si activas Información de rendimiento, MySQL asigna búferes internos para el esquema de rendimiento al iniciar la instancia y durante las operaciones del servidor. Para obtener más información sobre cómo utiliza la memoria el esquema de rendimiento, consulta The Performance Schema memory-allocation model (El modelo de asignación de memoria del esquema de rendimiento) en el sitio web de MySQL.
Supervisión del uso de memoria en la instancia
Comprobación de las métricas de CloudWatch
Para comprobar si hay poca memoria, utiliza la pestaña Supervisión de la consola de Aurora y RDS para supervisar las métricas de Amazon CloudWatch DatabaseConnections, CPUUtilization, ReadIOPS y WriteIOPS.
En el caso de DatabaseConnections, cada conexión que se realiza a la base de datos requiere una memoria asignada que puede reducir la memoria que se puede liberar. Utiliza la siguiente fórmula para calcular la cuota máxima estimada de max_connections: DBInstanceClassMemory/12582880.
Para comprobar si has superado la cuota max_connections, comprueba la métrica de CloudWatch DatabaseConnections.
Para comprobar la presión de la memoria, supervisa las métricas de CloudWatch SwapUsage y FreeableMemory. Se recomienda mantener los niveles de presión de la memoria por debajo del 95 % para mejorar el rendimiento de la base de datos. Para obtener más información, consulta ¿Por qué mi instancia de base de datos de Amazon RDS utiliza memoria de intercambio cuando tengo memoria suficiente?
Utilización del esquema de sistema de MySQL para rastrear el uso de la memoria
Utiliza el esquema de sistema de MySQL para rastrear la conexión, el componente y la consulta de tu memoria. Para obtener más información, consulta Chapter 30 MySQL sys schema (Capítulo 30 del esquema del sistema de MySQL) en el sitio web de MySQL. Utiliza el esquema del sistema de MySQL y las tablas del esquema de rendimiento para identificar y realizar un seguimiento del uso actual de la memoria.
Nota: Debes activar el esquema de rendimiento para usar el esquema del sistema.
Para realizar un seguimiento del uso de la memoria en el esquema del sistema, inicia sesión en la base de datos y realiza las siguientes acciones:
- Usa memory_by_host_by_current_bytes para determinar qué host usa más memoria.
- Usa memory_by_thread_by_current_bytes para determinar qué ID de subproceso usa más memoria.
Nota: El ID de subproceso en MySQL puede ser una conexión de cliente o un subproceso en segundo plano. Puedes usar la vista sys.processlist o la tabla performance_schema.threads y asignar los ID de subprocesos a los ID de conexión de MySQL. - Usa memory_by_user_by_current_bytes para determinar qué usuario utiliza más memoria.
- Usa memory_global_by_current_bytes para determinar qué componente del motor utiliza más memoria.
- Usa memory_global_total para ver el uso total de memoria registrado en el motor de base de datos.
- Usa sys.memory_global_by_current_bytes para determinar qué componente utiliza más memoria.
Nota: Para los eventos de memoria relacionados con el esquema de rendimiento, utiliza memory/performance_schema/%. Para InnoDB, utiliza memory/innodb/%.
Para identificar qué componentes de las funciones consumen más memoria a nivel global, ejecuta la siguiente consulta:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(event_name, '/', 2), '/', -1 ) AS event_type, ROUND(SUM(CURRENT_NUMBER_OF_BYTES_USED)/1024/1024, 2) AS MB_CURRENTLY_USED FROM performance_schema.memory_summary_global_by_event_name GROUP BY event_type HAVING MB_CURRENTLY_USED>0;
Si performance_schema es el que más memoria usa, ejecuta las siguientes consultas para determinar el event_name que usa memoria.
select * from sys.memory_global_by_current_bytes where event_name like '%performance_schema%' and current_count > 0;
select * from performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%'order by CURRENT_NUMBER_OF_BYTES_USED desc;
A continuación, ejecuta las siguientes consultas:
select * from sys.memory_global_by_current_bytes where event_name like 'memory/sql%' and current_count > 0;
select p.id,p.user,p.host,p.db,p.command,p.state,p.info,t.thread_id,t.type from information_schema.processlist p, performance_schema.threads t where p.id=t.processlist_id and t.thread_id=thread_id;
Nota: Sustituye memory/sql% por tu tipo de evento.
Para ver los detalles sobre la asignación de memoria por evento para un subproceso específico, ejecuta la siguiente consulta:
select * from performance_schema.memory_summary_by_thread_by_event_name where thread_id=thread_id and CURRENT_COUNT_USED >0 order by CURRENT_NUMBER_OF_BYTES_USED desc;
También puedes utiliza el evento performance_schema para mostrar la cantidad de memoria que MySQL asigna a los búferes internos que usa el esquema de rendimiento. Para ver cuánta memoria se ha asignado, ejecuta la siguiente consulta:
select * from performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';
Puedes encontrar los instrumentos de memoria en la tabla setup_instruments con el formato memory/code_area/instrument_name.
Para activar la instrumentación de memoria en el esquema de rendimiento, define la columna ENABLED del instrumento en YES en la tabla performance_schema.setup_instruments.
Nota: En MySQL 8.x, la instrumentación de memoria está activa de forma predeterminada cuando el esquema de rendimiento está activo.
Supervisión del uso de recursos
Para supervisar la utilización de los recursos en una instancia de base de datos, activa Supervisión mejorada. A continuación, establece una granularidad entre 1 y 5 segundos. La granularidad predeterminada es de 60 segundos. Puedes usar la supervisión mejorada para ver la memoria activa y liberable en tiempo real.
Para supervisar los subprocesos que consumen la mayor cantidad de CPU y memoria, usa el siguiente comando para enumerar los subprocesos de la instancia de base de datos:
select THREAD_ID, PROCESSLIST_ID, THREAD_OS_ID from performance_schema.threads;
A continuación, usa el siguiente comando para asignar thread_OS_ID a thread_ID:
select p.* from information_schema.processlist p, performance_schema.threads t where p.id=t.processlist_id and t.thread_os_id=thread-ID;
Nota: Sustituye thread-ID por el ID del subproceso.
Información relacionada
Herramientas de supervisión de Amazon RDS
Solución de problemas de uso de memoria para bases de datos Aurora MySQL
- Temas
- Database
- Idioma
- Español
Vídeos relacionados


This article was reviewed and updated on 2025-12-04.
Contenido relevante
preguntada hace un año
preguntada hace 9 meses
preguntada hace un año
preguntada hace un año