Bagaimana saya bisa mempercepat pemulihan MySQL dari file dump?


28

Saya memulihkan database 30GB dari file mysqldump ke database kosong di server baru. Saat menjalankan SQL dari file dump, pemulihan dimulai dengan sangat cepat dan kemudian mulai semakin lambat. Sisipan individual kini membutuhkan waktu 15+ detik. Tabel sebagian besar MyISAM dengan satu InnoDB kecil. Server tidak memiliki koneksi aktif lainnya. SHOW PROCESSLIST;hanya menampilkan sisipan dari pemulihan (dan daftar proses tampilkan sendiri).

Adakah yang punya ide apa yang bisa menyebabkan pelambatan dramatis?

Apakah ada variabel MySQL yang dapat saya ubah untuk mempercepat pemulihan saat sedang berlangsung?


Diedit untuk memperbaiki tipe tabel
Dave Forgac

Jawaban:


26

Satu hal yang mungkin memperlambat proses adalah key_buffer_size , yang merupakan ukuran buffer yang digunakan untuk blok indeks. Tune ini setidaknya 30% dari RAM Anda atau proses pengindeksan ulang mungkin akan terlalu lambat

Untuk referensi, jika Anda menggunakan InnoDB dan kunci asing, Anda juga bisa menonaktifkan pemeriksaan kunci asing dan mengaktifkannya kembali di akhir (menggunakan SET FOREIGN_KEY_CHECKS=0dan SET FOREIGN_KEY_CHECKS=1).


1
Saya menemukan dua hal: key_buffer_size diatur ke 8MB dan ada satu tabel InnoDB dalam campuran dengan kunci asing. Meningkatkan key_buffer_size menjadi 1GB dan untuk sementara menonaktifkan pemeriksaan kunci asing. Pemulihan selesai dalam 5 menit. Terima kasih!
Dave Forgac

Wow! Senang itu membantu :)
Marco Ramos

2
Saya hanya memperhatikan bahwa saya mengetik '5' menit. Saya cukup yakin itu lebih seperti 50 menit tetapi masih jauh lebih masuk akal ;-)
Dave Forgac

5
key_buffer_size untuk MYISAM.
Fernando Fabreti

@FernandoFabreti - itu poin penting bagi banyak pembaca, tetapi OP memang menentukan sebagian besar MyISAM
mc0e

22

Tautan ini menunjukkan apa yang dapat dilakukan seseorang untuk mempercepat proses pemulihan.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Satu dapat menempatkan menempatkan perintah di bagian atas file dump

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

Dan letakkan pernyataan ini di akhir file dump

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Ini berhasil untuk saya. Selamat memulihkan :-)


8
Ini sedikit membantu. Daripada mengedit file, saya membuat pre.sql dan post.sql dari cuplikan di atas dan menggunakannya untuk mengembalikan db:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

Satu-satunya alasan saya bisa membayangkan mengapa pemulihan secara bertahap akan melambat adalah pengindeksan. Selidiki mematikan pengindeksan sampai akhir dan kemudian biarkan melakukan banyak sekaligus.


1

Jika Anda memiliki salinan fisik dari file dump (direktori DB), Anda bisa menyalinnya ke server baru jika server baru memiliki versi MySQL yang sama dan itu akan berfungsi dengan baik. Ini berfungsi baik dengan MyISAM dan bagi saya saya pikir itu lebih baik daripada mengembalikan data berdasarkan pada file dump SQL logis.


0

jika Anda memiliki beberapa tabel kemungkinan Anda mungkin mendapat manfaat dari mk-parallel-restore .


Ini sekarang sudah usang dan seharusnya hanya digunakan untuk mengembalikan data uji, bukan untuk memulihkan cadangan yang sebenarnya.
svandragt

0

Ini akan melakukan:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

Saya menyarankan Anda,

  1. Periksa tabel Anda: Apakah sudah memicu? Hapus semua pemicu
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( DAN JANGAN LUPA ROLLBACK INI PERUBAHAN )
  3. GUNAKANLAH PERINTAH SEPERTI mysql -u root -pPasss requests < mydb.sql
  4. Periksa ukuran file database Anda

Semoga berhasil

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.