MySQL in qualche modo per importare più rapidamente un enorme dump sql (32 GB)?


67

Ho questo enorme dump SQL da 32 GB che devo importare in MySQL. Non ho mai importato un dump SQL così grande prima. Ho fatto il solito:

mysql -uroot dbname < dbname.sql

Ci vuole troppo tempo. C'è una tabella con circa 300 milioni di righe, è arrivata a 1,5 milioni in circa 3 ore. Quindi, sembra che il tutto richiederebbe 600 ore (ovvero 24 giorni) ed è poco pratico. Quindi la mia domanda è: c'è un modo più veloce per farlo?

Ulteriori informazioni / risultati

  1. Le tabelle sono tutte InnoDB e non sono state definite chiavi esterne. Vi sono, tuttavia, molti indici.
  2. Non ho accesso al server e al DB originali, quindi non posso effettuare un nuovo backup o fare una copia "a caldo" ecc.
  3. L'impostazione innodb_flush_log_at_trx_commit = 2come suggerito qui sembra non apportare miglioramenti (chiaramente visibili / esponenziali).
  4. Statistiche del server durante l'importazione (da MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. La versione di MySQL è la comunità 5.6.20.
  6. innodb_buffer_pool_size = 16M e innodb_log_buffer_size = 8M. Devo aumentarli?

Puoi aggiungere componenti più veloci al server, ovvero più memoria RAM e SSD?

@Bert il server ha 8 GB di RAM, la maggior parte dei quali è inutilizzata. Non è possibile aggiungere altro spazio di archiviazione. Come sarebbe d'aiuto? Sono davvero le operazioni di scrittura ad essere così lente?

Qual è il collo di bottiglia? Un core della CPU è ancorato?
Chris S,

@ChrisS no, l'utilizzo della CPU è dal 3 al 4%. Non sono sicuro di quale sia il collo di bottiglia. Sto pensando che siano gli indici. Come si potrebbe trovare / confermare il collo di bottiglia?

1
Se hai sql, potresti modificare le istruzioni di creazione dell'indice e vedere se va più veloce? una volta importati i dati, dovrai ricrearli

Risposte:


84

Vadim Tkachenko di Percona ha realizzato questa eccellente rappresentazione pittorica di InnoDB

Architettura di InnoDB

Devi assolutamente cambiare quanto segue

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

Perché queste impostazioni?

Riavvia mysql in questo modo

service mysql restart --innodb-doublewrite=0

Ciò disabilita il buffer di scrittura doppia InnoDB

Importa i tuoi dati. Al termine, riavviare mysql normalmente

service mysql restart

Ciò riattiva il doppio buffer di scrittura InnoDB

Provaci !!!

NOTA LATERALE: è necessario aggiornare alla 5.6.21 per le ultime patch di sicurezza .


1
Ho creato uno script Linux bash per esso, ho abbassato alcuni valori per funzionare all'interno di Vagrant
OZZIE

9

Hai davvero bisogno di ripristinare l'intero database? In caso contrario, il mio 2c:

È possibile estrarre tabelle specifiche per eseguire il ripristino su "blocchi". Qualcosa come questo:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

L'ho fatto una volta e ci sono voluti circa 10 minuti per estrarre il tavolo di cui avevo bisogno: il mio ripristino completo ha richiesto 13 ~ 14 ore, con un dump da 35 GB (decompresso).

Il parametro /pattern/,/pattern/pwith -ncrea una sezione "tra i modelli" - includendoli.

Comunque, per ripristinare i 35GB ho usato una macchina AWS EC2 (c3.8xlarge), ho installato Percona via yum (Centos) e ho appena aggiunto / modificato le seguenti righe su my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Penso che i numeri siano troppo alti, ma ha funzionato per la mia configurazione.


5

Il modo più veloce per importare il database è copiare i file (.frm, .MYD, .MYI) se MyISAM, direttamente nel / var / lib / mysql / "nome database".

Altrimenti puoi provare: mysql > use database_name; \. /path/to/file.sql

Questo è un altro modo per importare i tuoi dati.


1

un modo per velocizzare l'importazione è bloccare la tabella durante l'importazione. usa l'opzione --add-locks per mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

oppure potresti attivare alcuni parametri utili con --opt questo attiva un mucchio di cose utili per il dump.

mysqldump --opt --database db > db.sql

Se sul server è presente un altro dispositivo di archiviazione, utilizzarlo: copiare da un dispositivo a un altro è un modo per accelerare i trasferimenti.

puoi anche filtrare le tabelle che non sono necessarie con --ignore-table

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.