Por ejemplo, emití una instrucción ALTER TABLE para crear un índice en un campo MEDIUMTEXT en una tabla InnoDB que tiene 134 filas donde el tamaño del índice era 255 bytes y el tamaño promedio de los datos en el campo es 30k. Este comando se ha estado ejecutando durante los últimos 15 minutos aproximadamente (y es lo único que se ejecuta en la base de datos). ¿Hay alguna manera de determinar si va a terminar en 5 minutos, 5 horas o 5 días más o menos?¿Hay alguna forma de ver el progreso de una instrucción ALTER TABLE en MySQL?
Respuesta
Aparentemente, esta es una solicitud bastante común, solicitada ya en 2005 en bugs.mysql.com. Ya existe en Oracle, y se muestra como útil, pero "it is not a simple thing to do, so don't expect it to be implemented soon.". Aunque eso fue 2005 :)
Dicho esto, el tipo que hizo la pregunta original más tarde lanzó un patch para MySQL 5.0, backported a 4.1, lo que podría serle de ayuda.
Pude realizar estas 2 consultas y averiguar cuántas filas quedan por mover.
select count(*) from `myoriginalrable`;
select count(*) from `#sql-1e8_11ae5`;
Esto fue mucho más útil que comparar el tamaño del archivo en el disco, porque el cambio de myisam a InnoDB etc cambia el tamaño de la fila.
En el caso de las tablas InnoDB, se puede usar SHOW ENGINE INNODB STATUS
para encontrar la transacción haciendo ALTER TABLE y verificar cuántos bloqueos de fila tiene el TX. Este es el número de filas procesadas. Se explica en detalle aquí:
http://gabrielcain.com/blog/2009/08/05/mysql-alter-table-and-how-to-observe-progress/
también MariaDB 5.3 y posteriores tiene la función de informar sobre el progreso de algunas operaciones (incluyendo ALTER TABLE). Ver:
pt-online-esquema de cambio por Percona muestra estimación del tiempo restante. Por defecto, imprime la estimación de tiempo restante 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
Hice una consulta que calcula el tiempo para terminar una orden de modificación sobre una tabla InnoDB. Debes ejecutarlo al menos dos veces en la misma sesión, ya que compara las estadísticas de las ejecuciones consecutivas para realizar la estimación. No olvides cambiar <tableName> con el nombre de la tabla correcta en la cuarta línea. Te da dos estimaciones. La estimación local usa solo datos entre ejecuciones, mientras que la estimación global usa todo el tiempo de transacción.
select
beginsd now, qRuns, qTime, tName, trxStarted, trxTime, rows, modified, locked, hoursLeftL, estimatedEndL, modifiedPerSecL, avgRows, estimatedEndG, modifiedPerSecG, hoursLeftG
from (
select
(@tname:='<table>') tName,
@beginsd:=sysdate() beginsd,
@trxStarted:=(select trx_started from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) trxStarted,
@trxTime:=timediff(@beginsd, @trxStarted) trxTime,
@rows:=(select table_rows from information_schema.tables where table_name like @tname) rows,
@runs:=(ifnull(@runs, 0)+1) qRuns,
@rowsSum:=(ifnull(@rowsSum, 0)[email protected]),
round(@avgRows:=(@rowsSum/@runs)) avgRows,
@modified:=(select trx_rows_modified from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) modified,
@rowsLeftL:=(cast(@rows as signed) - cast(@modified as signed)) rowsLeftL,
round(@rowsLeftG:=(cast(@avgRows as signed) - cast(@modified as signed)), 2) rowsLeftG,
@locked:=(select trx_rows_locked from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) locked,
@endsd:=sysdate() endsd,
--
time_to_sec(timediff(@endsd, @beginsd)) qTime,
@modifiedInc:=(cast(@modified as signed) - cast(@p_modified as signed)) modifiedInc,
@timeInc:=time_to_sec(timediff(@beginsd, @p_beginsd)) timeInc,
round(@modifiedPerSecL:=(@modifiedInc/@timeInc)) modifiedPerSecL,
round(@modifiedPerSecG:=(@modified/time_to_sec(@trxTime))) modifiedPerSecG,
round(@minutesLeftL := (@rowsLeftL/@modifiedPerSecL/60)) minutesLeftL,
round(@minutesLeftG := (@rowsLeftG/@modifiedPerSecG/60)) minutesLeftG,
round(@hoursLeftL := (@minutesLeftL/60), 2) hoursLeftL,
round(@hoursLeftG := (@minutesLeftG/60), 2) hoursLeftG,
(@beginsd + INTERVAL @minutesLeftL MINUTE) estimatedEndL,
(@beginsd + INTERVAL @minutesLeftG MINUTE) estimatedEndG,
--
@p_rows:[email protected],
@p_modified:[email protected],
@p_beginsd:[email protected]
) sq;
Percona Server, que es una versión ramificado de MySQL con algunas mejoras, tiene esta característica.
Puede ver columnas adicionales en SHOW PROCESSLIST para ROWS_SENT y ROWS_EXAMINED. Por ejemplo, si su tabla tiene 1000000 filas, y ve ROWS_EXAMINED de 650000, entonces está terminado al 65%.
Ver http://www.percona.com/doc/percona-server/5.6/diagnostics/process_list.html
- 1. ¿Alguna manera de ver ALTER TABLE después de haberse ejecutado? -MySQL
- 2. Orden predeterminado de pedidos en MySQL (ALTER TABLE ... ORDER BY ...;)
- 3. ALTER TABLE agregar restricción
- 4. MySQL ALTER TABLE en tablas demasiado grandes para duplicar
- 5. Ejemplo de cómo implementar ALTER TABLE
- 6. alter table mysql fuera de línea o no?
- 7. Problema con Postgres ALTER TABLE
- 8. ALTER TABLE en la columna dependiente
- 9. MySQL: ALTER IGNORE TABLE da "Integrity constraint violation"
- 10. ¿Hay alguna forma de exportar el esquema de PostgreSQL condensado?
- 11. alter table add ... before `code`?
- 12. ¿Hay alguna forma de combinar IN con LIKE en una instrucción SQL?
- 13. ¿Hay alguna manera de agregar una columna a una vista existente en mysql?
- 14. MySql ALTER TABLE en Bases de Datos de Producción - ¿Algún problema?
- 15. La sentencia ALTER TABLE en conflicto
- 16. ALTER TABLE para agregar una clave primaria compuesta
- 17. ¿Se puede utilizar una subconsulta en una instrucción ALTER de Oracle?
- 18. instrucción MySQL que devuelve una instrucción SQL?
- 19. MySQL ALTER TABLE en una mesa muy grande: ¿es seguro ejecutarlo?
- 20. La instrucción ALTER TABLE está en conflicto con la restricción FOREIGN KEY
- 21. ¿Hay alguna forma de generar filas "falsas" en el conjunto de resultados de MySQL?
- 22. ALTER TABLE ADD my_table @column INT
- 23. SQLite: "ALTER TABLE` game` ADD UNIQUE (`name`)" Error en SQLite
- 24. ALTER TABLE [dbo] [MyTable] restricción CHECK [FK_MyTable_SomeCol]
- 25. Cambiando Table Engine en MySQL
- 26. ¿Hay alguna forma de plegar los subbloques de eclipse como una instrucción "if"?
- 27. ¿ALTER TABLE con PDO y parámetros?
- 28. ¿Cómo puedo generar mensajes de progreso desde una instrucción SELECT?
- 29. ¿Hay alguna forma de 'resaltar' el código?
- 30. ¿Hay alguna forma de restaurar/recuperar nohup para ver el resultado en la consola?
¿Cómo se obtiene el nombre de la tabla temporal que crea el comando alter? – fixxxer
El nombre de la tabla temporal se puede encontrar en el sistema de archivos con el resto de las tablas. – carillonator
mejor respuesta maldita de todos ellos, ¡gracias! – Enerccio