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 TABLE
comando 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 TABLE
acabados, todo vuelve a la normalidad.
Sé que uno de los esclavos no recibió ninguna lectura mientras realizaba, TRUNCATE TABLE
ya 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?
fuente
Respuestas:
El uso
TRUNCATE TABLE
en 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 mantienenuser_engagements
, eso podría retrasarTRUNCATE TABLE
también a.Puede cambiar el nombre de la tabla para que esté disponible de inmediato.
Esto debería replicarse rápidamente a excepción de la última declaración.
Darle una oportunidad !!!
Si tiene MySQL 5.1.16+,
TRUNCATE TABLE
requiere 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.
fuente
RENAME TABLE
declaración de varias partes en lugar deALTER TABLE
para 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 queDROP TABLE
hace que LRU_mutex se bloquee mientras se escanea la lista LRU y se elimina cada entrada; esto detendrá su servidor. Percona Server tieneinnodb_lazy_drop_table
que ayudar con esto, peroDROP TABLE
aún puede llevar mucho tiempo en sistemas de archivos ext.truncate table
está tomando mucho tiempo debido a las particiones en la tabla (1000), puedo eliminarlas si eso conduce a la solución?