MySQL herhangi bir şekilde büyük (32 GB) sql dökümü daha hızlı ithal etmek için?


67

MySQL'e aktarmam gereken bu büyük 32 GB'lik SQL dökümü var. Daha önce böyle büyük bir SQL dökümü almak zorunda kalmamıştım. Her zamanki gibi yaptım:

mysql -uroot dbname < dbname.sql

Çok uzun sürüyor. Yaklaşık 300 milyon satırlık bir masa var, yaklaşık 3 saat içinde 1,5 milyona ulaştı. Bu yüzden, her şeyin 600 saat süreceği (24 gün) ve pratik olmadığı anlaşılıyor. Yani benim sorum şu, bunu yapmanın daha hızlı bir yolu var mı?

Ek Bilgi / Bulgular

  1. Tabloların tümü InnoDB'dir ve tanımlanmış yabancı anahtar yoktur. Ancak birçok endeks var.
  2. Orijinal sunucuya ve DB'ye erişemem bu yüzden yeni bir yedekleme yapamıyorum veya "sıcak" bir kopya vb. Yapamıyorum.
  3. Buradainnodb_flush_log_at_trx_commit = 2 önerildiği gibi ayar yapmak, (açıkça görülebilen / katlanarak) iyileşme sağlamıyor gibi görünüyor.
  4. İçe aktarma sırasında sunucu istatistikleri (MySQL Workbench'ten): https://imgflip.com/gif/ed0c8 .
  5. MySQL versiyonu 5.6.20 topluluktur.
  6. innodb_buffer_pool_size = 16M ve innodb_log_buffer_size = 8M. Bunları arttırmam gerekir mi?

Sunucuya daha hızlı bileşenler, yani daha fazla RAM ve SSD depolama ekleyebilir misiniz?

@ Sunucu, çoğu kullanılmayan 8 GB RAM'e sahiptir. Ya da daha fazla depolama birimi eklenemiyor. Bu nasıl yardımcı olur? Gerçekten çok yavaş yazma işlemleri mi?

Darboğaz nedir? CPU Çekirdeği sabitlenmiş mi?
Chris

@ChrisS no, CPU kullanımı% 3 ila 4'tür. Darboğazın ne olduğundan emin değilim. Sanırım indeksler. Bir tıkanıklığı nasıl bulur / onaylar?

1
Sql'niz varsa, index dizin ifadelerini düzenleyebilir ve daha hızlı çalışıp çalışmadığını görebilir misiniz? Verileri içe aktardıktan sonra, onları yeniden oluşturmanız gerekecektir

Yanıtlar:


84

Percona'dan Vadim Tkachenko InnoDB'nin bu güzel resimli sunumunu yaptı.

InnoDB Mimarisi

Kesinlikle aşağıdakileri değiştirmeniz gerekir

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

Neden bu ayarlar?

Bu şekilde mysql'yi yeniden başlatın

service mysql restart --innodb-doublewrite=0

Bu InnoDB Çift Yazma Arabelleğini devre dışı bırakır

Verilerinizi alın. Tamamlandığında, mysql normal olarak yeniden başlat

service mysql restart

Bu InnoDB Çift Yazma Arabelleğini yeniden etkinleştirir

Bir şans ver !!!

YAN NOT: En son güvenlik yamaları için 5.6.21'e yükseltmelisiniz .


1
Ben, bunun için bir linux bash komut dosyası yapılmış alt bellek ile serseri içine çalışmak için bazı değerleri indirdi gist.github.com/OZZlE/57d550c3cc1c1ff17481e465e4f6d674
Ozzie

9

Gerçekten geri yüklemek için tüm veritabanına ihtiyacınız var mı? Yapmazsan benim 2c:

Geri yüklemeyi "topakları" üzerinde yapmak için belirli tabloları çıkarabilirsiniz. Bunun gibi bir şey:

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

Bir kez yaptım ve ihtiyacım olan tabloyu çıkarmak 10 dakika kadar sürdü - tam geri yüklemem 35 GB (gziped) dökümü ile 13 ~ 14 saat sürdü.

/pattern/,/pattern/pİle -nbunları içeren - parametre "desen arasındaki" bir dilim yapar.

Neyse, 35 GB'ı geri yüklemek için bir AWS EC2 makinesi kullandım (c3.8xlarge), Percona'yı yum (Centos) aracılığıyla kurdum ve şu satırları ekledim / değiştirdim my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Bence rakamlar çok yüksek, ama kurulumum için çalıştı.


5

Veritabanınızı içe aktarmanın en hızlı yolu, (.frm, .MYD, .MYI) dosyalarını MyISAM ise doğrudan / var / lib / mysql / "database name" e kopyalamaktır.

Aksi takdirde deneyebilirsiniz: mysql > use database_name; \. /path/to/file.sql

Verilerinizi almanın başka bir yolu da budur.


1

İçe aktarmanın hızlandırılmasına yardımcı olmanın bir yolu, içe aktarırken tabloyu kilitlemektir. mysqldump için --add-lock seçeneğini kullanın.

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

veya bazı yararlı parametreleri --opt ile açabilirsiniz, bu dökümü için bir sürü faydalı şey açar .

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

Sunucuda başka bir depolama cihazınız varsa, bunu kullanın - bir cihazdan diğerine kopyalamak, aktarımları hızlandırmanın bir yoludur.

--genore-table ile gerekmeyen tabloları da filtreleyebilirsiniz.

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.