¿Cómo puedo monitorear el progreso de una importación de un archivo .sql grande?


204

Estoy importando 7 GB foobar.sqlpara restaurar una tabla en una base de datos local.

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

¿Cómo puedo monitorear su progreso?


1
Las respuestas a esta pregunta muestran que esta es una clara deficiencia del cliente mysql
William Entriken

Respuestas:


267

Si solo está importando desde un archivo de volcado desde la CLI en * nix, por ejemplo

mysql -uxxx -pxxx dbname < /sqlfile.sql

luego instale pipe viewer en su sistema operativo y luego intente algo como esto:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

que mostrará una barra de progreso mientras se ejecuta el programa.

Es muy útil y también puede usarlo para obtener una estimación del progreso de mysqldump.

pv vuelca el sqlfile.sqly los pasa a mysql (debido al operador de tubería) Mientras se está descargando, muestra el progreso. Lo bueno es que mysql toma los datos tan rápido como puede progresar, por lo que pv puede mostrar el progreso de la importación. No tengo ninguna prueba Pero parece que sí. Supongo que se usa algo de búfer, pero en algún momento creo mysqlque no lee más datos cuando todavía está ocupado procesando.

Captura de pantalla de Pipe Viewer


1
Supongo que mysql podría tener un búfer, en el que algunos datos se pueden canalizar, sin ser completamente "procesados" (es decir, si se produce un error, pv puede haber reportado un poco más de lo que realmente entra). Pero en general, así es como funcionan las tuberías. Es la misma razón que puede hacer sudo hd /dev/sda1 | lessy no tener toda la partición del sistema en la memoria.
snapfractalpop

