Agregar un índice muy lento ... ¿hay un cmd de mysql para obtener una ETA o mostrar el progreso?

13

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.

Atai Voltaire
fuente
44
MyISAM? InnoDB? Si es InnoDB, ¿está activado el archivo por tabla?
Charles
Gran pregunta, lo mejor que puedo pensar al instante es hacer una suposición aproximada usando el tamaño de los archivos temporales y reales sin procesar, sin embargo, investigaremos un poco más
Por favor, SHOW CREATE TABLE tblname\Gen la mesa y díganos el índice que desea hacer.
RolandoMySQLDBA

Respuestas:

3

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
Desafortunadamente no pude encontrar ninguna tabla tmp. Yo uso innoDB, con innodb_file_per_table establecido en OFF.
2

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

  • Instancia MySQL con / var / lib / mysql como datadir
  • Tabla de InnoDB llamada db.lotsofdatacon 20 millones de nombres:

La tabla se ve así:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Suponga que desea crear un índice de nombres. Puedes hacerlo:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Mientras se ejecuta INSERT, ingresa al sistema operativo y ejecuta esto:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Esto le dará una lista del tamaño actual de lotsofdata_new.ibd. Cuando se hace más grande que lotsofdata.ibd, entonces sabes que estás cerca de completarse.

Por cierto, MariaDB tiene un estado de progreso implementado internamente .

RolandoMySQLDBA
fuente
Gracias por sus comentarios. por ahora, decidí eliminar la consulta e intentar nuevamente después de actualizar a la última versión de mysql. ojalá sea más fácil de esa manera.
Atai Voltaire
1

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.

  • ¿Qué versión de MySQL estás usando?

El Servidor Percona ha retrocedido bastante (pre 5.5) tiene InnoDB Plugin habilitado por defecto.

Aaron Brown
fuente