Problemas conocidos y limitaciones para MySQL en Amazon RDS - Amazon Relational Database Service

Problemas conocidos y limitaciones para MySQL en Amazon RDS

Los siguientes son problemas conocidos y limitaciones para el uso de MySQL en Amazon RDS.

Incoherencia en el tamaño del grupo de búfer de InnoDB

En MySQL 5.7, existe actualmente un error en el modo en que se administra el tamaño del grupo de búfer de InnoDB. MySQL 5.7 puede establecer en el parámetro innodb_buffer_pool_size un valor elevado que puede provocar que el grupo de búfer de InnoDB crezca demasiado y ocupe demasiada memoria. Este efecto puede hacer que el motor de base de datos MySQL deje de funcionar o impedir que se inicie. El problema es más común en las clases de instancia de base de datos que tienen poca memoria disponible.

Para resolverlo, defina como valor del parámetro innodb_buffer_pool_size un múltiplo del valor resultante de multiplicar innodb_buffer_pool_instances por innodb_buffer_pool_chunk_size. Por ejemplo, puede definir como valor de innodb_buffer_pool_size ocho veces el producto de innodb_buffer_pool_instances por innodb_buffer_pool_chunk_size, como se indica en el ejemplo siguiente.

innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184

Para obtener más detalles sobre este error de MySQL 5.7, consulte https://bugs.mysql.com/bug.php?id=79379 en la documentación de MySQL.

La optimización de combinación de índice devuelve resultados incorrectos

Las consultas que utilizan la optimización de combinación de índice podrían devolver resultados incorrectos debido a un error en el optimizador de consultas de MySQL introducidos en MySQL 5.5.37. Cuando realiza una consulta en una tabla con múltiples índices, el optimizador examina rangos de filas según múltiples índices, pero no combina los resultados correctamente. Para obtener más información acerca del error del optimizador de consultas, vea http://bugs.mysql.com/bug.php?id=72745 y http://bugs.mysql.com/bug.php?id=68194 en la base de datos de errores de MySQL.

Por ejemplo, imagine una consulta en una tabla con dos índices donde los argumentos de la búsqueda hacen referencia a las columnas indexadas.

SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

En este caso, el motor de búsqueda buscará en los dos índices. Sin embargo, debido al error, los resultados combinados son incorrectos.

Para resolver este problema, puede seguir uno de estos pasos:

  • Establezca en el parámetro optimizer_switch el valor index_merge=off en el grupo de parámetros de base de datos de la instancia MySQL. Para obtener información acerca de cómo configurar los parámetros de un grupo de parámetros de base de datos, consulte Trabajo con los grupos de parámetros de base de datos.

  • Actualice la instancia de base de datos MySQL a la versión de MySQL 5.6, 5.7 u 8.0. Para obtener más información, consulte Actualización de una instantánea de base de datos de MySQL.

  • Si no puede actualizar la instancia ni cambiar el parámetro optimizer_switch, puede evitar el error identificando explícitamente un índice para la consulta, por ejemplo:

    SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

Para obtener más información, consulte Index Merge Optimization.

Tamaño del archivo de registro

En MySQL existe un límite al tamaño de los BLOB escritos en el registro REDO. Para respetar este límite, asegúrese de que el parámetro innodb_log_file_size de la instancia de base de datos MySQL sea 10 veces mayor que el tamaño máximo de BLOB que haya en las tablas, más la longitud de otros campos de longitud variable (como VARCHAR, VARBINARY o TEXT) de las mismas tablas. Para obtener información acerca del modo de configurar los valores de los parámetros, consulte Trabajo con los grupos de parámetros de base de datos. Para obtener información acerca del límite de tamaño de BLOB en el registro REDO, consulte Changes in MySQL 5.6.20.

Excepciones en los parámetros de MySQL para las instancias de base de datos de Amazon RDS

Algunos parámetros de MySQL requieren consideraciones especiales cuando se usan en una instancia de base de datos de Amazon RDS.

lower_case_table_names

Debido a que en el sistema de archivos de Amazon RDS se distingue entre mayúsculas y minúsculas, en el parámetro lower_case_table_names no se admite el valor 2 ("los nombres se almacenan como se especifican pero se comparan en minúsculas"). Los siguientes valores se admiten para instancias de base de datos de Amazon RDS para MySQL:

  • 0 ("nombres almacenados como se indican y las comparaciones distinguen de mayúsculas y minúsculas") se admite para todas las versiones de Amazon RDS para MySQL.

  • 1 («los nombres almacenados en minúsculas y las comparaciones no distinguen entre mayúsculas y minúsculas») es compatible con las versiones 5.5, 5.6, 5.7 y 8.0.19 y posteriores a la versión 8.0 de Amazon RDS para MySQL.

