Saya memiliki dump SQL 32 GB yang sangat besar yang harus saya impor ke MySQL. Saya belum pernah mengimpor dump SQL yang besar sebelumnya. Saya melakukan yang biasa:
mysql -uroot dbname < dbname.sql
Itu terlalu lama. Ada meja dengan sekitar 300 juta baris, itu menjadi 1,5 juta dalam waktu sekitar 3 jam. Jadi, tampaknya semuanya akan memakan waktu 600 jam (24 hari) dan tidak praktis. Jadi pertanyaan saya adalah, adakah cara yang lebih cepat untuk melakukan ini?
Info / Temuan Lebih Lanjut
- Tabelnya adalah semua InnoDB dan tidak ada kunci asing yang ditentukan. Namun, ada banyak indeks.
- Saya tidak memiliki akses ke server dan DB asli sehingga saya tidak dapat membuat cadangan baru atau melakukan salinan "panas" dll.
- Pengaturan
innodb_flush_log_at_trx_commit = 2
seperti yang disarankan di sini tampaknya tidak membuat peningkatan (terlihat jelas / eksponensial). - Statistik server selama impor (dari MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- Versi MySQL adalah 5.6.20 komunitas.
- innodb_buffer_pool_size = 16M dan innodb_log_buffer_size = 8M. Apakah saya perlu menambah ini?
Jawaban:
Vadim Tkachenko dari Percona membuat Representasi Pictorial InnoDB yang bagus ini
Anda pasti perlu mengubah yang berikut ini
Mengapa pengaturan ini?
.ibd
file. Menurut Dokumentasi MySQL aktifConfiguring the Number of Background InnoDB I/O Threads
, setiap utas dapat menangani hingga 256 permintaan I / O yang tertunda. Default untuk MySQL adalah 4, 8 untuk Percona Server. Max adalah 64.Mulai ulang mysql seperti ini
Ini menonaktifkan Buffer Tulis InnoDB Double
Impor data Anda. Setelah selesai, mulai ulang mysql secara normal
Ini mengaktifkan kembali Buffer Tulis InnoDB Double
Cobalah !!!
CATATAN SISI: Anda harus meningkatkan ke 5.6.21 untuk patch keamanan terbaru .
sumber
Apakah Anda benar-benar membutuhkan seluruh database untuk dipulihkan? Jika tidak, 2c saya:
Anda dapat mengekstrak tabel tertentu untuk melakukan pengembalian Anda pada "potongan". Sesuatu seperti ini:
Saya melakukannya sekali dan butuh waktu 10 menit untuk mengekstraksi tabel yang saya butuhkan - pemulihan penuh saya membutuhkan waktu 13 ~ 14 jam, dengan dump 35GB (gziped).
The
/pattern/,/pattern/p
dengan-n
parameter membuat sepotong "antara pola" - termasuk mereka.Bagaimanapun, untuk mengembalikan 35GB saya menggunakan mesin AWS EC2 (c3.8xlarge), menginstal Percona via yum (Centos) dan baru saja menambahkan / mengubah baris berikut pada
my.cnf
:Saya pikir angkanya terlalu tinggi, tetapi berhasil untuk pengaturan saya.
sumber
Cara tercepat untuk mengimpor database Anda adalah dengan menyalin file (.frm, .MYD, .MYI) jika MyISAM, langsung ke / var / lib / mysql / "nama basis data".
Kalau tidak, Anda dapat mencoba:
mysql > use database_name; \. /path/to/file.sql
Itulah cara lain untuk mengimpor data Anda.
sumber
salah satu cara untuk membantu mempercepat impor adalah dengan mengunci tabel saat mengimpor. gunakan opsi --add-locks ke mysqldump.
atau Anda bisa menyalakan beberapa parameter yang berguna dengan - opt ini menyalakan banyak hal berguna untuk dump.
Jika Anda memiliki perangkat penyimpanan lain di server maka gunakan itu - menyalin dari satu perangkat ke perangkat lainnya adalah cara untuk mempercepat transfer.
Anda juga dapat memfilter tabel yang tidak diperlukan dengan --ignore-table
sumber