2
@snapfractalpop pvno será demasiado preciso en muchos casos porque algunos fragmentos de SQL tardarán más tiempo en procesarse que otros. Una línea que constituye una inserción simple se ejecutará mucho más rápido que una que crea un índice en una tabla que ya tiene muchas filas, por ejemplo. Pero una idea aproximada del progreso de la salida debería ser útil a menos que el búfer de lectura utilizado mysqlsea ​​particularmente grande (para una entrada de 7 Gb, el búfer debería ser muy grande para que pvla salida no sea útil en absoluto.
David Spillett

1
@DavidSpillett de hecho. Tu comentario refleja mi sentimiento. Básicamente, el pv es crudo, pero efectivo. Lo que más me gusta es lo general que es. Tal es la belleza de las tuberías Unix (gracias McIlroy).
snapfractalpop

1
@rob Este es un tipo increíble, ¿podrías también dar un ejemplo mysqldump?
Josue Alexander Ibarra

Muy buena solución! Si la contraseña es manual, pv no espera a que muestre su progresión, sin embargo
Pierre de LESPINAY

27

Si ya ha comenzado la importación, puede ejecutar este comando en otra ventana para ver el tamaño actual de sus bases de datos. Esto puede ser útil si conoce el tamaño total del archivo .sql que está importando.

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

Crédito a: http://forums.mysql.com/read.php?108,201578,201578


La referencia de MySQL 8.0 establece lo siguiente sobre la precisión:

LONGITUD DE DATOS

Para MyISAM, DATA_LENGTH es la longitud del archivo de datos, en bytes.

Para InnoDB, DATA_LENGTH es la cantidad aproximada de memoria asignada para el índice agrupado, en bytes. Específicamente, es el tamaño del índice agrupado, en páginas, multiplicado por el tamaño de página de InnoDB.

 

INDICE_LONGITUD

Para MyISAM, INDEX_LENGTH es la longitud del archivo de índice, en bytes.

Para InnoDB, INDEX_LENGTH es la cantidad aproximada de memoria asignada para índices no agrupados, en bytes. Específicamente, es la suma de tamaños de índice no agrupados, en páginas, multiplicado por el tamaño de página de InnoDB.


Mi tabla ahora está a 12 GiB de acuerdo con los comandos de esta respuesta, y todavía importa. Mi archivo sqldump es solo 5 GiB. Me interesaría una explicación para esta discrepancia
lucidbrot

17

Cuando ejecuta un mysqldump de una sola base de datos, todas las tablas se vuelcan en orden alfabético.

Naturalmente, la recarga de mysqldump en una base de datos también estaría en orden alfabético.

Podrías hacer una LISTA DE PROCESOS SHOW; y descubra la conexión DB que ejecuta mysqldump. Cuando se vuelve a cargar el volcado, la conexión DB se desvanecerá.

Si desea saber qué tablas hay en el archivo de volcado, ejecute esto en foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

ACTUALIZACIÓN 2012-05-02 13:53 EDT

Perdón por no notar que solo hay una mesa.

Si la tabla es MyISAM, la única forma de monitorear es desde el punto de vista del sistema operativo. ¿La razón? La tabla está bloqueada durante la recarga. Qué buscas? El tamaño de los archivos .MYDy .MYI. Por supuesto, debe comparar eso con el tamaño de la tabla antes en el otro servidor de base de datos desde el que importó.

Si la tabla es InnoDB y tiene innodb_file_per_table habilitado, la única forma de monitorear es desde el punto de vista del sistema operativo. ¿La razón? La tabla está bloqueada durante la recarga. Qué buscas? El tamaño del .ibdarchivo. Por supuesto, debe comparar eso con el tamaño de la tabla antes en el otro servidor de base de datos desde el que importó.

Si la tabla es InnoDB y tiene innodb_file_per_table deshabilitado, ni siquiera el punto de vista del sistema operativo puede ayudar.

ACTUALIZACIÓN 2012-05-02 13:56 EDT

Abordé algo como esto el año pasado: ¿Cómo obtengo% de progreso para "type db.sql | mysql"

ACTUALIZACIÓN 2012-05-02 14:09 EDT

Como una escritura estándar mysqldump bloquea la tabla así:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

entonces, no hay forma de avanzar con mysql hasta que se libere el bloqueo de la tabla.

Si puede obtener LOCK TABLESy UNLOCK TABLEScomentar del archivo de volcado ...

  • si la tabla es MyISAM, SELECT COUNT (*) funcionaría
  • si la tabla es InnoDB, SELECT COUNT (*) probablemente ralentizaría / detendría la carga hasta que se complete el conteo

Eso funciono. Gracias. Una última pregunta es, por experiencia, ¿sabe si el tiempo de importación es más o menos lineal con respecto a los .MYDy .MYItamaño de los archivos?
qazwsx

1
La recarga de la tabla es lineal. Las reconstrucciones de índice son lineales. Hace años, no fue como me aventuré esto como una pregunta a MySQL ( lists.mysql.com/mysql/202489 ) y lo mencioné en el DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

Cada 2 segundos verá los procesos en ejecución.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

Si desea que sea menos frecuente, agregue -n xdonde x es el número de segundos. 5 segundos serían:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

¿Puedes publicar una salida de ejemplo? Además, ¿muestra solo el proceso o realmente indica el progreso de la importación, que realmente estaba pidiendo?
qazwsx

Este es un código muy útil. Gracias
NarayaN

6

Si solo desea verificar si está estancado, puede consultar

show processlist; 

y mira lo que se está ejecutando.


5

Como una solución para alguien que no puede hacer que pv funcione o para quien pv dice mentiras. Puede controlar el tamaño del archivo ibdata1 en / var / lib / mysql que contiene los datos. Esto terminará el mismo tamaño (o más o menos) del tamaño de archivo en su servidor de origen.

Si hay muchas tablas, también puede verlas aparecer una por una en / var / lib / mysql / <nombre de la base de datos>.

Hace poco utilicé este hecho cuando una base de datos a largo plazo había acumulado un archivo de registro de alrededor de 20G durante un período de tres o cuatro años. Noté que la transferencia estaba tomando años y usé esta técnica para monitorear el progreso.

Creo que es muy poco probable que amanezca cuando una base de datos no incluya un archivo en algún lugar u otro. Mientras tanto, puede monitorear el archivo para ver cómo progresa una transferencia. El método que sugerí ha sido algo que podría hacer de una forma u otra desde que se escribió la primera base de datos SQL. Nunca tuve la intención de sugerir que era un tipo de técnica "oficial" en la que un jinete manual podría recurrir. Asume un nivel general de competencia con las computadoras en general y con Unix en particular.


2

Si su base de datos es silenciosa (es decir, no hay otros usuarios activos) y desea ver la actividad de lectura / escritura, ¿por qué no hacer algo como:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

Verá la cantidad de lecturas / escrituras / inserciones / esperas / actualizaciones.

Si está insertando, por ejemplo, verá algo como:

Innodb_rows_inserted                          | 28958 

Donde 28958 es el número de filas insertadas para su intervalo (10 segundos en mi caso).


1

Para alguien que está buscando el ejemplo de visor de tuberías que usa mysqldump, simplemente haría algo como esto:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

La -Wbandera solo le dice a pv que espere a que llegue el primer byte antes de mostrar el progreso (después del aviso)


0

Puede supervisar una importación en la carpeta \ Msql \ Data [nombre de la base de datos]


0

Ok, otro trabajo alrededor. Pero esa puede ser la peor e inexacta opción.

Dicho esto, aquí está mi solución para Windows:

Abra el Administrador de tareas presionando

CTRL + SHIFT + ESC

Copie la velocidad del valor del disco "mysqld.exe"

e.g. 11mb/s

Pon eso en una calculadora como esta: https://techinternets.com/copy_calc?do

Estima la ETA. Mi caso fue:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

Resultados:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

Estoy tan sorprendido de que nadie haya publicado 'mysql -v' como una opción. Si se atasca, la salida se detendrá.


3
"Monitorear el progreso" comúnmente significa tratar de estimar cuánto ha progresado el proceso o cuándo se completará, lo mysql -vque no ofrecerá. Además, arrojar 7 GB de datos al terminal disminuirá significativamente la restauración.
mustaccio

Ya veo, gracias por la explicación. eso es cierto, la salida de 7 GB no sería buena para salir al terminal. Supongo que el uso de -v fue solo para un pequeño caso de prueba local donde mi db simplemente se atascó.
dtc

2
Esta sugerencia me ayudó a identificar un problema, por poco práctico que sea para usar con archivos grandes. (El mío era pequeño).
Casey Perkins
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.