İki MySQL veritabanını karşılaştırın [kapalı]


368

Şu anda MySQL veritabanı kullanarak bir uygulama geliştiriyorum.

Veritabanı yapısı hala geliştirme aşamasında değişiyor ve değişiyor (Yerel kopyamı değiştiriyorum, bunu test sunucusunda yalnız bırakıyorum).

Herhangi bir değişiklik olup olmadığını görmek için veritabanının iki örneğini karşılaştırmanın bir yolu var mı?

Şu anda sadece önceki test sunucusu veritabanını atmak iyidir, ancak test test verilerine girmeye başladığında biraz zor olabilir.
Aynı şey daha sonra tekrar üretimde olacak ...

Tercihen değiştirilecek bir komut dosyası oluşturarak, üretim veritabanında aşamalı olarak değişiklik yapmanın kolay bir yolu var mı?


Cevaplarda belirtilen araçlar:


4
RedGate'in araçlarının sadece SQL Server için olduğuna inanıyorum.
Dave R.

4
Red Gate'in şimdi de MySQL sürümü var, şu anda genişletilmiş erken erişimde olduğu gibi ücretsiz: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson

2
Bu gerçek bir problem. Geliştirme'den üretim makinesine konuşlandırıyorum ve DAİMA bir şeyler kırar. Bu bilgilendirici gönderi için teşekkür ederiz
Herr

1
Redgate'in MySQL aracı artık 70 $ / kullanıcı. Bu fiyata bile, burada değerlendirir ve yorum gönderirim.
Jeremy McGee

Ayrıca şimdi gerekli, bir alanın boyutunu artırmak zorunda kaldı. Sadece artırmak ve her şeyin yolunda olduğundan şüphelenmek istemiyordu. @Jared tam olarak ne kullandığımı önerdi.
Tass

Yanıtlar:


210

SQL veritabanlarını oluşturmak için --skip-commentsve her iki veritabanında da mysqldump çalıştırdığımı bulduğum küçük veritabanlarıyla --skip-extended-insertçalışıyorsanız, SQL komut dosyalarında diff'i çalıştırmak oldukça iyi çalışır.

Yorumları atlayarak mysqldump komutunu çalıştırdığınız zaman gibi anlamsız farklılıklardan kaçınırsınız. --skip-extended-insertKomutu kullanarak, her satırın kendi insert deyimiyle eklendiğinden emin olursunuz. Bu, yeni veya değiştirilmiş tek bir kaydın gelecekteki tüm ekleme ifadelerinde zincirleme reaksiyona neden olabileceği durumu ortadan kaldırır. Bu seçeneklerle çalışmak, yorum yapmadan daha büyük dökümler üretir, bu nedenle bu muhtemelen üretim kullanımında yapmak istediğiniz bir şey değildir, ancak geliştirme için iyi olmalıdır. Aşağıda kullandığım komutlara örnekler verdim:

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql

12
Komut satırı okuryazarlığı için çift artı upvotes !!!
dogenpunk

5
Karşılaştırmak verileri , bu yerine kullanın; hala bazı MySQL4 + karakter setleri, vb hakkında yorumlarmysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d, --no-dataüretim kullanımına ihtiyaç duyanların ilgisini çekebilir , ancak yalnızca şemayı önemsiyor olabilir
Louis

7
Kullanmak için daha iyi bir araç , Windows, Linux veya Mac'te kullanabileceğiniz MySQL tarafından geliştirilen mysqldbcompare yardımcı programı olacaktır - hem veri hem de şema değişiklikleri için SQL ifadeleri çıkarabilir ve basit bir komut satırı farkının yapabileceğinden çok daha fazla test yapabilir belirler.
Jasdeep Khalsa

4
Renkler ile güzel bir fark için deneyinvimdiff
gitaarik

99

MySQL için kurbağa veri ve şema karşılaştırma özellikleri vardır ve hatta bir senkronizasyon komut dosyası oluşturacağına inanıyorum. En iyisi, ücretsiz.


2
Bahsedilen tüm araçlar iyi görünüyor. Daha fazla araştırma yapana kadar şimdilik Toad'ı keyfi olarak seçiyorum.
Vincent Ramdhanie

