Linux / mysql: mysql db dosyalarını cp komutuyla bir db'den diğerine kopyalamak güvenli midir?


11

Çoğu kılavuz, bir tabloyu anoter db'ye kopyalamak için mysqldump ve basit SQL'i önerir. Linux Shell CP'ye ne dersiniz? Sadece yapabilir miyim

cp /db1/mytable.frm /db2/mytable.frm

Yanıtlar:


21

Kopyalama MyISAM için çok basit ve InnoDB ile% 100 riskli (intihar yakınında).

Sorunuzdan, büyüdünüz

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

Bunu yapmak için sorun yok. Ancak, sadece .frm'yi taşıyamazsınız. Tüm bileşenleri taşımanız gerekir. Sorunuzdan db1.mytable adlı bir tablo alalım. Normal kurulumda, tablo / var / lib / mysql / db1 dizininde bulunur. Masayı oluşturan üç dosya olurdu.

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (Tablo Veritabanı)
  • /var/lib/mysql/db1/mytable.MYI (Tablo Dizinleri)

Bir tabloyu taşımak için her üç dosyayı da taşımalısınız. Tüm tablolarınız MyISAM depolama motorunu kullanıyorsa, mysql'yi kapatabilir ve kopyalayabilirsiniz. Tablonun bir kopyasını oluşturup başka bir veritabanına yerleştiriyorsanız, bunu SQL kullanarak yapmalısınız.

Örneğin, db1.mytable dosyasını db2 veritabanına kopyalamak istiyorsanız, bunu yapın:

CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;

Şimdi tabloyu db1'den db2'ye taşıyorsanız, bunu yapabilirsiniz:

ALTER TABLE db1.mytable RENAME db2.mytable;

InnoDB'nin

InnoDB'nin altında çalıştığı altyapı nedeniyle kopyalama çok tehlikelidir. İki temel altyapı vardır: 1) innodb_file_per_table devre dışı ve 2) innodb_file_per_table etkin

Aşil Topuğu InnoDB, ibdata1 (normalde / var / lib / mysql içinde bulunur) olarak bilinen sistem tablo alanı dosyasıdır. Bu dosyada ne var ?

InnoDB (innodb_file_per_table devre dışı)

İnnodb_file_per_table devre dışı bırakıldığında, tüm bu InnoDB bilgileri ibdata1 içinde yaşar. İbdata1 dışındaki herhangi bir InnoDB tablosunun tek belirtisi, InnoDB tablosunun .frm dosyasıdır. Tüm InnoDB verilerinin aynı anda kopyalanması / var / lib / mysql dosyasının tümünü kopyalamayı gerektirir.

Tek bir InnoDB tablosunun kopyalanması tamamen imkansızdır. Verilerin ve karşılık gelen dizin tanımlarının mantıksal bir temsili olarak tablonun dökümünü almak için mysqldump komutunu kullanmalısınız. Daha sonra bu dökümü aynı sunucudaki veya başka bir sunucudaki başka bir veritabanına yüklersiniz.

InnoDB (innodb_file_per_table etkin)

İnnodb_file_per_table etkinken, tablo verileri ve dizinleri .frm dosyasının yanındaki veritabanı klasöründe yaşar. Örneğin, db1.mytable tablosu için, bu InnoDB tablosunun ibdata1 dışındaki tezahürü:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Db1.mytable için tüm meta veriler hala ibdata1'de yer alır ve bunun hiçbir yolu yoktur . Günlükleri ve MVCC verilerini yine de ibdata1 ile yayınlayın.

