2009-07-10 24 views
18

Duplicar posible:
Speeding up mysql dumps and imports¿Hay una forma más rápida de cargar mysqldumps?

mysqldump es razonablemente rápido, pero vertederos de una base de datos de tamaño medio (20-30 megas) que pasen varios minutos para cargar utilizando mysql my_database < my_dump_file.sql

¿Hay alguna configuración de mysql que pueda sintonizar para acelerar la carga? ¿Hay una mejor manera de cargar datos guardados?

Experimenté utilizando la utilidad mysqlimport con volcados basados ​​en CSV. Estos se cargan ligeramente, pero no apreciablemente, más rápido. Tengo la tentación de simplemente copiar los archivos de base de datos sin procesar, pero parece una mala idea.

+0

Para su información ... tuve una unidad RAID 5 en su defecto, lo que causó muy mala actuación con un MySQL restaurar . Lo que normalmente tomó 40 minutos fue presionar 24 horas. Solo para referencia. – gahooa

Respuesta

5
+0

¡Gracias, esto es exactamente lo que estaba buscando! –

+13

¡La descripción dice que hay errores en el software y NO se deben usar para respaldos o datos importantes! Lástima ... Me pregunto si puedo ejecutar varios mysqldumps en paralelo en diferentes tablas para obtener una aceleración. – davr

5

Asegúrese de estar utilizando la opción --opt para mysqldump al descargar. Esto utilizará la sintaxis de inserción masiva, retrasar la actualización de claves, etc ...


Si está utilizando sólo las tablas MyISAM, se les puede copiar de forma segura al detener el servidor, copiarlos en un servidor detenido, y comenzando eso.

Si no desea detener el servidor de origen, puede seguir esto:

  1. obtener un bloqueo de lectura en todas las mesas
  2. Enjuague todas las tablas
  3. copiar los archivos
  4. Unlock las tablas

Pero estoy bastante seguro de que su servidor de copiado debe detenerse cuando las coloca en su lugar.

+0

De hecho, eso es lo que hace mysqlhotcopy – aldrinleal

+0

Lamentablemente, solo tengo un voto positivo para dar. Cambiando la forma en que estaba ejecutando mysqldump, usando la opción --opt como sugeriste, ¡reduje 5 horas de mi importación! – Nate

+0

@Nate Debe haber otras razones por las cuales su importación ahora es más rápida, porque '--opt' está habilitado por defecto en mysqldump. Lo ha sido al menos desde v5.5 (2010). – dr01

1

Hay un método para usar instantáneas LVM para copia de seguridad y restauración que podría ser una opción interesante para usted.

En lugar de hacer un mysqldump, considere usar LVM para tomar instantáneas de sus directorios de datos MySQL. El uso de instantáneas LVM le permite tener una capacidad de respaldo casi en tiempo real, soporte para todos los motores de almacenamiento y una recuperación increíblemente rápida. Para citar desde el siguiente enlace,

"El tiempo de recuperación es tan rápido como la recuperación de datos y la recuperación estándar de MySQL, y se puede reducir aún más".

http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

4

¿Seguro de los datos es sano, y no hay ningún problema de rendimiento del sistema de archivos o del sistema? Varios minutos para una base de datos de 20-30 megas es mucho tiempo. Estoy en una MacBook con 2GB de RAM, una HD de 320GB y el procesador estándar de 2.1GHz. Agarré una de mis bases de datos para obtener una referencia rápida:

gavinlaking$ du -sm 2009-07-12.glis 
74 2009-07-12.glis 
gavinlaking$ mysql -pxxx -e "drop database glis" 
gavinlaking$ mysql -pxxx -e "create database glis" 
gavinlaking$ time mysql -pxxx glis < 2009-07-12.glis 

real 0m17.009s 
user 0m2.021s 
sys 0m0.301s 

17 segundos para un archivo de 74 megabytes. Eso me parece muy rápido. Incluso si fue 4 veces más grande (por lo que apenas llega a los 300 megabytes), termina en menos de 70 segundos.

25

Suponiendo que está usando InnoDB ...

yo estaba en la situación de tener un montón de archivos de salida de mysqldump existentes que quería importar en un tiempo razonable. Las tablas (una por archivo) tenían aproximadamente 500 MB y contenían aproximadamente 5.000.000 filas de datos cada una. Usando los siguientes parámetros, pude reducir el tiempo de inserción de 32 minutos a menos de 3 minutos.

innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

Usted también necesita tener una configuración razonablemente grande innodb_buffer_pool_size.

Como mis insertos fueron únicos, revertí la configuración posteriormente. Si vas a seguir usándolos a largo plazo, asegúrate de saber lo que están haciendo.

Encontré la sugerencia de utilizar estas configuraciones en Cedric Nilly's blog y la explicación detallada de cada una de las configuraciones se puede encontrar en el MySQL documentation.

+0

Esta es la segunda vez que uso este método. En ambos casos (diferentes bases de datos), redujo el tiempo de importación de horas a pocos minutos. ¡Gracias! – lepe

+0

Recientemente tuve que hacer esto para obtener una tabla simple de ~ 8 columnas y la mayoría de los datos int. Antes de aplicar estos, obtenía aproximadamente ~ 30 inserciones/s (índices desactivados). Después del cambio recibí ~ 600 inserciones/s. La mayor ganancia proviene de establecer innodb_flush_log_at_trx_commit de '1' (predeterminado) a '2', que vacía las escrituras para registrar cada segundo, en lugar de en cada transacción (que está después de cada inserción cuando un autocommit es verdadero. Es verdadero de manera predeterminada) – Adil

+0

¿Puede explicar qué sucede al editar estos valores? Para que lo entendamos Acabo de usar esto y la velocidad es increíble. – reignsly

Cuestiones relacionadas