64
Linux'ta değil, pencerelerde çalıştığını anlayana kadar bu araç hakkında heyecanlandım.
Aramaya

2
Benim için harika çalıştı. Yapmam gereken her şeyi yaptım ve değişen kayıtlar için vurgulanan hücreler neyin değiştiğini görmeyi kolaylaştırdı.
Thames

4
Seçenekler ile mysqldbcompare --run-all-tests --difftype sql --disable-binary-logginghemen hemen aynı işi yapabilir (çıktı yorum ile karıştırılır ve dizedeki özel karakterler kaçmaz ).
şemalar

4
@Anson Smith Bana linux için alternatif söyleyebilir misiniz?
Visruth

20

Navicat adlı bir yazılım kullanıyorum:

  • Canlı veritabanlarını test veritabanlarımla senkronize et.
  • İki veritabanı arasındaki farkları göster.

Paraya mal olur, sadece pencereler ve mac'tur ve whacky bir kullanıcı arayüzü var, ama beğendim.


Linux üzerinde çalışır. Şu anda başka bir masaüstünde açıyorum. Şema değişikliklerini dev-> test-> live'dan aktarmak için yapı senkronizasyonu özelliği yalnızca lisans ücretine değer.
Albay Sponsz

2
Güzel yakala, bu özelliklere sahip olduğunu bile bilmiyordum. Mac'te şu ana kadar en iyi şey.
Hendra Uzia

Yerel sql dosyaları değil, yalnızca sunucularda yaşayan veritabanlarını karşılaştırıyor gibi görünüyor
AlxVallejo

@seanyboy, Neden saçmalık kullanıcı arayüzünü seviyorsun?
Pacerier

17

SQLyog'da (ticari), iki veritabanını senkronize etmek için SQL üreten bir Şema Senkronizasyon Aracı bulunmaktadır .

resim açıklamasını buraya girin


1
Evet, bu benim için şimdiye kadar en iyi çözüm, her zaman, her yerde güncelleyebilirsiniz böylece ince SQL senkronizasyon sorguları sağlar ..
Anupam

aşırı pahalı ve ağır, gerçeği sonrası patchings için iyi değil
zanlok

1
Çok yavaş ve bir nedenden dolayı ihtiyaç duyulmasa bile çok fazla yabancı anahtar düşüyor ve yeniden yaratıyor. İlerlemeyi takip etmenin yolu yok.
Artem Goutsoul

13

Özellik karşılaştırma listesinden ... MySQL Workbench , topluluk sürümlerinde Schema Diff ve Schema Synchronization sunuyor.


7
Harika çalışıyor! Ve ücretsiz, teşekkürler. Bulamayanlar için (Benim gibi). Buradasınız: Veritabanı -> Ters Mühendislik -> MySQL Model veya EER Diyagramında -> Veritabanı -> Herhangi bir kaynak ile senkronize
bentzy

İyi çalışıyor. Ancak yalnızca aynı addaki veritabanlarını karşılaştırabilirsiniz. Aynı ana bilgisayardaki "ana" sürümden eşitlemek istediğim birden çok (çok kiracılı istemci) veritabanım var. Bu yüzden senkronize etmeden önce her istemci db eşleştirmek için master yeniden adlandırmak zorunda. Aksi takdirde güzel!
scipilot


13

Kesinlikle birçok yol var, ama benim durumumda döküm ve diff komutunu tercih ediyorum. İşte Jared'ın yorumuna dayanan bir senaryo:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Geribildirim açığız :)



11

Yalnızca şemaları (veriyi değil) karşılaştırmanız ve Perl'e erişiminiz varsa, mysqldiff işe yarayabilir. Bunu kullandım çünkü yerel veritabanlarını uzak veritabanlarıyla (SSH aracılığıyla) karşılaştırmanıza izin veriyor, bu yüzden herhangi bir veriyi boşaltmak zorunda değilsiniz.

http://adamspiers.org/computing/mysqldiff/

