2009-07-10 3 views
18

Eventuali duplicati:
Speeding up mysql dumps and importsC'è un modo più veloce per caricare mysqldumps?

mysqldump è ragionevolmente veloce, ma discariche di un database di medie dimensioni (20-30 mega) necessari diversi minuti per caricare utilizzando mysql my_database < my_dump_file.sql

Ci sono alcune impostazioni di mysql che posso regolare per accelerare il carico? C'è un modo migliore per caricare i dati salvati?

Ho sperimentato l'utilizzo dell'utilità mysqlimport con i dump basati su CSV. Questi caricano leggermente, ma non in modo sensibile, più velocemente. Sono tentato di copiare solo i file di database grezzi, ma sembra una cattiva idea.

+0

Proprio A proposito ... ho avuto un drive Raid 5 in mancanza, che ha causato davvero male le prestazioni con un MySQL ripristino . Ciò che normalmente richiedeva 40 minuti era di 24 ore. Solo per riferimento – gahooa

risposta

5
+0

Grazie, questo è esattamente quello che stavo cercando! –

+13

La descrizione dice che ci sono errori nel software e NON dovrebbe essere usato per i backup o su dati importanti! Peccato ... mi chiedo se riesco a eseguire più mysqldump in parallelo su tabelle diverse per ottenere un aumento di velocità? – davr

5

Assicurarsi di utilizzare l'opzione --opt su mysqldump durante il dumping. In questo modo utilizzare la sintassi inserimento di massa, ritardare gli aggiornamenti chiave, ecc ...


Se si utilizzano solo le tabelle MyISAM, si può tranquillamente copiarli arrestando il server, copiandoli in un server fermato, e iniziando quello.

Se non si vuole fermare il server di origine, è possibile seguire questa:

  1. Prendi un blocco di lettura su tutti i tavoli
  2. Lavare tutte le tabelle
  3. Copiare i file
  4. Unlock i tavoli

Ma sono abbastanza sicuro che il server di copia su server deve essere fermato quando li metti in posizione.

+0

Questo è ciò che mysqlhotcopy fa – aldrinleal

+0

Purtroppo, ho solo un voto positivo da dare. Cambiando il modo in cui stavo eseguendo mysqldump, usando l'opzione --opt come suggerito, mi sono sbarazzato di 5 ore dalla mia importazione! – Nate

+0

@Nate Ci devono essere altri motivi per cui l'importazione è ora più veloce, perché '--opt' è abilitato di default in mysqldump. È stato così almeno dal v5.5 (2010). – dr01

1

Esiste un metodo per l'utilizzo di snapshot LVM per il backup e il ripristino che potrebbe essere un'opzione interessante per l'utente.

Invece di fare un mysqldump, considerare l'utilizzo di LVM per scattare istantanee delle directory di dati MySQL. L'utilizzo di snapshot LVM consente di disporre di funzionalità di backup quasi in tempo reale, supporto per tutti i motori di archiviazione e recupero incredibilmente veloce. Per citare il link sottostante,

"Il tempo di recupero è veloce quanto il ripristino dei dati e il recupero degli arresti anomali di MySQL standard, e può essere ulteriormente ridotto."

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

4

Sei sicuro i dati è sano di mente, e non ci sono problemi di prestazioni del file system o di sistema? Diversi minuti per un database di 20-30 megabyte sono lunghi. Sono su un MacBook con 2 GB di RAM, un HD da 320 GB e il processore standard da 2,1 GHz. Ho preso uno dei miei database per un rapido benchmark:

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 secondi per un file da 74 megabyte. Mi sembra piuttosto scattante. Anche se è 4 volte più grande (facendo appena 300 megabyte), finisce in poco meno di 70 secondi.

25

Supponendo che si sta utilizzando InnoDB ...

ero nella situazione di avere un mucchio di file di output mysqldump esistenti che ho voluto importare in un tempo ragionevole. Le tabelle (una per file) erano circa 500 MB e contenevano circa 5.000.000 di righe di dati ciascuna. Utilizzando i seguenti parametri sono riuscito a ridurre il tempo di inserimento da 32 minuti a meno di 3 minuti.

innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

Avrete anche bisogno di avere una ragionevolmente grande ambiente innodb_buffer_pool_size.

Poiché i miei inserti sono stati una tantum ho ripristinato le impostazioni in seguito. Se continuerai a usarli a lungo termine, assicurati di sapere cosa stanno facendo.

Ho trovato il suggerimento di utilizzare queste impostazioni su Cedric Nilly's blog e la spiegazione dettagliata per ciascuna delle impostazioni può essere trovata nel MySQL documentation.

+0

Questa è la seconda volta che utilizzo questo metodo. In entrambi i casi (diversi database), ha ridotto il tempo di importazione da ore a pochi minuti. Grazie! – lepe

+0

Recentemente ho dovuto fare questo per una tabella semplice di ~ 8 colonne e per lo più di dati int. Prima di applicare questi, stavo ottenendo circa 30 inserts/s (indici disabilitati). Dopo il cambiamento stavo ottenendo ~ 600 inserti/s. La vittoria più grande deriva dall'impostazione di innodb_flush_log_at_trx_commit da '1' (predefinito) a '2', che svuota le scritture da registrare ogni secondo, anziché su ogni transazione (che è dopo ogni inserto quando un autocommit è true. È true per impostazione predefinita) – Adil

+0

Puoi spiegare cosa succede quando modifichi questi valori? Per noi da capire. Ho appena usato questo e la velocità è eccezionale. – reignsly