MySQL geri yüklemesini bir döküm dosyasından nasıl hızlandırabilirim?


28

30 GB'lık bir veritabanını bir mysqldump dosyasından yeni bir sunucudaki boş bir veritabanına geri yüklüyorum. SQL'i döküm dosyasından çalıştırırken, geri yükleme işlemi çok hızlı bir şekilde başlar ve daha yavaş ve yavaşlamaya başlar. Bireysel ekler şimdi 15+ saniye sürüyor. Masalar çoğunlukla küçük bir InnoDB içeren MyISAM'dir. Sunucunun başka etkin bağlantısı yok. SHOW PROCESSLIST;yalnızca geri yükleme ekini (ve gösteri işlem listesinin kendisini gösterir) gösterir.

Dramatik yavaşlamaya neden olabilecek herhangi bir fikri olan var mı?

İlerlerken geri yüklemeyi hızlandırmak için değiştirebileceğim MySQL değişkenleri var mı?


Tablo türlerini düzeltmek için düzenlendi
Dave Forgac

Yanıtlar:


26

İşlemi yavaşlatan bir şey, dizin blokları için kullanılan tamponun boyutu olan key_buffer_size'dir . Bunu RAM'inizin en az% 30'una ayarlayın yoksa yeniden endeksleme işlemi muhtemelen çok yavaş olacaktır.

Başvuru için, InnoDB ve yabancı anahtarları kullanıyorsanız, yabancı anahtar denetimlerini devre dışı bırakabilir ve sonunda yeniden etkinleştirebilirsiniz ( SET FOREIGN_KEY_CHECKS=0ve kullanarak SET FOREIGN_KEY_CHECKS=1).


1
İki şey buldum: key_buffer_size 8 MB'a ayarlandı ve karışımda yabancı anahtarlarla bir InnoDB tablosu vardı. Key_buffer_size değerini 1 GB'a yükseltti ve geçici olarak yabancı anahtar denetimlerini kapattı. Geri yükleme 5 dakikada tamamlandı. Teşekkürler!
Dave Forgac

Vaov! Memnuniyetle yardım ettim :)
Marco Ramos

2
Sadece '5' dakika yazdığımı fark ettim. 50 dakika kadar
sürdüğünden eminim

5
key_buffer_size MYISAM içindir.
Fernando Fabreti

@FernandoFabreti - Bu birçok okuyucu için önemli bir nokta, ancak OP çoğunlukla
MyISAM'e

22

Bu bağlantı, geri yükleme işlemini hızlandırmak için neler yapabileceğini gösterir.

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

Bir komutları döküm dosyasının en üstüne koyabilir

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;

Ve bu ifadeleri döküm dosyasının sonuna yerleştirin.

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

Bu benim için çalıştı. Mutlu geri yükleme :-)


8
Bu oldukça yardımcı oldu. Dosyayı düzenlemek yerine, yukarıdaki snippet'lerden pre.sql ve post.sql oluşturdum ve db'yi geri yüklemek için kullandım:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

Geri yüklemenin neden yavaş yavaş yavaşladığını hayal edebilmemin tek nedeni endekslemedir. Endekslemeyi kapatıp sonuna kadar araştırın ve ardından tüm partiyi bir kerede yapsın.


1

Döküm dosyasının fiziksel kopyasına (DB dizini) sahipseniz, yeni sunucunun aynı MySQL sürümüne sahip olması durumunda dosyayı yeni sunucuya kopyalayabilirsiniz ve düzgün çalışacaktır. Bu MyISAM ile iyi çalışıyor ve benim için mantıklı SQL döküm dosyasına dayalı verileri geri yüklemek daha iyi olduğunu düşünüyorum.



0

Bu yapacağız:

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


-1

Sana önerdim

  1. Masalarınızı kontrol edin: Tetikleyicileri var mı? Tüm tetikleyicileri temizle
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( VE İÇİN ROLLBACK BU DEĞİŞİKLİKLERİ UNUTMAYIN )
  3. KOMUT HATTI GİBİ KULLANIN mysql -u root -pPasss requests < mydb.sql
  4. Veritabanı dosya boyutunuzu kontrol edin

İyi şanslar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.