Todos los productos
Search
Centro de documentos

ApsaraDB RDS:DDL sin bloqueo

Última actualización: Sep 03, 2026

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

Limitaciones

Limitación

Detalles

Operaciones DDL compatibles

Únicamente ALTER TABLE, CREATE INDEX y DROP INDEX. Para OPTIMIZE TABLE, utilice ALTER TABLE ... ENGINE = InnoDB en su lugar.

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

loose_rds_nonblock_ddl_retry_interval

Intervalo de espera (en segundos) entre intentos tras fallar la adquisición del MDL. Establézcalo en 0 para deshabilitar la función.

0

0–31,536,000

loose_rds_nonblock_ddl_lock_wait_timeout

Tiempo de espera (en segundos) para cada intento individual de adquisición del MDL.

1

1–31,536,000

Para modificar estos parámetros:

  1. 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.

  2. En el panel de navegación izquierdo, haga clic en Parameters.

  3. En la pestaña Editable Parameters, busque el parámetro y establezca el valor.

  4. 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

  1. 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
  2. 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
  3. 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;
  4. 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.
  5. Habilite el DDL sin bloqueo al establecer loose_rds_nonblock_ddl_retry_interval en 6 y loose_rds_nonblock_ddl_lock_wait_timeout en 1. 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.

TPS comparison with nonblocking DDL disabled

TPS comparison with nonblocking DDL enabled