Bandingkan dua database MySQL [tertutup]

368

Saat ini saya sedang mengembangkan aplikasi menggunakan database MySQL.

Struktur basis data masih dalam fluks dan berubah sementara pengembangan berlangsung (saya mengubah salinan lokal saya, meninggalkan yang ada di server-test sendirian).

Apakah ada cara untuk membandingkan dua contoh dari database untuk melihat apakah ada perubahan?

Meskipun saat ini hanya membuang database server pengujian sebelumnya baik-baik saja, karena pengujian mulai memasukkan data pengujian, ini bisa menjadi sedikit rumit.
Hal yang sama meskipun lebih akan terjadi lagi nanti dalam produksi ...

Apakah ada cara mudah untuk secara bertahap membuat perubahan pada basis data produksi, lebih disukai dengan secara otomatis membuat skrip untuk memodifikasinya?


Alat yang disebutkan dalam jawaban:

Vincent Ramdhanie
sumber
4
Saya percaya alat RedGate hanya untuk SQL Server.
Dave R.
4
Red Gate sekarang memiliki versi MySQL juga, saat ini gratis karena sedang dalam akses awal yang diperpanjang: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson
2
Ini masalah nyata. Saya menyebarkan dari dev ke mesin produksi dan SELALU merusak sesuatu. Terima kasih atas pos informatif ini
Herr
1
Alat MySQL dari Redgate sekarang $ 70 / pengguna. Bahkan pada harga itu saya akan mengevaluasi dan mengirim komentar di sini.
Jeremy McGee
Juga membutuhkan ini sekarang, harus meningkatkan ukuran bidang. Tidak ingin hanya meningkatkannya dan curiga semuanya baik-baik saja. @ Jared menyarankan apa yang saya gunakan.
Tass

Jawaban:

210

Jika Anda bekerja dengan database kecil saya telah menemukan menjalankan mysqldump pada kedua database dengan --skip-commentsdan --skip-extended-insertopsi untuk menghasilkan skrip SQL, kemudian menjalankan diff pada skrip SQL berfungsi dengan baik.

Dengan melewatkan komentar, Anda menghindari perbedaan yang tidak berarti seperti saat Anda menjalankan perintah mysqldump. Dengan menggunakan --skip-extended-insertperintah, Anda memastikan setiap baris dimasukkan dengan pernyataan sisipannya sendiri. Ini menghilangkan situasi di mana satu catatan baru atau modifikasi dapat menyebabkan reaksi berantai dalam semua pernyataan penyisipan masa depan. Menjalankan dengan opsi-opsi ini menghasilkan kesedihan yang lebih besar tanpa komentar sehingga ini mungkin bukan sesuatu yang ingin Anda lakukan dalam penggunaan produksi tetapi untuk pengembangan itu harus baik-baik saja. Saya telah memberikan contoh perintah yang saya gunakan di bawah ini:

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
Jared
sumber
12
Suara ganda-plus untuk literasi baris perintah !!!
dogenpunk
5
Untuk membandingkan data , gunakan ini sebagai gantinya; masih ada beberapa komentar MySQL4 + tentang set karakter, dll.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok
41
-d, --no-datamungkin menarik bagi mereka yang membutuhkan penggunaan produksi tetapi hanya peduli dengan skema
Louis
7
Alat yang lebih baik untuk digunakan adalah utilitas mysqldbcompare yang dikembangkan oleh MySQL sendiri yang dapat Anda gunakan di Windows, Linux atau Mac - itu juga dapat menampilkan pernyataan SQL untuk perubahan data DAN skema dan melakukan lebih banyak tes daripada yang bisa dilakukan oleh baris perintah sederhana. menentukan.
Jasdeep Khalsa
4
Untuk perbedaan yang bagus dengan warna, cobavimdiff
gitaarik
99

Kodok untuk MySQL memiliki fitur perbandingan data dan skema, dan saya yakin itu akan membuat skrip sinkronisasi. Yang terbaik dari semuanya, ini freeware.