El parámetro lower_case_table_names debe definirse como parte de un grupo de parámetros de base de datos personalizado antes de crear una instancia de base de datos. Debe evitar modificar el parámetro lower_case_table_names para las instancias de base de datos existentes, porque al hacerlo podría provocar incoherencias con las copias de seguridad de recuperación a un momento dado y con las instancias de base de datos de réplica de lectura.

En las réplicas de lectura siempre debe usarse el mismo valor del parámetro lower_case_table_names que en la instancia de base de datos de origen.

long_query_time

En el parámetro long_query_time puede establecer un valor en coma flotante, lo que le permite registrar las consultas lentas en el registro de consultas lentas de MySQL con una resolución de microsegundos. Por ejemplo, el valor 0,1 corresponde a 100 milisegundos, lo que ayuda a depurar transacciones lentas que duran menos de un segundo.

Límites de tamaño de archivo de MySQL en Amazon RDS

En las instancias de base de datos MySQL en Amazon RDS, el límite máximo de almacenamiento aprovisionado restringe el tamaño de una tabla a un tamaño máximo de 16 TB cuando se usan espacios de tabla file-per-table de InnoDB. Este límite también restringe el espacio de tabla del sistema a un tamaño máximo de 16 TB. Los espacios de tabla file-per-table de InnoDB (en los que las tablas están cada una en su propio espacio de tabla) se habilitan de manera predeterminada para las instancias de base de datos MySQL en Amazon RDS.

nota

Algunas instancias de base de datos existentes tienen un límite inferior. Por ejemplo, las instancias de base de datos MySQL creadas antes de abril de 2014 tienen un límite de tamaño de tabla y de archivo de 2 TB. Este límite de tamaño de archivo de 2 TB también afecta a las instancias de base de datos o las réplicas de lectura creadas a partir de instantáneas de base de datos tomadas antes de abril de 2014, con independencia de cuándo se creó la instancia de base de datos.

El uso de los espacios de tabla file-per-table de InnoDB tiene pros y contras en función de la aplicación. Para determinar el mejor método para la aplicación, consulte File-Per-Table Tablespaces en la documentación de MySQL.

No es recomendable permitir que las tablas crezcan hasta el tamaño de archivo máximo. En general, es preferible dividir los datos en tablas más pequeñas, que pueden mejorar el desempeño y los tiempos de recuperación.

Una opción que se puede usar para dividir una tabla grande en tablas más pequeñas es la creación de particiones. Las particiones distribuyen las porciones de una tabla grande en archivos independientes en función de las reglas que se hayan especificado. Por ejemplo, si almacena las transacciones por fecha, puede crear reglas de partición que distribuyan las transacciones más antiguas entre distintos archivos por medio de la creación de particiones. Después, periódicamente, se pueden archivar los datos de transacciones históricos que no tengan que estar disponibles de forma inmediata para su aplicación. Para obtener información, vaya a Partitioning en la documentación de MySQL.

Para determinar el tamaño de archivo de una tabla

  • Utilice el comando SQL siguiente para determinar si alguna de las tablas es demasiado grande y por lo tanto es candidata para particiones.

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) As "Approximate size (MB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema');

Para habilitar espacios de tablas file-per-table de InnoDB

  • Para habilitar espacios de tablas file-per-table de InnoDB, establezca en el parámetro innodb_file_per_table el valor 1 dentro del grupo de parámetros de la instancia de base de datos.

Para deshabilitar los espacios de tablas file-per-table de InnoDB

  • Para deshabilitar los espacios de tablas file-per-table de InnoDB, establezca en el parámetro innodb_file_per_table el valor 0 dentro del grupo de parámetros de la instancia de base de datos.

Para obtener más información acerca de la actualización de un grupo de parámetros, consulte Trabajo con los grupos de parámetros de base de datos.

Cuando haya habilitado o deshabilitado espacios de tablas file-per-table de InnoDB, puede ejecutar el comando ALTER TABLE para mover una tabla del espacio de tablas global a su propio espacio de tablas o viceversa, como se muestra en el ejemplo siguiente:

ALTER TABLE table_name ENGINE=InnoDB;

Complemento de llavero de MySQL no compatible

Actualmente, Amazon RDS para MySQL no admite el complemento de llavero de Amazon Web Services keyring_aws de MySQL.