sql >> Base de Datos >  >> RDS >> Mysql

MySQL ALTER TABLE tarda mucho en una tabla pequeña

Supongo que ALTER TABLE está esperando un bloqueo de metadatos, y en realidad no ha comenzado a alterar nada.

¿Qué es un bloqueo de metadatos?

Cuando ejecuta cualquier consulta como SELECT/INSERT/UPDATE/DELETE en una tabla, debe adquirir un bloqueo de metadatos. Esas consultas no se bloquean entre sí. Cualquier número de consultas de ese tipo puede tener un bloqueo de metadatos.

Pero una declaración DDL como CREATE/ALTER/DROP/TRUNCATE/RENAME o evento CREATE TRIGGER o LOCK TABLES, debe adquirir una exclusiva bloqueo de metadatos. Si alguna transacción aún tiene un bloqueo de metadatos, la instrucción DDL espera.

Puedes demostrar esto. Abra dos ventanas de terminal y abra el cliente mysql en cada ventana.

  • Ventana 1:CREATE TABLE foo ( id int primary key );
  • Ventana 1:START TRANSACTION;
  • Ventana 1:SELECT * FROM foo; -- no importa que la tabla no tenga datos

  • Ventana 2:DROP TABLE foo; -- nota que espera

  • Ventana 1:SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
    | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

Puede ver la tabla desplegable esperando el bloqueo de metadatos de la tabla. Esperando. ¿Cuánto tiempo esperará? Hasta que se complete la transacción en la ventana 1. Eventualmente, expirará después de lock_wait_timeout segundos (de forma predeterminada, está configurado en 1 año ).

  • Ventana 1:COMMIT;

  • Ventana 2:Observe que deja de esperar e inmediatamente descarta la mesa.

¿Entonces que puedes hacer? Asegúrese de que no haya transacciones de ejecución prolongada que bloqueen su ALTER TABLE. Incluso una transacción que ejecutó un SELECT rápido en su tabla anteriormente mantendrá su bloqueo de metadatos hasta que la transacción se confirme.