MySQL alguna forma de importar un enorme volcado de sql (32 GB) más rápido?

67

Tengo este enorme volcado de SQL de 32 GB que necesito importar a MySQL. No he tenido que importar un volcado de SQL tan grande antes. Hice lo de siempre:

mysql -uroot dbname < dbname.sql

Está tomando mucho tiempo. Hay una tabla con alrededor de 300 millones de filas, se llega a 1.5 millones en alrededor de 3 horas. Entonces, parece que todo tomaría 600 horas (es decir, 24 días) y no es práctico. Entonces mi pregunta es, ¿hay una manera más rápida de hacer esto?

Más información / Resultados

  1. Todas las tablas son InnoDB y no hay claves foráneas definidas. Hay, sin embargo, muchos índices.
  2. No tengo acceso al servidor original ni a la base de datos, por lo que no puedo hacer una nueva copia de seguridad ni hacer una copia "activa", etc.
  3. Establecer innodb_flush_log_at_trx_commit = 2como se sugiere aquí parece no hacer ninguna mejora (claramente visible / exponencial).
  4. Estadísticas del servidor durante la importación (desde MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. La versión de MySQL es la comunidad 5.6.20.
  6. innodb_buffer_pool_size = 16M e innodb_log_buffer_size = 8M. ¿Necesito aumentar estos?
SBhojani
fuente
¿Puede agregar componentes más rápidos al servidor, es decir, más RAM y almacenamiento SSD?
@Bert, el servidor tiene 8 GB de RAM, la mayoría de los cuales no se utilizan. No se puede agregar más almacenamiento tampoco. ¿Cómo ayudaría eso? ¿Son realmente las operaciones de escritura las que son tan lentas?
¿Qué es el cuello de botella? ¿Está vinculado un núcleo de CPU?
Chris S
@ Chris no, el uso de la CPU es del 3 al 4%. No estoy seguro de cuál es el cuello de botella. Estoy pensando que son los índices. ¿Cómo encontraría / confirmaría el cuello de botella?
1
Si tiene el sql, ¿podría editar las instrucciones de creación de índice y ver si va más rápido? una vez que haya importado los datos, deberá volver

Respuestas:

84

Vadim Tkachenko de Percona hizo esta excelente representación pictórica de InnoDB

Arquitectura InnoDB

Definitivamente necesitas cambiar lo siguiente

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

¿Por qué estas configuraciones?

Reinicie mysql como este

service mysql restart --innodb-doublewrite=0

Esto deshabilita el InnoDB Double Write Buffer

Importa tus datos. Cuando termine, reinicie mysql normalmente

service mysql restart

Esto vuelve a habilitar el InnoDB Double Write Buffer

Darle una oportunidad !!!

NOTA LATERAL: debe actualizar a 5.6.21 para los últimos parches de seguridad .

RolandoMySQLDBA
fuente
1
Hice un script de Linux Bash para él, bajé algunos valores para trabajar dentro de vagabundo con menor memoria gist.github.com/OZZlE/57d550c3cc1c1ff17481e465e4f6d674
OZZIE
9

¿Realmente necesita restaurar toda la base de datos? Si no lo haces, mi 2c:

Puede extraer tablas específicas para realizar su restauración en "fragmentos". Algo como esto:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

Lo hice una vez y tardé como 10 minutos en extraer la tabla que necesitaba: mi restauración completa tardó 13 ~ 14 horas, con un volcado de 35 GB (gziped).

El /pattern/,/pattern/pcon el -nparámetro hace un corte "entre los patrones", incluyéndolos.

De todos modos, para restaurar los 35 GB utilicé una máquina AWS EC2 (c3.8xlarge), instalé Percona a través de yum (Centos) y simplemente agregué / cambié las siguientes líneas en my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Creo que los números son demasiado altos, pero funcionaron para mi configuración.

Bruno J. Araujo
fuente
5

La forma más rápida de importar su base de datos es copiar los archivos (.frm, .MYD, .MYI) de MyISAM, directamente al / var / lib / mysql / "nombre de la base de datos".

De lo contrario, puedes probar: mysql > use database_name; \. /path/to/file.sql

Esa es otra forma de importar sus datos.

Alex
fuente
1

Una forma de ayudar a acelerar la importación es bloquear la tabla mientras se importa. use la opción --add-locks para mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

o puede activar algunos parámetros útiles con --opt, esto activa un montón de cosas útiles para el volcado.

mysqldump --opt --database db > db.sql

Si tiene otro dispositivo de almacenamiento en el servidor, úselo: copiar de un dispositivo a otro es una forma de acelerar las transferencias.

También puede filtrar tablas que no son necesarias con --ignore-table

pgee70
fuente