Bagaimana Anda versi skema database Anda? [Tutup]

128

Bagaimana Anda mempersiapkan delta SQL Anda? apakah Anda secara manual menyimpan setiap skema yang mengubah SQL ke folder delta, atau apakah Anda memiliki semacam proses pembedaan otomatis?

Saya tertarik pada konvensi untuk versi skema database bersama dengan kode sumber. Mungkin kait pra-komit yang membedakan skema?

Juga, opsi apa untuk delta berbeda yang ada selain DbDeploy ?

EDIT: melihat jawaban yang ingin saya klarifikasi bahwa saya terbiasa dengan skema standar untuk menjalankan migrasi database menggunakan delta. Pertanyaan saya adalah tentang bagaimana membuat delta sendiri, lebih disukai secara otomatis.

Juga, versi untuk PHP dan MySQL jika ada bedanya. (Tolong, tidak ada solusi Ruby).

Eran Galperin
sumber
Saya menggunakan schemasync untuk menghasilkan tambalan (dan skrip rollback). Ini ditambahkan ke repo SVN. Itu tidak sempurna tetapi itu bekerja dengan baik untuk saya. Plus, menyebarkan perubahan skema cukup mudah dengan schemasync
Jay Sidri
Tautan ini tampak kosong - apakah ini masih ada?
jocull
Sepertinya sudah dipindahkan: github.com/mmatuson/SchemaSync
Jay Sidri

Jawaban:

61

Lihat

Apakah ada sistem kontrol versi untuk perubahan struktur basis data?

Bagaimana cara versi database MS SQL saya di SVN?

dan artikel Jeff

Dapatkan Database Anda Di Bawah Kontrol Versi

Saya merasakan sakit Anda, dan saya berharap ada jawaban yang lebih baik. Ini mungkin lebih dekat dengan apa yang Anda cari.

Mekanisme untuk melacak perubahan skema DB

Secara umum, saya merasa tidak ada solusi yang memadai dan diterima untuk ini, dan saya menggulirkan solusi saya sendiri di area ini.

harpo
sumber
Seperti yang Anda tahu dari pertanyaan saya, saya tahu konsep delta. Pertanyaan saya adalah tentang konvensi untuk membuatnya, lebih disukai secara otomatis.
Eran Galperin
Saya kira saya akan menggulung sendiri kemudian ...;)
Eran Galperin
Sudahkah Anda mencoba DBDiff: github.com/DBDiff/DBDiff ? Ini cocok untuk apa yang Anda cari @EranGalperin karena melakukan migrasi otomatis untuk skema dan data dalam SQL. Pengungkapan Saya adalah pengembang di belakangnya!
Jasdeep Khalsa
4

Jika Anda masih mencari opsi: lihat desainer neXtep. Ini adalah lingkungan pengembangan basis data GPL gratis berdasarkan konsep kontrol versi. Di lingkungan Anda selalu bekerja dengan entitas berversi dan dapat fokus pada pengembangan model data. Setelah rilis selesai, mesin pembangkitan SQL yang terpasang pada sistem kontrol versi dapat menghasilkan delta yang Anda perlukan di antara 2 versi, dan akan menawarkan Anda beberapa mekanisme pengiriman jika Anda membutuhkannya.

Antara lain, Anda dapat menyinkronkan dan membalikkan sinkronisasi database Anda selama pengembangan, membuat diagram model data, query database Anda menggunakan klien SQL terintegrasi, dll.

Lihat wiki untuk informasi lebih lanjut: http://www.nextep-softwares.com/wiki

Saat ini mendukung Oracle, MySql dan PostgreSql dan berada di java sehingga produk berjalan di windows, linux dan mac.

Christophe Fondacci
sumber
3

Saya memastikan bahwa perubahan skema selalu aditif. Jadi saya tidak menjatuhkan kolom dan tabel, karena itu akan zap data dan tidak dapat digulirkan kembali nanti. Dengan cara ini kode yang menggunakan database dapat diputar kembali tanpa kehilangan data atau fungsionalitas.

