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
- Todas las tablas son InnoDB y no hay claves foráneas definidas. Hay, sin embargo, muchos índices.
- 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.
- Establecer
innodb_flush_log_at_trx_commit = 2
como se sugiere aquí parece no hacer ninguna mejora (claramente visible / exponencial). - Estadísticas del servidor durante la importación (desde MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- La versión de MySQL es la comunidad 5.6.20.
- innodb_buffer_pool_size = 16M e innodb_log_buffer_size = 8M. ¿Necesito aumentar estos?
Respuestas:
Vadim Tkachenko de Percona hizo esta excelente representación pictórica de InnoDB
Definitivamente necesitas cambiar lo siguiente
¿Por qué estas configuraciones?
.ibd
archivos. Según la documentación de MySQLConfiguring the Number of Background InnoDB I/O Threads
, cada subproceso puede manejar hasta 256 solicitudes de E / S pendientes. El valor predeterminado para MySQL es 4, 8 para el servidor Percona. Max tiene 64 años.Reinicie mysql como este
Esto deshabilita el InnoDB Double Write Buffer
Importa tus datos. Cuando termine, reinicie mysql normalmente
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 .
fuente
¿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:
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/p
con el-n
pará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
:Creo que los números son demasiado altos, pero funcionaron para mi configuración.
fuente
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.
fuente
Una forma de ayudar a acelerar la importación es bloquear la tabla mientras se importa. use la opción --add-locks para mysqldump.
o puede activar algunos parámetros útiles con --opt, esto activa un montón de cosas útiles para el volcado.
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
fuente