¿Por qué la importación de un archivo .sql de 12 GB lleva más de 36 horas?


16

Llevo 36 horas esperando que se importe un archivo .sql de 12 GB con un simple type site.sql | mysqlcomando. Puedo ver que ibdata1todavía está creciendo, actualmente casi 40 GB.

Teniendo en cuenta que los desencadenantes y los procedimientos almacenados se encuentran al final de .sql, solo creo que MySQL debería agregar datos e índices clave.

El sitio.sql se generó utilizando este comando desde otro servidor:

mysqldump -R -e --databases site --add-drop-database --add-create-database --add-drop-table -C --single-transaction --triggers

¿Qué está tomando tanto tiempo?


3
¿Cuánta CPU está tomando MySQL? Si es un valor bajo, probablemente significa que estás en un disco
Derek Downey

2
los archivos .sql realmente no son tan rápidos de importar ... en realidad es más rápido volcarlos en delimitadores de pestañas o CSV, luego construir la base de datos vacía y usarla LOAD DATA INFILE. Además, a medida que mueve una base de datos completa, vea mi respuesta sobre: ​​mover bases de datos entre servidores si permanece dentro de la misma versión principal. (especialmente si tiene que abortar y reiniciar)
Joe

Respuestas:


23

Prueba esto:

$ ps -ef|grep [m]ysql

Identifique la identificación del proceso y luego

$ strace -cp <pid>

Déjalo 10 segundos o un minuto entonces ^C. Eso le dirá dónde está gastando el tiempo el proceso, por ejemplo, podría estar esperando el disco si lo ve ready lo writedomina.


44
+1 porque acabo de aprender un nuevo comando (strace): P Editar: bueno, no está disponible en mi mac por defecto.
Derek Downey

2
Es una herramienta fantástica, junto con gdb. No le digo a la gente que su aplicación ya no funciona; Les digo exactamente en qué está pegado o girando, o desde un núcleo les digo la línea de código y el nombre del archivo fuente. Aún más poderoso es dtrace.
Cayo

3
Strace es Linux: el equivalente de Solaris es truss. Dtrace está disponible en Mac.
Cayo

así es. voy a leerlo ahora.
Derek Downey

Cuidado: es un buen comando para saber, pero ten cuidado, este comando bloqueó mi instancia de MySQL. No se porque. Antes de que MySQL se bloqueara, el servidor dejó de responder durante unos minutos.
dabest1

7

¿Tiene alguna tabla InnoDB con una clave primaria?

  1. que contiene varias columnas?
  2. teniendo un amplio VARCHAR?
  3. y muchos índices no únicos?
  4. uno o más índices no únicos que tienen una clave amplia?

Cualquiera de estas condiciones probablemente puede causar que los nodos BTREE grandes en sus índices tengan muy pocas hojas en cada nodo BTREE. La clave de clúster en la clave primaria también se adjunta a cada entrada de clave no única en claves no agrupadas.

Otra consideración: ¿la suma de las páginas de datos de InnoDB es significativamente menor que las páginas de índice de InnoDB?

Puede encontrarlo con esta consulta (en MB):

SELECT SUM(data_length)/POWER(1024,2) InnoDBData,
SUM(index_length)/POWER(1024,2) InnoDBIndexes
FROM information_schema.tables WHERE engine='InnoDB';

Consideración adicional: ¿Tiene habilitado el registro binario en el servidor DB que está cargando? Si es así, haga esto en el servidor que está cargando:

mysql -h... -u... -p... -A -e"SET sql_log_bin=0; source site.sql"

Espero que esto ayude !!!


6

¿Estás seguro de que las tablas en las que estás leyendo no tienen desencadenantes, índices y restricciones? ¿En qué hardware y sistema operativo estás ejecutando? ¿Cómo se configura su almacenamiento?

Estoy más familiarizado con Oracle, pero la importación de 12G en tablas sin disparadores, índices y restricciones debería ir fácilmente con 200 GB / h. Un solo disparador puede hacer que el proceso se convierta en un caracol, dependiendo de lo que haga ese disparador ...

espero que esto ayude

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.