UYARI (veya Robotun Uzayda Kayıp'da söylediği gibi TEHLİKE )

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.

Bu tablo alanı kimliği kavramı hakkında DBA StackExchange iki mesaj yazdım

Eşleşmeyen tablo alanı kimlikleri durumunda .ibd dosyasını ibdata1'e nasıl yeniden bağlayacağınız konusunda mükemmel bir bağlantı: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Bunu okuduktan sonra neden intihar ettiğimi söylediğimi görebilmelisin.

InnoDB için sadece buna ihtiyacınız var

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

InnoDB tablosunun bir kopyasını oluşturmak için. Başka bir DB sunucusuna geçiriyorsanız, mysqldump kullanın.


4
Diğer yanıtlar bunu söyledi, belki de "söylemeye gerek yok" ama yine de söylemek iyi: InnoDB veritabanı boşta olsa bile dosyalara yazmaya devam ediyor, bu yüzden MySQL çalışırken dosyalarını kopyalamak neredeyse bozulmaya yol açacak! Bu sorunu gidermek için kapatabilir, bir dosya sistemi anlık görüntüsü alabilir veya Percona XtraBackup kullanabilirsiniz.
Baron Schwartz

1
Her zamanki gibi mükemmel cevap, @Rolando! Sahip olduğum tek büyük soru: Neden birisi düz bir MySQL dökümü ve içe aktarma yerine bunu yapmak isteyesin ki? Ben tamamen veritabanı boyutu varsayıyorum, ama bu yetiştirilmesi gerektiğini hissediyorum.
JakeGould

1
@JakeGould mysqldump komut dosyasını mysql'e yüklemek, çok sayıda SQL işlemeyi, bir seferde binlerce satır eklemeyi, CPU döngülerini kullanmayı, açıklama planlarını genişletmeyi, dizinleri yeniden oluşturmayı gerektirir (BTree Eklemeler, Yaprak Düğüm Bölmeleri, yeniden dengeleme Anahtarları, her olmayan için bir tablo taraması -benzersiz inşa etmek) sadece aynı tabloyu üretmek için. MyISAM örneğinde, tekerleği neden yeniden icat ettiniz? Sadece kopyasını .frm, .MYDve .MYI.
RolandoMySQLDBA

@JakeGould InnoDB durumunda, tüm InnoDB'yi rsync ile kullanan canlı bir veritabanı kopyalamıştım. Rsync kullanarak kopyaladıktan sonra, mysql bir kapatma koştu, son bir rsync yaptım ve sorunsuz bir şekilde mysql yeniden başlattı. Daha önce olduğu gibi bir yazı yazdım: serverfault.com/questions/288140/…
RolandoMySQLDBA

8

Tüm MySQL veri dizinini kopyalamak, MySQL hizmetinin durdurulduğunu ve tüm veritabanı sunucusunun kopyalanmasını istediğinizi varsayarak pratik bir tekniktir.

Bu, büyük dizinleri olan veritabanlarını kaydırmak için kullanışlı bir tekniktir ve mysql dökümü, içe aktarma sırasında yeniden oluşturulması gereken dizinleri içermez. MySQL köleleri kurarken bu tekniği faydalı buldum.

Tek bir dosyayı kopyalamak, kullanılan tablo şemasına bağlıdır, ancak çoğu durumda uygun bir çözüm değildir.


2
Sunmak için: hizmeti kendi başınıza durdurmak zorunda değilsiniz, dosya sisteminiz yeterliyse, bir LVM anlık görüntüsü gerçekleştirebilir ve bundan yedekleyebilirsiniz; veya dosya sisteminin kendisini dondurun.
incele

Bir kişisel çalışmama süresini yiyebildiği sürece, bu en kolay yoldur. +1 !!!
RolandoMySQLDBA

2

Kullanım xtrabackup / akış s / y innobackupex sarma ağırlık ve myisam ve innodb veritabanlarının ince olacaktır. Innodb veritabanlarını geri yüklemenin, xtrabackup kullansanız bile dosyaları geri kopyalamakla kalmayacağını unutmayın. Daha fazla bilgiye ihtiyacınız olup olmadığını söyleyin


1

Hayır, mysqdump ile yedekleme yapmalı ve mysql cli yardımcı programı ile geri yüklemelisiniz, sadece tablo yapısını kopyaladığınız frm dosyasını kopyalayıp içerideki verileri kopyalamalısınız ve innodb kopyasındaysanız doğrudan dosya mümkün değildir.

En iyi yol dökümü ve tabloyu geri yüklemektir.

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.