Saya memiliki skrip migrasi yang berisi pernyataan yang membuat tabel dan kolom jika belum ada dan mengisinya dengan data.

Skrip migrasi berjalan setiap kali kode produksi diperbarui dan setelah pemasangan baru.

Ketika saya ingin menjatuhkan sesuatu, saya melakukannya dengan menghapusnya dari skrip instalasi basis data dan skrip migrasi sehingga elemen skema yang usang ini akan secara bertahap dihapus dalam pemasangan baru. Dengan kelemahannya, pemasangan baru tidak dapat menurunkan versi ke versi yang lebih lama sebelum pemasangan.

Dan tentu saja saya menjalankan DDL melalui skrip-skrip ini dan tidak pernah secara langsung pada database untuk menjaga semuanya tetap sinkron.

Calmarius
sumber
2

Saya tidak mengelola delta. Saya membuat perubahan pada database master dan memiliki alat yang membuat skrip build berbasis XML berdasarkan pada database master.

Ketika tiba saatnya untuk memutakhirkan database yang ada, saya memiliki program yang menggunakan skrip build berbasis XML untuk membuat database baru dan tabel kosong. Saya kemudian menyalin data dari database lama menggunakan INSERT INTO x SELECT FROM y dan kemudian menerapkan semua indeks, kendala dan pemicu.

Tabel baru, kolom baru, kolom yang dihapus semuanya ditangani secara otomatis dan dengan beberapa trik kecil untuk menyesuaikan rutinitas penyalinan, saya dapat menangani penggantian nama kolom, perubahan jenis kolom, dan perbaikan dasar lainnya.

Saya tidak akan merekomendasikan solusi ini pada database dengan jumlah data yang besar tetapi saya secara teratur memperbarui database yang lebih dari 1GB dengan 400 tabel.

Darrel Miller
sumber
Ini terdengar agak rumit, terutama ketika berhadapan dengan banyak pengembang. Juga proses pembuatannya terdengar menuntut, dan saya ingin sesederhana mungkin.
Eran Galperin
Saya akui butuh beberapa saat untuk mendapatkan yang benar, tetapi sekarang hampir tidak memerlukan upaya untuk menyiapkan upgrade dan bahkan kurang untuk melakukan satu. Juga, satu hal yang saya sukai adalah saya bisa melakukan perubahan hotfix sementara dan tidak berdampak pada prosedur pemutakhiran. Setiap peningkatan adalah DB baru yang baru.
Darrel Miller
2

Anda tidak menyebutkan RDBMS mana yang Anda gunakan, tetapi jika itu MS SQL Server, Red-Gate's SQL Compare telah sangat diperlukan bagi kami dalam membuat delta antara skrip pembuatan objek.

jalbert
sumber
1
Ini untuk Mysql, saya telah memperbarui pertanyaan saya
Eran Galperin
2

Saya bukan orang yang suka berteriak, tetapi saya telah mengembangkan aplikasi web internal untuk melacak perubahan skema database dan membuat skrip pembaruan berversi.

Alat ini disebut Brasil dan sekarang open source di bawah lisensi MIT. Brasil adalah ruby ​​/ ruby ​​berbasis rel dan mendukung perubahan penempatan ke basis data apa pun yang didukung Ruby DBI (MySQL, ODBC, Oracle, Postgres, SQLite).

Dukungan untuk menempatkan skrip pembaruan di kontrol versi direncanakan.

Joakim Bodin
sumber
Brazil terlihat cukup bagus, terlalu buruk saya menggunakan terutama PHP. Pernah mempertimbangkan porting sistem?
Eran Galperin
1

Kami mengekspor data ke format portabel (menggunakan toolchain kami), lalu mengimpornya ke skema baru. tidak perlu untuk delta SQL. Sangat dianjurkan.

