la importación de volcado de mysql es increíblemente lenta en la máquina de mi desarrollador


22

Tengo un volcado de SQL, es bastante grande (411 MB) y tardé 10 minutos en importar en el servidor A, la misma importación en mi estación de trabajo B tiene un estimado (visor de tuberías) de 8 horas para importar (importó 31 MB en 40 minutos ) Entonces este es el factor 53 más lento.

Las especificaciones:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

La configuración mysql / maria es la configuración estándar.

Ayer cambié a MariaDB en mi estación de trabajo, pero antes de MariaDB las estadísticas eran aún peores.

Ya eliminé todas las bases de datos en mi estación de trabajo, no hay diferencia.

La gran pregunta es: ¿cómo puede el rendimiento ser un factor 53 más lento? No puedo trabajar así :-(

Mi comando de importación:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

servidor A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

estación de trabajo B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

servidor A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

estación de trabajo B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

¿Me puede describir cómo quiere importar la base de datos? (¿Cuál es su declaración concreta de MySQL?) ¿Qué significa "mostrar lista de procesos"; ¿decir? ¿Has mirado lo que el proceso está haciendo concreto con strace? ¿Puedes echar un vistazo si tu máquina está cambiando?

Edité mi pregunta.
Alex

InnoDB? ¿Cuál es el valor de innodb_buffer_pool_sizeen cada máquina?
Rick James

Respuestas:


47

Esta respuesta aceleró mucho todo:

/programming//a/2167641/292408

Yo simplemente

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

al principio y

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

al final.

Ahora tomó 3 minutos.

(Cortesía de @andreasemer a través de twitter)


Trucos impresionantes Algo que necesito saber, ¿hay algún efecto secundario al hacer esto?
Dharma Saputra

1
En caso de que sus datos estén corruptos, es posible que no se cumplan las restricciones de clave externa después de la importación.
Alex

Gran trabajo alrededor. Me has salvado literalmente horas.
Jafo

No aceleró el rendimiento para mí. Sin esto, fueron 23 minutos y después de 23 minutos (archivo .sql de 3GB).
Joshua Pinter

5

Complementando lo que veo arriba ... Tengo mi archivo de volcado ya generado automáticamente por algo como:

mysqldump my_db > db-dump-file.sql

Quiero automatizar este importación así que creé dos archivos en el ordenador llamadas default-start-import.sqly default-end-import.sqly sus contenidos son por defecto de principio import.sql :

SET autocommit=0;

y default-end-import.sql :

COMMIT;
SET autocommit=1;

y el script que ejecuto es algo como esto;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

mismo comando pero más fácil de leer:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

En este caso catse usa para concatenar esos archivos antes de enviarlos a la tubería. Creo que es importante que todos los archivos terminen con un carácter de nueva línea (una línea vacía al final del archivo si se ve desde un editor de texto) para que el catcomando no combine líneas entre archivos.

La importación funciona bien, no he probado si en realidad es más rápida debido a esta mejora en la cosa de habilitar y deshabilitar la confirmación automática, pero si eso hace que las cosas sean más rápidas, estos pasos adicionales lo hacen más fácil.


1

Lo he intentado --compresstan bien SET autocommit=0;y sin embargo ayudaron un poco ...

Descubrí que convertir múltiples INSERT INTO ...declaraciones en una declaración grande con VALUES(...), (...)velocidad mejorada múltiple considerablemente.

Estoy usando mysqlsobre SSL sobre WAN. La base de datos remota de MySQL está alojada en Amazon.

Con 9 columnas y 2,100 filas:

  • 2,100 INSERTdeclaraciones separadas : 82s
  • 2 INSERTestados consolidados : <1s

Con 7 columnas y 42,000 filas:

  • 42,000 INSERTdeclaraciones separadas : 1,740s
  • 42 INSERTestado consolidado : 105s

Entonces, dependiendo de la herramienta que genera el volcado de la base de datos (o más específicamente el formato de las INSERTdeclaraciones), la velocidad puede verse influenciada.

Nota: Esto también disminuye el .sqlarchivo de volcado en más del 60% en mis pruebas, por lo que también se guardará en E / S.

Advertencia: existen limitaciones físicas para esta técnica conmysql y para aquellos que necesitan portabilidad ... SQL Server parece estar limitado a solo 1,000 filas a la vez.

Aún así, ¡hacer 1,000 filas a la vez por 42,000 filas aún produce una mejora del 1,657%!

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.