Anson Smith
sumber
2
Semua alat yang disebutkan terlihat bagus. Saya memilih Toad secara sewenang-wenang untuk saat ini sampai saya dapat melakukan penelitian lebih lanjut.
Vincent Ramdhanie
64
Saya sangat senang dengan alat ini sampai saya menyadari bahwa itu berjalan di windows, bukan linux. Kembali ke pencarian ...
jdias
2
Bekerja fantastis untukku. Melakukan semua yang saya butuhkan untuk dilakukan dan sel yang disorot untuk catatan yang diubah membuatnya mudah untuk melihat apa yang berubah.
thames
4
mysqldbcompare dengan --run-all-tests --difftype sql --disable-binary-loggingopsi dapat melakukan pekerjaan yang hampir sama (kecuali output dicampur dengan komentar, dan karakter khusus dalam string tidak lolos).
schemacs
4
@Anson Smith Bisakah Anda memberi tahu saya alternatif untuk linux?
Visruth
20

Saya menggunakan perangkat lunak yang disebut Navicat untuk:

  • Sinkronkan basis data Langsung ke basis data pengujian saya.
  • Tampilkan perbedaan antara kedua basis data.

Harganya uang, hanya untuk Windows dan Mac, dan UInya bagus, tapi saya suka.

seanyboy
sumber
Itu berjalan di Linux. Saya sudah buka di desktop lain saat ini. Fitur sinkronisasi struktur untuk mendorong perubahan skema dari dev-> test-> live bernilai biaya lisensi saja.
Kolonel Sponsz
2
Tangkapan yang bagus, saya bahkan tidak tahu itu memiliki fitur-fitur itu. Ini adalah hal terbaik di mac sejauh ini.
Hendra Uzia
Tampaknya hanya membandingkan database yang hidup di server, bukan file sql asli
AlxVallejo
@seanyboy, Kenapa kamu suka UI yang aneh?
Pacerier
17

Ada Alat Sinkronisasi Skema di SQLyog (komersial) yang menghasilkan SQL untuk menyinkronkan dua database.

masukkan deskripsi gambar di sini

Yury Litvinov
sumber
1
ya ini adalah solusi terbaik sejauh ini bagi saya, memberikan pertanyaan sinkronisasi SQL yang baik sehingga Anda dapat memperbaruinya kapan saja, di mana saja ..
Anupam
terlalu mahal dan berat, tidak baik untuk tambalan setelah fakta
zanlok
1
Sangat lambat, dan untuk beberapa alasan ia menjatuhkan dan menciptakan kembali banyak kunci asing bahkan ketika itu tidak diperlukan. Tidak ada cara untuk mengikuti kemajuan.
Artem Goutsoul
13

Dari daftar perbandingan fitur ... MySQL Workbench menawarkan Skema Diff dan Skema Sinkronisasi dalam edisi komunitas mereka.

andyhky
sumber
7
Bagus sekali! Dan gratis, terima kasih. Bagi mereka yang tidak dapat menemukannya (Seperti saya). Itu ada di sini: Database -> Reverse Engineer -> Dalam Model MySQL atau Diagram EER -> Database -> Sinkronisasi dengan sumber apa pun
bentzy
Itu bekerja dengan baik. Namun Anda hanya dapat membandingkan database dengan nama yang sama. Saya memiliki beberapa basis data (klien multi-tenant) yang ingin saya sinkronkan dari versi "master" pada host yang sama. Jadi saya harus mengganti nama master agar cocok dengan setiap klien db sebelum menyinkronkan. Jika tidak bagus!
scipilot
Info tambahan tentang ini dapat ditemukan di tautan
Steven Ryssaert
13

Ada banyak cara tentu saja, tetapi dalam kasus saya, saya lebih suka perintah dump dan diff. Jadi ini skrip berdasarkan komentar Jared:

#!/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

Umpan balik diterima :)

develCuy
sumber
12

dbSolo, dibayar tetapi fitur ini mungkin yang Anda cari http://www.dbsolo.com/help/compare.html

Ia bekerja dengan Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 dan MySQL teks alternatif

jmpeace
sumber
ini persis apa yang saya cari! Luar biasa!
Josh Nankin
11

