Importazione lenta del database MySQL con mysqldump e USE .. SOURCE


8

Ho circa 12 tabelle in MySQL innoDB, una delle quali contiene 11 milioni di record.

Ho usato questo comando per eseguire il backup delle cose:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

E questo comando per importare cose sul nuovo server:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Ecco il dolore di cui sono afflitto (il tempo sta salendo con ogni domanda!):

inserisci qui la descrizione dell'immagine

Cosa posso fare per accelerare le cose? C'è qualcosa di sbagliato nel mio comando mysqldump?

Risposte:


5

Per il comando di dump , è possibile utilizzare quanto segue

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Gli inserti estesi sono migliori.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction L'opzione Transazione singola è migliore per il dumping delle tabelle InnoDB.

Nel tuo file my.cnf , apporta temporaneamente le seguenti modifiche

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

e anche

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

Riavvia MySQL, quindi rimuovi queste opzioni dopo l'importazione e riavvia nuovamente MySQL.

Tabelle di memoria

Se tutto il database è in grado di adattarsi alla memoria, è possibile modificare ENGINE = InnoDB in ENGINE = MEMORY nel file sql di dump per ogni tabella o solo le tabelle che richiedono più tempo per l'importazione, importare nuovamente il file di dump nel database e poi riportare il motore in innodb.

ALTER TABLE name_of_table ENGINE = InnoDB;

comando mysqlimport

http://linux.die.net/man/1/mysqlimport

Ho usato mysqlimport per importare i dati di cui è stato eseguito il backup utilizzando l'opzione del formato scheda in mysqldump. Si è dimostrato più veloce dell'importazione tramite il comando mysql.

Dump del database usando mysqldump

mysqldump --tab = / some_directory / -u [USERNAME] -p [DBNAME] [TABLENAME]

Importa i dati nel tuo database.

mysqlimport -u [USERNAME] -p [DBNAME] /some_directory/tablename.sql


5

Caricamento in blocco InnoDB può essere molto scoraggiante se InnoDB non è stato ottimizzato correttamente.

Ecco le impostazioni di cui devi preoccuparti:

È possibile utilizzare fino a metà del pool di buffer per inserti di massa. Questo espelle i dati memorizzati nella cache. Durante il ricaricamento di un mysqldump nelle tabelle InnoDB, il pool di buffer diventa una zona di guerra aperta tra i dati InnoDB appena caricati e le modifiche agli indici secondari. Alla luce di ciò, aumentare innodb_buffer_pool_sizeed innodb_log_file_sizeè vitale e imperativo.

Inoltre, assicurati che siano attivati. Un mysqldump dovrebbe avere queste variabili impostate su 0.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Puoi verificarlo con un semplice head -20file mysqldump.

C'è un altro aspetto di importazione: innodb_change_buffering

Secondo la documentazione MySQL , è possibile dettare ciò che viene bufferizzato durante qualsiasi operazione DML. Per un chiarimento completo al riguardo, consultare Controllo del buffer delle modifiche di InnoDB .

Raccomando le seguenti impostazioni:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.