¿Cómo puedo acelerar una restauración de MySQL desde un archivo de volcado?

28

Estoy restaurando una base de datos de 30 GB de un archivo mysqldump a una base de datos vacía en un nuevo servidor. Al ejecutar el SQL desde el archivo de volcado, la restauración comienza muy rápidamente y luego comienza a volverse más y más lenta. Las inserciones individuales ahora tardan más de 15 segundos. Las tablas son principalmente MyISAM con un pequeño InnoDB. El servidor no tiene otras conexiones activas. SHOW PROCESSLIST;solo muestra la inserción de la restauración (y la lista de procesos de show en sí).

¿Alguien tiene alguna idea de lo que podría estar causando la dramática desaceleración?

¿Hay alguna variable MySQL que pueda cambiar para acelerar la restauración mientras progresa?

Dave Forgac
fuente
Editado para corregir los tipos de tabla
Dave Forgac

Respuestas:

26

Una cosa que puede estar ralentizando el proceso es key_buffer_size , que es el tamaño del búfer utilizado para los bloques de índice. Ajuste esto al menos al 30% de su RAM o el proceso de reindexación probablemente será demasiado lento.

Como referencia, si estaba usando InnoDB y claves externas, también podría deshabilitar las comprobaciones de claves externas y volver a habilitarlas al final (usando SET FOREIGN_KEY_CHECKS=0y SET FOREIGN_KEY_CHECKS=1).

Marco Ramos
fuente
1
Encontré dos cosas: key_buffer_size se configuró en 8MB y había una tabla InnoDB en la mezcla con claves foráneas. Se aumentó el tamaño de la memoria intermedia a 1 GB y se desactivaron temporalmente las comprobaciones de claves externas. La restauración terminó en 5 minutos. ¡Gracias!
Dave Forgac
¡Guauu! Me alegro de que haya ayudado :)
Marco Ramos
2
Acabo de notar que escribí '5' minutos. Estoy bastante seguro de que fueron más de 50 minutos, pero aún más razonable ;-)
Dave Forgac
55
key_buffer_size es para MYISAM.
Fernando Fabreti el
@FernandoFabreti: ese es un punto importante para muchos lectores, pero el OP especificó que tenían principalmente MyISAM
mc0e
22

Este enlace muestra lo que se puede hacer para acelerar el proceso de restauración.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Uno puede poner los comandos en la parte superior del archivo de volcado

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

Y ponga estas declaraciones al final del archivo de volcado

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Esto funcionó para mí. Feliz restauración :-)

Sastre Dharmesh
fuente
8
Esto ayudó bastante. En lugar de editar el archivo, creé pre.sql y post.sql a partir de los fragmentos anteriores y lo usé para restaurar la base de datos:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs
1

La única razón por la que puedo imaginar por qué la restauración se ralentizaría gradualmente es la indexación. Investigue apagar la indexación hasta el final y luego deje que haga todo el lote de una vez.

John Gardeniers
fuente
1

Si tiene la copia física del archivo de volcado (el directorio DB), puede copiarla en el nuevo servidor si el nuevo servidor tiene la misma versión de MySQL y funcionará bien. Esto funciona bien con MyISAM y para mí creo que es mejor que restaurar los datos basados ​​en el archivo lógico de volcado de SQL.

usef_ksa
fuente
0

Si tiene varias tablas, es probable que se beneficie de mk-parallel-restore .

pQd
fuente
Esto ahora está en desuso y solo debe usarse para restaurar datos de prueba, no para restaurar copias de seguridad reales.
svandragt
0

Esto lo hara:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql

Matiss
fuente
-1

Te sugerí

  1. Revisa tus tablas: ¿tiene disparadores? Borrar todos los disparadores
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( Y NO OLVIDE ROLLBACK esto cambia )
  3. UTILICE LA LÍNEA DE MANDO COMO mysql -u root -pPasss requests < mydb.sql
  4. Verifique el tamaño del archivo de su base de datos

Buena suerte

Ferhat KOÇER
fuente