Come posso velocizzare un ripristino MySQL da un file di dump?


28

Sto ripristinando un database da 30 GB da un file mysqldump a un database vuoto su un nuovo server. Quando si esegue l'SQL dal file di dump, il ripristino inizia molto rapidamente e quindi inizia a diventare sempre più lento. I singoli inserti ora impiegano più di 15 secondi. Le tabelle sono principalmente MyISAM con un piccolo InnoDB. Il server non ha altre connessioni attive. SHOW PROCESSLIST;mostra solo l'inserto dal ripristino (e mostra lo stesso processlist).

Qualcuno ha qualche idea di cosa potrebbe causare il drammatico rallentamento?

Esistono variabili MySQL che posso modificare per velocizzare il ripristino mentre è in corso?


Modificato per correggere i tipi di tabella
Dave Forgac,

Risposte:


26

Una cosa che potrebbe rallentare il processo è key_buffer_size , che è la dimensione del buffer utilizzato per i blocchi di indice. Sintonizzalo su almeno il 30% della RAM o il processo di reindicizzazione sarà probabilmente troppo lento.

Ad esempio, se si utilizzavano InnoDB e chiavi esterne, è possibile disabilitare anche i controlli delle chiavi esterne e riattivarlo alla fine (utilizzando SET FOREIGN_KEY_CHECKS=0e SET FOREIGN_KEY_CHECKS=1).


1
Ho trovato due cose: key_buffer_size era impostato su 8 MB e c'era una tabella InnoDB nel mix con le chiavi esterne. Aumentato key_buffer_size a 1 GB e disattivato temporaneamente i controlli delle chiavi esterne. Il ripristino è terminato in 5 minuti. Grazie!
Dave Forgac,

Wow! Sono contento che abbia aiutato :)
Marco Ramos,

2
Ho appena notato che ho digitato '5' minuti. Sono abbastanza sicuro che sono stati più o meno 50 minuti ma ancora molto più ragionevoli ;-)
Dave Forgac

5
key_buffer_size è per MYISAM.
Fernando Fabreti,

@FernandoFabreti - questo è un punto importante per molti lettori, ma l'OP ha specificato che avevano principalmente MyISAM
mc0e

22

Questo link mostra cosa si può fare per accelerare il processo di ripristino.

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

Uno può mettere mettere i comandi nella parte superiore del file di dump

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;

E metti queste dichiarazioni alla fine del file di dump

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

Questo ha funzionato per me. Buon ripristino :-)


8
Questo ha aiutato parecchio. Invece di modificare il file, ho creato pre.sql e post.sql dai frammenti sopra e ho usato quello per ripristinare il db:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

L'unico motivo per cui riesco a immaginare perché il ripristino rallenti gradualmente è l'indicizzazione. Analizza la disattivazione dell'indicizzazione fino alla fine e poi lascia che esegua l'intero lotto in una sola volta.


1

Se hai la copia fisica del file di dump (la directory DB), puoi semplicemente copiarlo sul nuovo server se il nuovo server ha la stessa versione di MySQL e funzionerà bene. Funziona bene con MyISAM e per me penso sia meglio che ripristinare i dati in base al file di dump SQL logico.


0

se hai più possibilità di tabelle, potresti trarre vantaggio da mk-parallel-restore .


Questo è ora obsoleto e dovrebbe essere utilizzato solo per ripristinare i dati di test, non per ripristinare i backup effettivi.
svandragt,

0

Questo farà:

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


-1

Ti ho suggerito

  1. Controlla i tuoi tavoli: ha dei trigger? Cancella tutti i trigger
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( e non dimenticate di rollback questo cambia )
  3. UTILIZZARE COME LINEA DI COMANDO mysql -u root -pPasss requests < mydb.sql
  4. Controlla le dimensioni del file del database

In bocca al lupo

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.