importazione dump mysql incredibilmente lenta sulla macchina del mio sviluppatore


22

Ho un dump SQL, è piuttosto grande (411 MB) e ci sono voluti 10 minuti per importare sul server A, la stessa importazione sulla mia workstation B ha una stima (pipeviewer) di 8 ore per importare (ha importato 31 MB in 40 minuti ) Quindi questo è il fattore 53 più lento.

Le specifiche:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

La configurazione mysql / maria è la configurazione stock.

Ieri sono passato a MariaDB sulla mia workstation, ma prima di MariaDB le statistiche erano persino peggiori.

Ho già rimosso tutti i database sulla mia workstation, nessuna differenza.

La grande domanda è: in che modo le prestazioni possono essere più lente del fattore 53? Non posso lavorare in questo modo :-(

Il mio comando di importazione:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

server A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

stazione di lavoro B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

server A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

stazione di lavoro B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

Potete descrivermi come si desidera importare il database? (qual è la tua affermazione mysql concreta) Cosa significa "show process list;" dire? Hai guardato che cosa sta facendo concretamente il processo con lo strace? Puoi per favore dare un'occhiata anche se la tua macchina sta forse scambiando?

Ho modificato la mia domanda.
Alex,

InnoDB? Qual è il valore di innodb_buffer_pool_sizesu ogni macchina?
Rick James,

Risposte:


47

Questa risposta ha accelerato molto tutto:

/programming//a/2167641/292408

io semplicemente

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

all'inizio, e

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

alla fine.

Adesso ci sono voluti 3 minuti.

(Per gentile concessione di @andreasemer via twitter)


Trucchi fantastici. Qualcosa che devo sapere, ci sono effetti collaterali nel fare questo?
Dharma Saputra,

1
Nel caso in cui i dati siano danneggiati, i vincoli di chiave esterna potrebbero non essere soddisfatti dopo l'importazione.
Alex,

Ottimo lavoro intorno. Mi hai salvato letteralmente ore.
Jafo,

Non ho accelerato le prestazioni per me. Senza questo sono passati 23 minuti e dopo 23 minuti (file .sql da 3 GB).
Joshua Pinter il

5

A complemento di quello che vedo sopra ... Ho il mio file di dump già generato automaticamente da qualcosa come:

mysqldump my_db > db-dump-file.sql

Voglio automatizzare questo import così ho creato due file nel mio computer chiamato default-start-import.sqle default-end-import.sqlil loro contenuto sono default-start-import.sql :

SET autocommit=0;

e default-end-import.sql :

COMMIT;
SET autocommit=1;

e la sceneggiatura che eseguo è qualcosa del genere;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

stesso comando ma più facile da leggere:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

In questo caso catviene utilizzato per concatenare quei file prima di inviarli alla pipe. Penso che sia importante che tutti i file finiscano con un carattere di nuova riga (una riga vuota alla fine del file se vista da un editor di testo) in modo che il catcomando non unisca le linee tra i file.

L'importazione funziona bene, non ho testato se è effettivamente più veloce a causa di questo miglioramento alla cosa abilita e disabilita autocommit, ma se ciò rende le cose più veloci, allora questi passaggi aggiuntivi rendono le cose più facili.


1

Ci ho provato --compresspureSET autocommit=0; e hanno aiutato una piccola quantità tuttavia ...

Ho scoperto che la conversione di più INSERT INTO ...istruzioni in un'unica istruzione di grandi dimensioni con piùVALUES(...), (...) una velocità migliorata considerevolmente.

sto usando mysql su SSL su WAN. Il database MySQL remoto è ospitato su Amazon.

Con 9 colonne e 2.100 righe:

  • 2.100 separati INSERT dichiarazioni : 82s
  • 2 INSERTdichiarazioni consolidate : <1s

Con 7 colonne e 42.000 righe:

  • 42.000 separati INSERT dichiarazioni : 1.740
  • 42 INSERTdichiarazione consolidata : 105s

Quindi, a seconda dello strumento che genera il dump del database (o più specificamente del formato del file INSERT istruzioni), la velocità può essere influenzata.

Nota: questo riduce anche il .sqlfile di dump di oltre il 60% nei miei test, quindi risparmierà anche sull'I / O.

Avvertenza: esistono limitazioni fisiche a questa tecnica conmysql e per coloro che necessitano di portabilità ... SQL Server sembra essere limitato a solo 1.000 righe alla volta.

Tuttavia, fare 1.000 file alla volta per 42.000 file produce ancora un miglioramento del 1.657%!

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.