Dosyaları kopyalayarak bir MySQL veritabanını kopyalayabilir miyim? Dosyalar tam olarak ne içeriyor?


13

MySQL veritabanı kullanıyorum ve bir Ubuntu Linux makinesi kullanıyorum.

Adlı Benim veritabanı db_test, ben yolu altında olduğunu fark /var/lib/mysql/db_test, dosyalar vardır ile soneki .frm, .MYD, .MYIaşağıdaki gibi:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Her görünüyor .frm, .MYD, .MYIdosyalar grup veritabanında bir tabloyla eşlenen.

Sorulacak iki sorum var:

  1. Üç dosya tam olarak ne yapıyor?

  2. Ben yolun altında yeni bir dizin oluşturursanız /var/lib/mysql/söz hakkından db_test_2ve her dosyayı kopyalamak db_test_1için dizine db_test_2, o da yeni bir veritabanı yaratacak db_test_2tamamen aynı içeriği (tablolar) sahiptir db_test_1's?

Bu fiziksel olarak hareket eden veritabanı dosyaları eylemi aşağıdaki komut satırı eylemleriyle aynı sonucu yaratır mı?

  1. veritabanını db_test_1boşalt

  2. yeni bir veritabanı oluştur db_test_2

  3. sonra db_test_1yeni veritabanına geri veritabanı dökümü db_test_2?

Öyleyse, dosyaları taşımak mysqldump(veya MySQL'de bir DB'den başka bir DB'ye veri almak) için dosyaları taşımaktan çok daha hızlı görünüyor . Bu konuda herhangi bir görüşünüz var mı?

Yanıtlar:


5
  1. AFAIR, .frm açıklama dosyasıdır (burada veritabanı tablosu yapısı açıklanmıştır), .MYD veri içeren bir dosyadır .MYI dizinli bir dosyadır.

  2. Evet, kopyalama çok daha hızlı olacaktır. Ama bir sorun var: Atomik değil. Yüksek yük altında kopyalanan dosyalar tutarsız ve hatta belki de bozuk olacaktır. Özellikle InnoDB gibi daha 'akıllı' bir motor kullanıyorsanız.

Düzenleme: ps Bu dosyaları güvenle kopyalayabilirsiniz, ancak önce mysql sunucusunu durdurmalısınız.


4

Tam olarak bunu yapan bir cmd-line aracınız var: mysqlhotcopy

İyi wy myisam tabloları, ancak InnoDb tabloları ile çalışır.

Sunucunuzu lvm ile yapılandırdıysanız ve / var / lib / mysql dosyanızı özel bir birime koyduysanız, tüm veritabanlarınızı çok hızlı ve engellemeyen bir şekilde yedeklemenizi öneririm:

mysql -U root -p
  > flush tables with read lock;

Bu, tüm tablolarınızı diske temizler ve tüm r / w işlemlerini engeller

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

Yapılandırmanıza uyarlanması gerekiyor, bu, veritabanınızın dosya sisteminin bir anlık görüntüsünü oluşturur. Hiç zaman almaz

  > unlock tables;

Bu yapılır, R / W işlemi sürdürülür.

Şimdi / dev / vg_myserver / lvMysql_snap bağlayabilir ve veritabanınızın tar arşivini oluşturabilirsiniz!


Bu, db'yi yedeklemenin hızlı bir yolu gibi görünüyor. Peki ya o anlık görüntüyü tekrar canlı veritabanım haline getirmeye ne dersiniz? Gerçekten endişelendiğim kısım bu. mysqldump2 saniyenin altında benim db yapabilirsiniz . Geri yükleme 5-10 dakika süren yavaş kısımdır.
Buttle Butkus

son dağıtımlarda lvm anlık görüntüleri orijine geri döndürülebilir, ancak veritabanı yedeklemelerini yönetmek için muhtemelen istediğiniz şey bu değildir.
Olivier S

Mysqlhotcopy ile ilgili olarak: "Bu yardımcı program MySQL 5.6.20'de kullanımdan kaldırılmış ve MySQL 5.7'de kaldırılmıştır" Gönderen: [ dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html]
zeusstl

0

Bu MyISAM için çalışır, ancak InnoDB için çalışmaz. Bkz. Https://serverfault.com/a/367321/57569

Bu cevaptan InnoDB hakkında:

Sadece .frm ve .ibd dosyasını kopyalamayı düşünüyorsanız, acı dünyasına hazırsınız demektir. InnoDB tablosunun .frm ve .ibd dosyasını kopyalamak, yalnızca .ibd dosyasının tablo alanı kimliğinin, ibdata1 dosyasının met verisindeki tablo alanı kimliği girdisiyle tam olarak eşleştiğini garanti ederseniz iyi olur.

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.