Jika Anda hanya perlu membandingkan skema (bukan data), dan memiliki akses ke Perl, mysqldiff mungkin berfungsi. Saya telah menggunakannya karena memungkinkan Anda membandingkan basis data lokal dengan basis data jauh (melalui SSH), jadi Anda tidak perlu repot membuang data apa pun.

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

Ini akan berusaha untuk menghasilkan query SQL untuk menyinkronkan dua database, tapi saya tidak percaya itu (atau alat apa pun, sebenarnya). Sejauh yang saya tahu, tidak ada cara yang dapat diandalkan 100% untuk merekayasa balik perubahan yang diperlukan untuk mengubah satu skema basis data ke skema lainnya, terutama ketika banyak perubahan telah dibuat.

Misalnya, jika Anda hanya mengubah jenis kolom, alat otomatis dapat dengan mudah menebak cara membuatnya kembali. Tetapi jika Anda juga memindahkan kolom, mengganti nama, dan menambah atau menghapus kolom lain, paket perangkat lunak terbaik yang bisa dilakukan adalah menebak apa yang mungkin terjadi. Dan Anda mungkin kehilangan data.

Saya sarankan untuk melacak setiap perubahan skema yang Anda buat ke server pengembangan, kemudian menjalankan pernyataan tersebut secara langsung di server langsung (atau mengubahnya menjadi skrip pemutakhiran atau migrasi). Ini lebih membosankan, tetapi itu akan menjaga data Anda aman. Dan pada saat Anda mulai mengizinkan pengguna akhir mengakses situs Anda, apakah Anda benar-benar akan membuat perubahan database berat yang konstan?

Zac
sumber
Jangan lupa untuk menyediakan keduanya --hostNdan --userNatau itu akan gagal secara diam-diam.
Znarkus
Saya mengalami masalah dengan alat mysqldbcompare Oracle yang menghasilkan bug pada indeks, dan mengubah bidang yang setara. Alat mysqldiff bekerja dengan sempurna dan menghemat banyak waktu.
Robert K
6

periksa: http://schemasync.org/ alat schemasync bekerja untuk saya, itu adalah alat baris perintah bekerja dengan mudah di baris perintah linux

likeuclinux
sumber
1
Jika Anda mengalami kesulitan menginstal ini pada mac, saya hanya dapat menginstal mysql dan python menggunakan homebrew, dengan macports tidak berhasil.
Bijou Trouvaille
3

Ada alat yang berguna ditulis menggunakan perl yang disebut Maatkit . Ini memiliki beberapa perbandingan database dan alat sinkronisasi antara lain.

Jarod Elliott
sumber
Saya tidak tahu tentang proyek ini! Terima kasih, sepertinya ada beberapa alat yang akan sangat berguna.
Vincent Ramdhanie
2
Saya belum menemukan alat perbandingan skema di Maatkit.
stepancheg
Saya juga tidak - di mana dalam alat yang kita temukan ini?
Shabbyrobe
Saya tidak berpikir ada skema perbandingan di sana. Saya merujuk pada perbandingan data dan sinkronisasi menggunakan mk-table-checksum dan mk-table-sync
Jarod Elliott
ini sedang dalam proses code.google.com/p/maatkit/wiki/mk_schema_sync
droope
3

Untuk saya sendiri, saya akan mulai dengan membuang kedua database dan membedakan dump, tetapi jika Anda ingin skrip gabungan yang dibuat secara otomatis, Anda akan ingin mendapatkan alat nyata.

Pencarian Google sederhana muncul alat berikut:

Craig Trader
sumber
3

Lihatlah dbForge Data Compare untuk MySQL . Ini adalah shareware dengan masa uji coba 30 hari gratis. Ini adalah alat MySQL GUI yang cepat untuk perbandingan dan sinkronisasi data, pengelolaan perbedaan data, dan sinkronisasi yang dapat disesuaikan.

dbForge Data Compare untuk MySQL

Devart
sumber
3

Setelah berjam-jam mencari di web untuk alat sederhana, saya menyadari saya tidak mencari di Ubuntu Software Center. Ini adalah solusi gratis yang saya temukan: http://torasql.com/ Mereka mengklaim memiliki versi untuk Windows juga, tapi saya hanya menggunakannya di Ubuntu.

