Actualmente estoy ejecutando una consulta alternativa en mi tabla (20 millones de entradas) para agregar un índice. está funcionando por más de 3 días (atascado en 'copiar a la tabla tmp').
¿Hay alguna manera de ver el progreso de la consulta o, en otras palabras, hay una manera de obtener un tiempo estimado de finalización?
Gracias.
SHOW CREATE TABLE tblname\G
en la mesa y díganos el índice que desea hacer.Respuestas:
Cuando mysql altera una tabla, esencialmente hace una copia de ella y luego intercambia la copia. De esta manera, si cancela la actualización en el medio, la tabla todavía está en un estado estable. Por lo tanto, puede buscar en el directorio de datos de mysql (/ var / lib / mysql /?) Para ver qué tan grande es el nuevo archivo, que le dirá qué tan avanzado está. Esto es un poco más difícil con Innodb, pero se está creando una tabla tmp en alguna parte.
Puede reducir significativamente la cantidad de tiempo que tarda un índice aumentando sus variables de ordenación del búfer (myisam_sort_buffer_size, sort_buffer_size). Hazlos tan grandes como puedas con la memoria que tienes. Podría reducir unos días el tiempo de modificación, incluso reducirlo a unas pocas horas, dependiendo de la cantidad de memoria que tenga. Hice una tabla de registro de 150 millones en aproximadamente 3 horas.
fuente
Como innodb_fle_per_table está desactivado, no puede ver la tabla y medir su progreso.
Hice una publicación anterior sobre cómo hacer esto para MyISAM . Puede hacer esto para InnoDB si y solo si innodb_file_per_table estaba habilitado y vuelve a diseñar la infraestructura de InnoDB . Todavía requiere mirar en el sistema operativo los tamaños de los archivos en cuestión.
Una vez que haya implementado completamente la limpieza de InnoDB y haya habilitado innodb_file_per_table, es posible que desee realizar la actualización del índice de la siguiente manera:
EJEMPLO tienes lo siguiente
db.lotsofdata
con 20 millones de nombres:La tabla se ve así:
Suponga que desea crear un índice de nombres. Puedes hacerlo:
Mientras se ejecuta INSERT, ingresa al sistema operativo y ejecuta esto:
Esto le dará una lista del tamaño actual de
lotsofdata_new.ibd
. Cuando se hace más grande quelotsofdata.ibd
, entonces sabes que estás cerca de completarse.Por cierto, MariaDB tiene un estado de progreso implementado internamente .
fuente
No hay una forma confiable de ver el progreso de la creación de un índice. Si tenía innodb-file-per-table, podría obtener alguna indicación al mirar el archivo .ibd temporal que se está creando en el directorio de datos y compararlo con el tamaño del archivo actual, pero eso no es muy confiable, ya que su archivo de datos actual podría estar hinchado debido a eliminaciones / fragmentación y el nuevo archivo de datos tendrá un índice adicional que el anterior no tenía.
Parece que está utilizando una versión de MySQL sin el complemento InnoDB instalado. El complemento InnoDB tiene una creación de índice rápida que no requiere una reconstrucción completa de la tabla para adiciones y eliminaciones de índice. El complemento InnoDB está habilitado de forma predeterminada en MySQL 5.5 y está disponible con una configuración de configuración en 5.1.38 y posterior.
El Servidor Percona ha retrocedido bastante (pre 5.5) tiene InnoDB Plugin habilitado por defecto.
fuente
pt-online-schema-change de Percona muestra la estimación del tiempo restante. Por defecto, imprime el tiempo restante estimado y el porcentaje de progreso cada 30 segundos.
También tiene funciones adicionales en comparación con solo ejecutar el comando ALTER por sí mismo.
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
fuente