Saya punya basis data MySQL ukuran sedang dengan sekitar 30 tabel, beberapa di antaranya adalah 10 juta catatan, sekitar 100 juta. The mysqldump
semua tabel (dalam berkas terpisah) cukup cepat, membutuhkan waktu mungkin 20 menit. Ini menghasilkan sekitar 15GB data. File yang dibuang terbesar berada dalam kisaran 2GB.
Ketika saya memuat data ke dalam MySQL di kotak lain, mesin enam-inti, 8GB, dibutuhkan selamanya. Mudah 12 jam jam atau lebih.
Saya hanya menjalankan klien mysql untuk memuat file, yaitu
mysql database < footable.sql
langsung dengan file langsung keluar dari mysqldump
mysqldump database foo > footable.sql
Jelas saya melakukan sesuatu yang salah. Di mana saya memulai sehingga bisa selesai dalam waktu yang wajar?
Saya tidak menggunakan tombol apa pun pada dump atau beban.
Jawaban:
Ambil beberapa poin ini dalam pertimbangan Anda, mereka dapat membantu Anda dalam hal menghasilkan dump dan mengembalikannya.
Extended inserts
di tempat pembuangan.--tab
format sehingga Anda dapat menggunakanmysqlimport
, yang lebih cepat darimysql < dumpfile
.innodb_flush_log_at_trx_commit = 2
my.cnf Anda, untuk sementara saat impor berjalan. Anda dapat mengembalikannya ke 1 jika Anda memerlukan ASAMCobalah..
sumber
innodb_flush_log_at_trx_commit = 2
menyelamatkan hari saya. Mengimpor dump 600 MB (sebagai transaksi besar tunggal) akan membutuhkan 6 jam, tetapi dengan pengaturan sementara ini, itu dilakukan dalam 30 menit!Selain jawaban Abdul , saya ingin menekankan pentingnya
--disable-keys
opsi, yang mematikan kunci sampai semua data dimuat untuk sebuah tabel. Opsi ini diaktifkan sebagai bagian dari--opt
sakelar, yang diaktifkan secara default, tetapi menganggapnya penting untuk ditunjukkan.Jika Anda tidak melewatkan kunci selama sisipan, maka setiap baris yang dimasukkan akan membangun kembali indeks. Proses yang sangat lambat.
sumber
--opt
diaktifkan secara defaultThis option is effective only for nonunique indexes of MyISAM tables. It has no effect for other tables
Saya telah banyak berurusan dengan ini belakangan ini. Anda pasti dapat meningkatkan kinerja impor dengan melakukan impor secara paralel. Sebagian besar perlambatan berbasis I / O, tetapi Anda masih bisa mendapatkan peningkatan 40% dengan membuang ke dalam tabel dan kemudian mengimpornya mengatakan 4 pada suatu waktu.
Anda dapat melakukan ini dengan xargs seperti ini:
memiliki file yang di-gzip sebelum mendorongnya ke mysql tidak memperlambat apa pun terutama karena I / O yang diturunkan. Meja saya dikompresi hingga sekitar 10: 1, sehingga menghemat banyak ruang disk.
Saya telah menemukan bahwa pada mesin 4 inti, menggunakan 4 proses adalah optimal, meskipun hanya sedikit lebih baik daripada menggunakan 3. Jika Anda memiliki SSD atau RAID cepat, Anda mungkin akan skala yang lebih baik.
Beberapa hal lain yang perlu diperhatikan. Jika Anda memiliki drive sektor 4k, pastikan Anda memilikinya
key_cache_block_size=4096
danmyisam_block_size=4K
.Jika Anda menggunakan tabel MyISAM, atur tabel
myisam_repair_threads = 2
atau lebih tinggi. Ini akan memungkinkan core tambahan Anda untuk membantu membangun kembali indeks.Pastikan Anda tidak bertukar sama sekali. Jika ya, kurangi ukuran
innodb_buffer_pool_size
.Saya pikir saya mendapat beberapa speedup dengan innnodb dengan opsi ini juga:
(tiga terakhir saya tidak menguji secara luas - saya pikir saya menemukan mereka sebagai saran di internet.) Perhatikan bahwa
innodb_flush_log_at_commit=0
dapat mengakibatkan korupsi dengan mysql crash atau daya padam.sumber
*_block_size
danmyisam_repair_threads
? Juga, tidak yakin kami harus menawarkan saran untuk menyetel variabel berdasarkan 'saran dari internet' :)Jika Anda terutama memiliki tabel MyISAM, Anda harus menambah buffer sisipan massal . Inilah yang dikatakan Dokumentasi MySQL tentang pengaturan bulk_insert_buffer_size :
Ada dua hal yang perlu Anda lakukan
1) Tambahkan ke /etc/my.cnf
2) Tetapkan nilai global untuk itu
Jika Anda tidak memiliki hak istimewa untuk mengatur bulk_insert_buffer_size secara global, maka lakukan ini
Tentu saja, ini bukan untuk InnoDB.
Dari sudut lain, apakah tabelnya InnoDB atau MyISAM, jika indeks lebih besar dari tabel, Anda mungkin memiliki terlalu banyak indeks. Saya biasanya merasa bahwa pemuatan ulang myISAM mysqldump akan memakan waktu 3 kali selama mysqldump diperlukan. Saya juga memberi tahu bahwa memuat ulang mysqldump InnoDB harus memakan waktu 4 kali lipat selama mysqldump dibuat.
Jika Anda melebihi rasio 4: 1 untuk memuat ulang mysqldump, Anda pasti memiliki satu dari dua masalah:
Anda dapat mengukur ukuran data Anda dengan mesin penyimpanan dengan ini:
Lihat apakah indeks hampir sebesar data atau bahkan lebih besar
Anda juga dapat mempertimbangkan menonaktifkan pencatatan biner seperti ini:
sebelum memuat ulang skrip
sumber
Jika Anda mem-bypass sistem file sama sekali dan hanya menyalurkan output mysqldump langsung ke proses MySQL, Anda akan melihat peningkatan kinerja yang nyata. Seberapa besar akhirnya tergantung pada jenis disk drive yang Anda gunakan, tetapi saya jarang menggunakan file dump lagi terlepas dari ukuran database karena alasan ini saja.
sumber
Menurut pengalaman saya, hard drive adalah hambatannya. Lupakan disk yang berputar. SSD lebih baik, tetapi sejauh ini yang terbaik adalah melakukan ini dalam RAM - jika Anda memiliki cukup untuk menahan seluruh database untuk sementara waktu. Kurang lebih:
Bagi saya, dump ~ 10G (/ var / lib / mysql mengkonsumsi ~ 20G) dapat diimpor dalam waktu sekitar 35 menit (mydumper / myloader), 45 menit (mysqldump --tab / mysqlimport), 50 menit (mysqldump / mysql) , pada Xeon 2x6-core 3.2GHz.
Jika Anda tidak memiliki cukup RAM dalam satu mesin, tetapi memiliki beberapa komputer yang bersebelahan dengan jaringan cepat, akan menarik untuk melihat apakah RAM mereka dapat digabungkan dengan nbd (perangkat blok jaringan). Atau, dengan innodb_file_per_table, Anda mungkin dapat mengulangi proses di atas untuk setiap tabel.
sumber