Cuando una operación DDL no logra obtener un metadata lock (MDL) en una tabla con alta actividad, MySQL bloquea todo el acceso posterior a dicha tabla. Esto provoca la acumulación de conexiones, retrasos en las respuestas y, en casos graves, la indisponibilidad total de la aplicación. La función de DDL sin bloqueo de ApsaraDB RDS for MySQL elimina este riesgo al reemplazar la única espera prolongada por intervalos cortos e intermitentes. De esta forma, otras sesiones pueden seguir accediendo a la tabla mientras el DDL reintenta la operación en segundo plano.
Funcionamiento
Toda operación DDL en MySQL debe adquirir un bloqueo MDL-X sobre la tabla destino. Si existen transacciones sin confirmar o consultas de larga duración activas en esa tabla, el hilo del DDL entra en estado pendiente. Dado que un bloqueo MDL-X pendiente tiene la máxima prioridad, bloquea todo el acceso posterior a la tabla.
El DDL sin bloqueo modifica este comportamiento: en lugar de mantener su posición en la cola de bloqueos indefinidamente, el hilo del DDL intenta adquirir el bloqueo MDL-X durante un periodo configurable. Después libera la solicitud y espera antes de reintentar. Durante cada intervalo de espera, las nuevas sesiones pueden acceder a la tabla con normalidad.
Requisitos previos
La instancia ejecuta MySQL 8.0 con una versión menor del motor 20250531 o posterior. Si no se cumple este requisito de versión, actualice la versión menor del motor o actualice la versión principal de la base de datos.
Limitaciones
|
Limitación |
Detalles |
|
Operaciones DDL compatibles |
Únicamente |
|
Instancias de solo lectura y secundarias |
La función no está activa en nodos secundarios ni en instancias de solo lectura cuando los datos se sincronizan desde el nodo principal. |
|
Prioridad del DDL |
Habilitar esta función reduce la prioridad de las sentencias DDL, lo que aumenta la probabilidad de que una operación DDL no logre adquirir un MDL. |
Configurar el DDL sin bloqueo
Dos parámetros de sesión controlan esta función. Ambos surten efecto de inmediato sin necesidad de reiniciar la instancia.
La función se encuentra deshabilitada de forma predeterminada. Establezca loose_rds_nonblock_ddl_retry_interval en un valor distinto de cero para habilitarla.
|
Parámetro |
Descripción |
Valor predeterminado |
Valores válidos |
|
|
Intervalo de espera (en segundos) entre intentos tras fallar la adquisición del MDL. Establézcalo en |
|
0–31,536,000 |
|
|
Tiempo de espera (en segundos) para cada intento individual de adquisición del MDL. |
|
1–31,536,000 |
Para modificar estos parámetros:
Vaya a la página de Instances. En la barra de navegación superior, seleccione la región donde reside la instancia. Localice la instancia y haga clic en su ID.
En el panel de navegación izquierdo, haga clic en Parameters.
En la pestaña Editable Parameters, busque el parámetro y establezca el valor.
Haga clic en OK y luego en Submit Parameters. En el cuadro de diálogo, seleccione cuándo debe surtir efecto el cambio.
Eficacia de la función
A continuación, la prueba utiliza Sysbench para comparar el impacto en el negocio de una operación DDL con el DDL sin bloqueo habilitado frente a deshabilitado.
Método de prueba
-
Cree una tabla y cargue datos con Sysbench:
sysbench oltp_read_write --db-ps-mode=auto --percentile=95 \ --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB \ --tables=1 --table-size=50 --threads=16 prepare -
Inicie una prueba de estrés para simular tráfico concurrente:
sysbench oltp_read_write --db-ps-mode=auto --percentile=95 \ --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB \ --tables=1 --table-size=50 --threads=16 --report-interval=1 --time=100 run -
En una sesión separada, inicie una transacción de larga duración sobre la tabla destino para bloquear las operaciones DDL posteriores:
SELECT SLEEP(60) FROM sbtest1 LIMIT 1; -
Con el DDL sin bloqueo deshabilitado, ejecute el siguiente DDL y observe las transacciones por segundo (TPS):
ALTER TABLE sbtest1 ENGINE = InnoDB; -- Expected: The DDL thread is blocked and cannot acquire the MDL. -
Habilite el DDL sin bloqueo al establecer
loose_rds_nonblock_ddl_retry_intervalen6yloose_rds_nonblock_ddl_lock_wait_timeouten1. Ejecute el mismo DDL y observe las TPS:ALTER TABLE sbtest1 ENGINE = InnoDB; -- Expected: The DDL thread intermittently acquires the MDL without fully blocking.
Resultados de la prueba
|
Escenario |
Resultado |
|
DDL sin bloqueo deshabilitado |
El hilo del DDL no puede adquirir el MDL. La sesión queda completamente bloqueada. |
|
DDL sin bloqueo habilitado |
El hilo del DDL adquiere el MDL de forma intermitente. La sesión no se bloquea por completo y se mantiene la estabilidad del sistema. |