Sunting: 2015-Feb-05 Jika Anda memerlukan alat Windows, TOAD sempurna dan gratis: http://software.dell.com/products/toad-for-mysql/

Nikolay Ivanov
sumber
2
Pengembangan alat ini berhenti dan sekarang termasuk dalam Percona: percona.com/software/percona-toolkit
mrmuggles
2

Alat perbandingan dan sinkronisasi yang sangat mudah digunakan:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

Keuntungan:

  • cepat
  • mudah digunakan
  • mudah untuk memilih perubahan untuk diterapkan

Kekurangan:

  • tidak menyinkronkan panjang ke int kecil
  • tidak menyinkronkan nama indeks dengan benar
  • tidak menyinkronkan komentar
Artem Goutsoul
sumber
Benar, mereka telah membuat pembaruan yang dangkal dengan beberapa perubahan kecil dalam 5 tahun. Tetapi tidak sedang dikembangkan secara aktif.
Artem Goutsoul
1

Saya pikir Navicat untuk MySQL akan membantu untuk kasus ini. Ini mendukung Sinkronisasi Data dan Struktur untuk MySQL. masukkan deskripsi gambar di sini


sumber
0

Untuk bagian pertama dari pertanyaan, saya hanya melakukan dump keduanya dan diff mereka. Tidak yakin tentang mysql, tetapi postgre pg_dump memiliki perintah untuk hanya membuang skema tanpa isi tabel, sehingga Anda dapat melihat apakah Anda telah mengubah skema apa pun.

Paul Tomblin
sumber
MySQL memiliki perintah serupa mysql_dump. Ini mungkin solusi jika saya bisa mengintegrasikannya dalam proses penyebaran. Terima kasih.
Vincent Ramdhanie
Juga, untuk pengalaman yang lebih ramah pengguna, Anda bisa mendapatkan yang sama menggunakan phpMyAdmin - pembunuh nyata bagi pengguna MySQL!
schonarth
Skema identik dapat dengan mudah menghasilkan berbagai skema pembuangan. Versi berbeda dari klien mysql mungkin menghasilkan dump yang sedikit berbeda (masalah jika Anda membandingkan skema dari dua mesin yang berbeda), dan hal-hal seperti kunci dan batasan asing dapat dibuang dalam urutan yang berbeda.
Mark E. Haase
0

Saya bekerja dengan tim Pemasaran Nob Hill, saya ingin memberi tahu Anda bahwa saya akan senang mendengar pertanyaan Anda, saran atau apa pun, jangan ragu untuk menghubungi saya.

Kami awalnya memutuskan untuk membuat alat kami dari awal karena sementara ada produk lain di pasaran, tidak ada yang melakukan pekerjaan dengan benar. Sangat mudah untuk menunjukkan kepada Anda perbedaan antara database. Ini benar-benar lain untuk benar-benar membuat satu database seperti yang lain. Migrasi yang lancar, baik skema dan data, selalu menjadi tantangan. Ya, kita sudah mencapainya di sini.
Kami sangat yakin bahwa ini dapat memberi Anda migrasi yang lancar, daripada jika tidak - jika skrip migrasi yang dihasilkannya tidak cukup mudah dibaca atau tidak akan berfungsi untuk Anda, dan kami tidak dapat memperbaikinya dalam lima hari kerja - Anda akan mendapatkan salinan gratis Anda sendiri!

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


sumber
apakah itu janji? Saya mencobanya dan jatuh dengan beberapa kesalahan, tidak sedikit bahwa ketika melakukan migrasi fungsi itu mencoba untuk menggunakan pemilik yang sama dengan database asli
Cruachan
Ya itu sebuah janji. Bagi kebanyakan orang alat ini berfungsi dengan baik. Kami menjanjikan lisensi seumur hidup untuk bug apa pun yang Anda temukan dan kami tidak dapat memperbaikinya dalam waktu 5 hari kerja. Silakan hubungi tim dukungan kami.