Tengo una base de datos MySQL de tamaño moderado con aproximadamente 30 tablas, algunas de las cuales son 10 millones de registros, algunas de 100 millones. La mysqldump
mayoría de las tablas (en archivos separados) es bastante rápida, lleva unos 20 minutos. Genera unos 15 GB de datos. Los archivos volcados más grandes están en el rango de 2GB.
Cuando cargo los datos en MySQL en otra caja, una máquina de seis núcleos y 8 GB, me lleva una eternidad. Fácilmente 12 horas de reloj o más.
Solo estoy ejecutando el cliente mysql para cargar el archivo, es decir
mysql database < footable.sql
directamente con el archivo directamente de mysqldump
mysqldump database foo > footable.sql
Claramente estoy haciendo algo mal. ¿Dónde empiezo para que pueda terminar en un tiempo razonable?
No estoy usando ningún interruptor ni en el volcado ni en la carga.
Respuestas:
Tenga en cuenta estos puntos en su consideración, pueden ayudarlo en caso de generar el volcado y restaurarlo.
Extended inserts
en vertederos.--tab
formato para que pueda usarmysqlimport
, que es más rápido quemysql < dumpfile
.innodb_flush_log_at_trx_commit = 2
su my.cnf, temporalmente, mientras se ejecuta la importación. puede volver a ponerlo en 1 si necesita ACIDDarle una oportunidad..
fuente
innodb_flush_log_at_trx_commit = 2
me salvó el día. Importar un volcado de 600 MB (como una sola gran transacción) hubiera necesitado 6 horas, pero con esta configuración temporal, ¡se hizo en 30 minutos!Además de la respuesta de Abdul , me gustaría enfatizar la importancia de la
--disable-keys
opción, que apaga las teclas hasta que se carguen todos los datos para una tabla. Esta opción está habilitada como parte de la--opt
palanca, que está habilitada de forma predeterminada, pero consideró importante señalar.Si no omite las claves durante las inserciones, cada fila insertada reconstruirá el índice. Un proceso extremadamente lento.
fuente
--opt
estáThis option is effective only for nonunique indexes of MyISAM tables. It has no effect for other tables
He estado lidiando mucho con esto últimamente. Definitivamente puede mejorar el rendimiento de importación haciendo las importaciones en paralelo. La mayor parte de la desaceleración se basa en E / S, pero aún puede obtener una mejora del 40% volcando en tablas y luego importándolas, digamos 4 a la vez.
Puedes hacer esto con xargs como este:
tener los archivos comprimidos antes de enviarlos a mysql no ralentiza nada principalmente debido a la baja E / S. Mis tablas se comprimieron hasta aproximadamente 10: 1, por lo que ahorra mucho espacio en disco.
Descubrí que en máquinas de 4 núcleos, el uso de 4 procesos es óptimo, aunque solo marginalmente mejor que el uso de 3. Si tiene SSD o un RAID rápido, es probable que escale mejor.
Algunas otras cosas a tener en cuenta. Si tiene unidades de sector 4k, asegúrese de tener
key_cache_block_size=4096
ymyisam_block_size=4K
.Si está utilizando tablas MyISAM, establezca la
myisam_repair_threads = 2
o superior. Esto permitirá que sus núcleos adicionales ayuden a reconstruir índices.Asegúrate de no intercambiar nada. Si es así, reduzca el tamaño de la
innodb_buffer_pool_size
.Creo que también obtuve un poco de aceleración con innnodb por estas opciones:
(los últimos tres no los probé extensamente; creo que los encontré como sugerencias en Internet). Tenga en cuenta que esto
innodb_flush_log_at_commit=0
puede provocar la corrupción con el bloqueo de mysql o la falta de energía.fuente
*_block_size
ymyisam_repair_threads
? Además, no estoy seguro de que debamos ofrecer consejos para ajustar las variables basadas en 'sugerencias de Internet' :)Si tiene principalmente tablas MyISAM, debe aumentar el búfer de inserción masiva . Esto es lo que dice la documentación de MySQL sobre la configuración de bulk_insert_buffer_size :
Hay dos cosas que debes hacer
1) Agréguelo a /etc/my.cnf
2) Establecer el valor global para ello
Si no tiene el privilegio de establecer bulk_insert_buffer_size a nivel mundial, haga esto
Por supuesto, esto no es para InnoDB.
Desde otro ángulo, si las tablas son InnoDB o MyISAM, si los índices son más grandes que la tabla, es posible que tenga demasiados índices. Por lo general, considero que la recarga de un mysqldump MyISAM debería tomar 3 veces más tiempo que el mysqldump tardó en hacerse. También considero que la recarga de un mysqldump de InnoDB debería tomar 4 veces más tiempo que el mysqldump tardó en hacerse.
Si está excediendo la proporción 4: 1 para recargar un mysqldump, definitivamente tiene uno de dos problemas:
Puede medir el tamaño de sus datos por motor de almacenamiento con esto:
Vea si los índices son casi tan grandes como los datos o incluso más grandes
También puede considerar deshabilitar el registro binario como este:
antes de volver a cargar el script
fuente
Si omite el sistema de archivos por completo y simplemente canaliza la salida de mysqldump directamente en un proceso MySQL, debería ver notables mejoras de rendimiento. Cuánto depende en última instancia del tipo de unidad de disco que está utilizando, pero rara vez uso más archivos de volcado, independientemente del tamaño de la base de datos solo por esta razón.
fuente
Según mis experiencias, el disco duro es el cuello de botella. Olvídate de los discos giratorios. SSD es mejor, pero con mucho lo mejor es realizar esto en RAM, si tiene suficiente para mantener toda la base de datos por un corto tiempo. Aproximadamente:
Para mí, se puede importar un volcado de ~ 10G (/ var / lib / mysql que consume ~ 20G) en aproximadamente 35 minutos (mydumper / myloader), 45 minutos (mysqldump --tab / mysqlimport), 50 minutos (mysqldump / mysql) , en un Xeon de 3.2xHz de 2x6 núcleos.
Si no tiene suficiente RAM en una sola máquina, pero tiene varias computadoras una al lado de la otra con una red rápida, sería interesante ver si sus RAM se pueden unir con nbd (dispositivo de bloqueo de red). O, con innodb_file_per_table, probablemente pueda repetir el proceso anterior para cada tabla.
fuente