Shachar
sumber
3
Apa format portabel ini? dan bagaimana Anda mengimpornya ke skema baru yang hanya menerapkan perbedaan dari versi sebelumnya?
Eran Galperin
1

Saya menggunakan basis data Firebird untuk sebagian besar pengembangan dan saya menggunakan alat administrasi FlameRobin untuk itu. Ini memiliki opsi yang bagus untuk mencatat semua perubahan. Itu bisa mencatat semuanya ke satu file besar, atau satu file per perubahan basis data. Saya menggunakan opsi kedua ini, dan kemudian saya menyimpan setiap skrip dalam perangkat lunak kontrol versi - sebelumnya saya menggunakan Subversion, sekarang saya menggunakan Git.

Saya berasumsi Anda dapat menemukan beberapa alat MySQL yang memiliki fitur logging yang sama seperti FlameRobin untuk Firebird.

Di salah satu tabel basis data, saya menyimpan nomor versi dari struktur basis data, sehingga saya dapat memutakhirkan basis data dengan mudah. Saya juga menulis skrip PHP sederhana yang mengeksekusi skrip SQL tersebut satu per satu pada basis data target apa pun (jalur basis data dan nama pengguna / kata sandi disediakan pada baris perintah).

Ada juga opsi untuk mencatat semua pernyataan DML (masukkan, perbarui hapus), dan saya mengaktifkannya sambil memodifikasi beberapa data 'default' yang berisi setiap database.

Saya menulis kertas putih yang bagus tentang bagaimana saya melakukan semua ini secara rinci. Anda dapat mengunduh makalah dalam format .pdf bersama dengan skrip PHP demo dari sini .

Milan Babuškov
sumber
1

Saya juga mengembangkan satu set skrip PHP di mana pengembang dapat mengirimkan skrip deltasql mereka ke repositori pusat.

Di salah satu tabel basis data (disebut TBSYNCHRONIZE), saya menyimpan nomor versi skrip yang dieksekusi terakhir, jadi saya dapat memutakhirkan basis data dengan mudah dengan menggunakan antarmuka web atau klien yang dikembangkan dengan tujuan Eclipse.

Antarmuka web memungkinkan untuk mengelola beberapa proyek. Ini mendukung juga basis data "cabang".

Anda dapat menguji aplikasi di http://www.gpu-grid.net/deltasql (jika Anda login sebagai admin dengan kata sandi testdbsync). Aplikasi ini open source dan dapat diunduh di sini: http://sourceforge.net/projects/deltasql

deltasql digunakan secara produktif di Swiss dan India, dan populer di Jepang.

Tiziano Mengotti
sumber
1

Beberapa bulan yang lalu saya mencari alat untuk versi skema MySQL. Saya menemukan banyak alat yang berguna, seperti migrasi Doktrin, migrasi RoR, beberapa alat yang ditulis dalam Java dan Python.

Tapi tidak ada satu pun dari mereka yang memenuhi persyaratan saya.

Persyaratan saya:

  1. Tidak ada persyaratan, kecuali PHP dan MySQL
  2. Tidak ada file konfigurasi skema, seperti schema.yml di Doctrine
  3. Mampu membaca skema saat ini dari koneksi dan membuat skrip migrasi baru, daripada mewakili skema identik di instalasi aplikasi lain.

Saya mulai menulis alat migrasi saya, dan hari ini saya memiliki versi beta.

Silakan, coba, jika Anda tertarik pada topik ini. Kirimkan saya permintaan dan laporan bug di masa mendatang.

Kode sumber: bitbucket.org/idler/mmp/src Gambaran Umum dalam bahasa Inggris: bitbucket.org/idler/mmp/wiki/Ringkasan Rumah di Rusia: antonoff.info/development/mysql-migration-with-php-project

