¿Qué puede hacer que TRUNCATE TABLE tarde mucho tiempo?

9

Estoy ejecutando MySQL5.5 con replicación Maestro / Esclavo (1 maestro, 2 esclavos).

Tengo un proceso que se ejecuta una vez por semana y trunca una tabla específica. La tabla no es grande y solo tiene unos pocos miles de registros.

Por alguna razón, el TRUNCATE TABLEcomando tarda mucho tiempo en ejecutarse (tanto en el maestro como en el esclavo). ¡Se tarda unos 400K ms en ejecutarse! Cuando se ejecuta en el esclavo, hace que se retrase del Maestro. Después de los TRUNCATE TABLEacabados, todo vuelve a la normalidad.

Sé que uno de los esclavos no recibió ninguna lectura mientras realizaba, TRUNCATE TABLEya que es un esclavo dedicado y el proceso que lee de ese esclavo estaba inactivo. Además, en este esclavo, llevó la misma cantidad de tiempo ejecutarlo.

Aquí está la estructura de la tabla: http://pastebin.com/qEQB4juR

¿Alguna idea sobre cómo puedo acelerar la TABLA DE TRUNCADO?

Corrió
fuente
¿Hay alguna partición en la mesa?
Barbaros Alp

Respuestas:

8

El uso TRUNCATE TABLEen una tabla InnoDB requiere un bloqueo completo de la tabla porque TRUNCATE TABLE es DDL (Lenguaje de definición de datos) no DML (Manipulación de datos).

Hacerlo DELETE FROM user_engagements;no ayudará porque la información de MVCC está escrita en los registros de deshacer en ibdata1, y eso puede retrasar el vaciado de la tabla. Si las transacciones no confirmadas se mantienen user_engagements, eso podría retrasarTRUNCATE TABLE también a.

Puede cambiar el nombre de la tabla para que esté disponible de inmediato.

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Esto debería replicarse rápidamente a excepción de la última declaración.

Darle una oportunidad !!!

Si tiene MySQL 5.1.16+, TRUNCATE TABLErequiere privilegio DROP . Mi respuesta realiza lo queTRUNCATE TABLE ahora hace.

Si tiene MySQL 5.1.15 y versiones anteriores, necesita el privilegio DELETE , que cubre mi respuesta.

RolandoMySQLDBA
fuente
2
Usaría una RENAME TABLEdeclaración de varias partes en lugar de ALTER TABLEpara hacer que el cambio de nombre sea atómico: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; otra consideración es que DROP TABLEhace que LRU_mutex se bloquee mientras se escanea la lista LRU y se elimina cada entrada; esto detendrá su servidor. Percona Server tiene innodb_lazy_drop_tableque ayudar con esto, pero DROP TABLEaún puede llevar mucho tiempo en sistemas de archivos ext.
Aaron Brown
¿podría ser que se truncate tableestá tomando mucho tiempo debido a las particiones en la tabla (1000), puedo eliminarlas si eso conduce a la solución?
Corrió el