İki veritabanını senkronize etmek için SQL sorguları oluşturmaya çalışacaktır, ancak buna güvenmiyorum (veya aslında herhangi bir araç). Bildiğim kadarıyla, özellikle birden fazla değişiklik yapıldığında, bir veritabanı şemasını diğerine dönüştürmek için gerekli değişiklikleri tersine mühendislik için% 100 güvenilir bir yol yoktur.

Örneğin, yalnızca bir sütunun türünü değiştirirseniz, otomatik bir araç bunu nasıl yeniden oluşturacağınızı kolayca tahmin edebilir. Ancak sütunu da taşırsanız, yeniden adlandırır ve diğer sütunları ekler veya kaldırırsanız, herhangi bir yazılım paketinin yapabileceği en iyi şey muhtemelen ne olduğunu tahmin etmektir. Ve sonunda veri kaybedebilirsiniz.

Geliştirme sunucusunda yaptığınız şema değişikliklerini izlemenizi, ardından bu ifadeleri canlı sunucuda el ile çalıştırmanızı (veya bunları bir yükseltme komut dosyasına veya geçişine yuvarlamanızı) öneririm. Daha sıkıcı, ancak verilerinizi güvende tutacaktır. Ve son kullanıcıların sitenize erişmesine izin vermeye başladığınızda, gerçekten sürekli ağır veritabanı değişiklikleri yapacak mısınız?


Her iki sağlamak unutma --hostNve --userNya sessizce başarısız.
Znarkus

Oracle'ın mysqldbcompare araçlarında dizinler üzerinde hatalar üreten ve eşdeğer alanları değiştirme ile sorun yaşadım. Mysqldiff aracı kusursuz çalıştı ve biraz zaman kazandırdı.
Robert K


6

kontrol: http://schemasync.org/ schemasync aracı benim için çalışıyor, linux komut satırında kolayca çalışan bir komut satırı aracıdır


1
Eğer bir mac üzerine bu yükleme konusunda sorun yaşıyorsanız, sadece boşuna macports ile, homebrew kullanarak mysql ve python yükleyerek başardı.
Bijou Trouvaille


3

Maatkit adında perl kullanılarak yazılmış yararlı bir araç var . Diğer şeylerin yanı sıra çeşitli veritabanı karşılaştırma ve senkronizasyon araçlarına sahiptir.


Bu projeyi bilmiyordum! Teşekkürler, son derece yararlı olacak birkaç araç var gibi görünüyor.
Vincent Ramdhanie

2
Maatkit'te şema karşılaştırma araçları bulamadım.
stepancheg

Ben de - bunu araçların neresinde bulabiliriz?
Shabbyrobe

Orada şema karşılaştırması olduğunu sanmıyorum. Mk-table-checksum ve mk-table-sync kullanarak veri karşılaştırma ve senkronizasyondan bahsediyordum
Jarod Elliott

süreç üzerinde çalışıyor code.google.com/p/maatkit/wiki/mk_schema_sync
droope


3

Kendim için, her iki veritabanını daldırma ve dökümleri dağıtma ile başlayacağım, ancak otomatik olarak birleştirme komut dosyaları oluşturmak istiyorsanız, gerçek bir araç almak isteyeceksiniz.

Basit bir Google araması aşağıdaki araçları getirdi:


3

MySQL için dbForge Data Compare'e göz atın . 30 günlük ücretsiz deneme süresine sahip bir shareware. Veri karşılaştırma ve senkronizasyon, veri farklılıklarının yönetimi ve özelleştirilebilir senkronizasyon için hızlı bir MySQL GUI aracıdır.

MySQL için dbForge Verileri Karşılaştırması


3

Web üzerinde basit bir araç için saatlerce arama yaptıktan sonra, Ubuntu Yazılım Merkezi'ne bakmadım. İşte bulduğum ücretsiz bir çözüm: http://torasql.com/ Onlar da Windows için bir sürüm var iddia, ama ben sadece Ubuntu altında kullanıyorum.

Düzenleme: 2015-Şubat-05 Windows aracına ihtiyacınız varsa, TOAD mükemmel ve ücretsizdir: http://software.dell.com/products/toad-for-mysql/


2
Bu aracın geliştirilmesi durdu ve şimdi Percona'ya dahil edildi: percona.com/software/percona-toolkit
mrmuggles