Maxim Antonov
sumber
Anda juga memiliki alat baru: DBV: stackoverflow.com/a/13837473/6309
VonC
1

Saya tertarik dengan topik ini juga.

Ada beberapa diskusi tentang topik ini di wiki Django .

Menariknya, sepertinya CakePHP memiliki skema versi bawaan menggunakan cake schema generateperintah just .

Swaroop CH
sumber
Dari apa yang saya baca tentang solusi kue - ini versi dalam arti yang sangat dasar, namun tidak memiliki kemampuan yang berbeda sehingga tidak ada gunanya bagi saya.
Eran Galperin
1

Untuk MySQL

Ketika saya mendarat di DB baru:

Pertama, saya memeriksa struktur:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Berkat pengguna stackoverflow saya dapat menulis skrip cepat ini untuk menemukan perbedaan struktur.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

Pada langkah kedua, saya memeriksa data, tabel dengan tabel dengan mysqldiff. Agak kuno tapi loop PHP berdasarkan information_schemadata membuat pekerjaan pasti

Untuk versi, saya menggunakan cara yang sama tetapi saya memformat skrip pembaruan SQL (untuk memutakhirkan atau mengembalikan) dengan hasil yang berbeda dan saya menggunakan konvensi nomor versi (dengan beberapa modifikasi, nomor versi terlihat seperti alamat ip) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
Nolwennig
sumber
0

Saya menggunakan versi ketat dari skema basis data (dilacak dalam tabel terpisah). Skrip disimpan dalam kontrol versi, tetapi semuanya memverifikasi versi skema saat ini sebelum melakukan perubahan apa pun.

Berikut ini adalah implementasi penuh untuk SQL Server (solusi yang sama dapat dikembangkan untuk MySQL jika diperlukan): Cara Mempertahankan Versi Skema Basis Data SQL Server

Zoran Horvat
sumber
Saya baru saja membaca artikel Anda. Apakah Anda masih menggunakan ini atau sudah sejak Anda mengadopsi solusi off-the-shelf seperti DBUp atau ReadyRoll?
David Atkinson
Saat ini, semua proyek saya mengandalkan Entity Framework Code-First dan saya menggunakan migrasi untuk versi database. Saya punya solusi dari artikel di beberapa proyek warisan dan saya tidak pernah menggantinya. Dalam proyek lain saya menggunakan alat Redgate untuk mengelola skema dan migrasi.
Zoran Horvat
Senang sekali bahwa Anda adalah pengguna Redgate! Jika Anda ingin menggunakan alat Redgate bersama dengan EF, itu dimungkinkan: red-gate.com/blog/database-lifecycle-management/…
David Atkinson
Saya akan pastikan untuk mencobanya pada kesempatan berikutnya. Itu sangat membantu kami, tetapi saya telah mengubah tim sementara itu dan sekarang saya sedang bereksperimen dengan dukungan EF asli sebelum mendorongnya maju.
Zoran Horvat
0

Setelah penyelidikan panjang, saya menemukan bahwa ada beberapa alat pihak ke-3 atau jenis proyek Visual Studio yang tidak memuaskan saya, atau hanya blog tentang teori tetapi tidak ada implementasi. Jadi saya menerapkan sistem kerja, yang digunakan hampir setahun, dan dijelaskan di sini:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

tergantung pada minat, akan terus menulis lebih banyak.

Yuksel Daskin
sumber
2
Halo, selamat datang di SO. Jawaban ini tidak benar-benar lengkap, pada dasarnya hanya menyediakan tautan. Jawaban khusus tautan bukan yang terbaik: jika tautan tersebut menjadi tidak valid, jawaban Anda akan menjadi tidak berguna. Jadi tolong edit dan tambahkan setidaknya ringkasan dari apa yang dapat ditemukan di sana, sehingga jawaban Anda memiliki nilai terlepas dari tautan. Terima kasih!
Fabio mengatakan Reinstate Monica