MySQL cara apa pun untuk mengimpor dump besar (32 GB) sql lebih cepat?

67

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

  1. Tabelnya adalah semua InnoDB dan tidak ada kunci asing yang ditentukan. Namun, ada banyak indeks.
  2. Saya tidak memiliki akses ke server dan DB asli sehingga saya tidak dapat membuat cadangan baru atau melakukan salinan "panas" dll.
  3. Pengaturan innodb_flush_log_at_trx_commit = 2seperti yang disarankan di sini tampaknya tidak membuat peningkatan (terlihat jelas / eksponensial).
  4. Statistik server selama impor (dari MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. Versi MySQL adalah 5.6.20 komunitas.
  6. innodb_buffer_pool_size = 16M dan innodb_log_buffer_size = 8M. Apakah saya perlu menambah ini?
SBhojani
sumber
Bisakah Anda menambahkan komponen lebih cepat ke server, yaitu lebih banyak RAM dan penyimpanan SSD?
@Bert server memiliki 8 GB RAM yang sebagian besar tidak digunakan. Tidak dapat menambahkan lebih banyak penyimpanan. Bagaimana itu membantu? Apakah ini benar-benar operasi tulis yang sangat lambat?
Apa hambatannya? Apakah CPU Core dipatok?
Chris S
@ Chris tidak, penggunaan CPU adalah 3 hingga 4%. Saya tidak yakin apa hambatannya. Saya pikir itu adalah indeks. Bagaimana cara menemukan / mengkonfirmasi kemacetan?
1
Jika Anda memiliki sql, dapatkah Anda mengedit pernyataan indeks buat dan melihat apakah itu berjalan lebih cepat? Setelah data diimpor, Anda harus membuatnya kembali

Jawaban:

84

Vadim Tkachenko dari Percona membuat Representasi Pictorial InnoDB yang bagus ini

Arsitektur InnoDB

Anda pasti perlu mengubah yang berikut ini

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

Mengapa pengaturan ini?

Mulai ulang mysql seperti ini

service mysql restart --innodb-doublewrite=0

Ini menonaktifkan Buffer Tulis InnoDB Double

Impor data Anda. Setelah selesai, mulai ulang mysql secara normal

service mysql restart

Ini mengaktifkan kembali Buffer Tulis InnoDB Double

Cobalah !!!

CATATAN SISI: Anda harus meningkatkan ke 5.6.21 untuk patch keamanan terbaru .

RolandoMySQLDBA
sumber
1
Saya membuat script bash linux untuk itu, menurunkan beberapa nilai untuk bekerja di dalam gelran
OZZIE
9

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:

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

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/pdengan -nparameter 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:

max_allowed_packet=256M
wait_timeout=30000

Saya pikir angkanya terlalu tinggi, tetapi berhasil untuk pengaturan saya.

Bruno J. Araujo
sumber
5

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.

Alex
sumber
1

salah satu cara untuk membantu mempercepat impor adalah dengan mengunci tabel saat mengimpor. gunakan opsi --add-locks ke mysqldump.

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

atau Anda bisa menyalakan beberapa parameter yang berguna dengan - opt ini menyalakan banyak hal berguna untuk dump.

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

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

pgee70
sumber