2

Apache zeta bileşenleri kütüphanesi, PHP 5 tabanlı uygulamaların geliştirilmesi için gevşek bağlı bileşenlerin genel amaçlı bir kütüphanesidir.

eZ Bileşenleri - DatabaseSchema şunları yapmanızı sağlar:

   Bir veritabanı şeması tanımı oluşturun / kaydedin;
   Veritabanı şemalarını karşılaştırın;
   Senkronizasyon sorguları oluşturun;

Eğiticiyi buradan kontrol edebilirsiniz: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html


2

Kullanımı çok kolay karşılaştırma ve senkronizasyon aracı:
Veritabanı Karşılaştırıcısı http://www.clevercomponents.com/products/dbcomparer/index.asp

Avantajları:

  • hızlı
  • kullanımı kolay
  • uygulamak için değişiklikleri seçmek kolay

Dezavantajları:

  • uzunluğu küçük ints ile senkronize etmez
  • dizin adlarını düzgün senkronize etmiyor
  • yorumları senkronize etmiyor

Doğru, 5 yıl içinde birkaç küçük değişiklikle yüzeysel bir güncelleme yaptılar. Ancak aktif olarak geliştirilmiyor.
Artem Goutsoul

1

Sanırım MySQL için Navicat bu durum için yararlı olacaktır. MySQL için Veri ve Yapı Senkronizasyonunu destekler. resim açıklamasını buraya girin


0

Sorunun ilk kısmı için, her ikisini de döküyorum ve onları ayırıyorum. Mysql hakkında emin değilim, ancak postgres pg_dump, şemayı tablo içeriği olmadan dökümü için bir komutu vardır, böylece şemayı değiştirip değiştirmediğinizi görebilirsiniz.


MySQL, mysql_dump komutuna benzer bir komuta sahiptir. Bir dağıtım sürecine entegre edebilseydim bu bir çözüm olabilir. Teşekkürler.
Vincent Ramdhanie

Ayrıca, daha kullanıcı dostu bir deneyim için, MySQL kullanıcıları için gerçek bir katil olan phpMyAdmin'i kullanarak aynı şeyi elde edebilirsiniz!
schonarth

Özdeş şemalar kolayca farklı şema dökümlerine neden olabilir. Mysql istemcisinin farklı sürümleri biraz farklı dökümler üretebilir (iki farklı makineden şemaları karşılaştırıyorsanız bir sorun) ve yabancı anahtarlar ve kısıtlamalar gibi şeyler farklı bir sırayla dökülebilir.
Mark E. Haase

0

Nob Hill'in Pazarlama ekibiyle çalışıyorum, sorularınızı, önerilerinizi veya başka bir şeyi duymaktan mutluluk duyacağımı söylemek istedim, lütfen benimle iletişime geçmekten çekinmeyin.

Başlangıçta aracımızı sıfırdan yaratmaya karar verdik çünkü piyasada böyle ürünler varken hiçbiri işi doğru yapmıyor. Veritabanları arasındaki farkları göstermek oldukça kolaydır. Aslında bir veritabanını diğeri gibi yapmak başka bir şeydir. Hem şema hem de verilerin düzgün şekilde taşınması her zaman zor olmuştur. Burada başardık.
Size sorunsuz bir geçiş sağlayabileceğinden çok eminiz - oluşturduğu geçiş komut dosyaları yeterince okunamıyorsa veya sizin için çalışmazsa ve beş iş günü içinde çözemeyiz - kendi ücretsiz kopyanızı alacaksınız!

http://www.nobhillsoft.com/NHDBCompare.aspx


bu bir söz mü? Denedim ve adil bir kaç hata ile düştü, en azından bir işlevi taşırken orijinal veritabanı ile aynı sahibi kullanmaya çalışır
Cruachan

Evet bu bir söz. Çoğu insan için araç gayet iyi çalışıyor. Bulduğunuz herhangi bir hata için ömür boyu bir lisans sözü veriyoruz ve 5 iş günü içinde düzeltemiyoruz. Lütfen destek ekibimizle iletişime geçin.
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.