Impor dump mysql sangat lambat pada mesin pengembang saya

22

Saya memiliki SQL dump, cukup besar (411 MB) dan butuh 10 menit untuk mengimpor di server A, impor yang sama pada workstation B saya memiliki perkiraan (peninjau pipa) 8 jam untuk mengimpor (impor 31 MB dalam 40 menit ) Jadi ini adalah faktor 53 lebih lambat.

Spesifikasi:

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

Konfigurasi mysql / maria adalah konfigurasi stok.

Saya beralih kemarin ke MariaDB di workstation saya - tetapi sebelum MariaDB statistiknya bahkan lebih buruk.

Saya sudah menghapus semua database di workstation saya - tidak ada perbedaan.

Pertanyaan besarnya adalah: Bagaimana kinerja menjadi faktor yang lebih lambat?Saya tidak bisa bekerja seperti ini :-(

Perintah impor saya:

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

workstation 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

workstation B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
Alex
sumber
Bisakah Anda menjelaskan kepada saya bagaimana Anda ingin mengimpor database? (apa pernyataan mysql konkret Anda) Apa yang "tampilkan daftar proses;" mengatakan? Sudahkah Anda melihat proses yang dilakukan beton dengan strace? Bisakah Anda juga melihatnya jika mesin Anda mungkin bertukar?
Saya mengedit pertanyaan saya.
Alex
InnoDB? Berapa nilai dari innodb_buffer_pool_sizesetiap mesin?
Rick James

Jawaban:

47

Jawaban ini mempercepat semuanya:

/programming//a/2167641/292408

Saya hanya

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

di awal, dan

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

pada akhirnya.

Sekarang butuh 3 menit.

(Courtesy of @andreasemer via twitter)

Alex
sumber
Trik yang luar biasa. Sesuatu yang perlu saya ketahui, apakah ada efek samping dari melakukan ini?
Dharma Saputra
1
Jika data Anda rusak, batasan kunci asing mungkin tidak terpenuhi setelah impor.
Alex
Kerja bagus di sekitar. Anda telah menyelamatkan saya beberapa jam.
Jafo
Tidak mempercepat kinerja untuk saya. Tanpa ini, itu adalah 23 menit dan setelah itu adalah 23 menit (file 3GB .sql).
Joshua Pinter
5

Melengkapi apa yang saya lihat di atas ... Saya punya file dump saya sudah secara otomatis dihasilkan oleh sesuatu seperti:

mysqldump my_db > db-dump-file.sql

Saya ingin mengotomatiskan impor ini sehingga saya membuat dua file di komputer saya yang dipanggil default-start-import.sqldan default-end-import.sqlisinya adalah default-start-import.sql :

SET autocommit=0;

dan default-end-import.sql :

COMMIT;
SET autocommit=1;

dan skrip yang saya jalankan adalah sesuatu seperti ini;

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

perintah yang sama tetapi lebih mudah dibaca:

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

Dalam hal catini digunakan untuk menggabungkan file-file tersebut sebelum mengirimnya ke pipa. Saya pikir penting bahwa semua file diakhiri dengan karakter baris baru (baris kosong di akhir file jika dilihat dari editor teks) sehinggacat perintah tidak menggabungkan garis antara file.

Impor berfungsi dengan baik, saya belum menguji apakah itu benar-benar lebih cepat karena peningkatan ini untuk hal mengaktifkan-dan-menonaktifkan-autocommit, tetapi jika itu membuat segalanya lebih cepat, maka langkah-langkah tambahan ini membuat semuanya lebih mudah.

santiago arizti
sumber
1

Saya sudah mencoba --compressjugaSET autocommit=0; dan mereka membantu sejumlah kecil namun ...

Saya menemukan bahwa mengubah banyak INSERT INTO ...pernyataan menjadi satu pernyataan besar dengan banyakVALUES(...), (...) peningkatan kecepatan jauh.

saya menggunakan mysql lebih dari SSL melalui WAN. Database MySQL jarak jauh di-host di Amazon.

Dengan 9 kolom dan 2.100 baris:

  • 2.100 terpisah INSERT pernyataan : 82s
  • 2 INSERTlaporan konsolidasi : <1s

Dengan 7 kolom dan 42.000 baris:

  • 42.000 terpisah INSERT pernyataan : 1.740-an
  • 42 INSERTlaporan konsolidasi : 105-an

Jadi tergantung pada alat yang menghasilkan dump database (atau lebih tepatnya format INSERT pernyataan), kecepatan dapat dipengaruhi.

Catatan: Ini juga mengurangi .sqlfile dump lebih dari 60% dalam pengujian saya, sehingga akan menghemat i / o juga.

Peringatan: Ada batasan fisik untuk teknik ini denganmysql dan untuk mereka yang membutuhkan portabilitas ... SQL Server tampaknya dibatasi hanya 1.000 baris pada satu waktu.

Namun, melakukan 1.000 baris sekaligus untuk 42.000 baris masih menghasilkan peningkatan 1,657%!

tresf
sumber