Bagaimana anda mengelola database dalam pengembangan, pengujian, dan produksi?

I've memiliki waktu yang sulit mencoba untuk menemukan contoh yang baik tentang bagaimana untuk mengelola skema database dan data antara pengembangan, pengujian, dan server produksi.

Berikut ini's kita setup. Masing-masing pengembang memiliki mesin virtual yang menjalankan aplikasi dan database MySQL. Itu adalah pribadi mereka sandbox untuk melakukan apapun yang mereka inginkan. Saat ini, pengembang akan membuat perubahan skema SQL dan melakukan dump dari database ke file teks yang mereka lakukan ke SVN.

Kami're ingin menyebarkan terus menerus integrasi pengembangan server yang akan selalu berjalan terbaru berkomitmen kode. Jika kami melakukan itu sekarang, itu akan reload database dari SVN untuk masing-masing membangun.

Kami memiliki tes (virtual) server yang berjalan "rilis kandidat." Menyebarkan untuk menguji server saat ini sangat proses manual, dan biasanya melibatkan saya loading SQL terbaru dari SVN dan mengutak-atik itu. Juga, data pada server tes tidak konsisten. Anda berakhir dengan apapun data tes terakhir pengembang untuk melakukan itu pada sandbox server.

Di mana segala sesuatu yang rusak adalah penyebaran produksi. Karena kita dapat't menimpa hidup data dengan data uji, ini melibatkan secara manual menciptakan kembali semua perubahan skema. Jika ada sejumlah besar dari skema perubahan atau konversi script untuk memanipulasi data, ini bisa benar-benar berbulu.

Jika masalah itu hanya skema, It'd menjadi lebih mudah masalah, tapi ada "tempat" data-data dalam database yang diperbarui selama pengembangan, seperti meta-data keamanan dan izin meja.

Ini adalah penghalang terbesar yang saya lihat di bergerak menuju integrasi berkesinambungan dan satu-langkah membangun. Bagaimana anda ** mengatasinya?


Pertanyaan lanjutan: bagaimana anda melacak database versi sehingga anda tahu mana script untuk menjalankan untuk meng-upgrade diberikan contoh database? Versi tabel seperti Lance menyebutkan di bawah standar prosedur?


Terima kasih untuk referensi untuk Tarantino. I'm tidak dalam .Lingkungan BERSIH, tapi saya menemukan mereka DataBaseChangeMangement halaman wiki untuk menjadi sangat membantu. Terutama ini Presentasi Powerpoint (.ppt)

I'm akan menulis script Python yang memeriksa nama-nama *.sql script di direktori tertentu terhadap suatu tabel dalam database dan berjalan orang-orang yang tidak't ada di urutan berdasarkan sebuah bilangan bulat yang membentuk bagian pertama dari nama file. Jika itu adalah cukup sederhana solusi, karena saya kira itu akan menjadi, maka saya'll posting di sini.


I've punya script kerja selama ini. Menangani inisialisasi DB jika itu doesn't ada dan berjalan upgrade script yang diperlukan. Ada juga switch untuk menghapus database yang sudah ada dan mengimpor data uji dari sebuah file. It's sekitar 200 baris, jadi saya tidak't posting ini (meskipun saya mungkin meletakkannya di pastebin jika ada's bunga).

Mengomentari pertanyaan (2)
Larutan

Ada beberapa pilihan yang baik. Saya tidak't gunakan "mengembalikan backup" strategi.

  1. Script semua perubahan skema, dan CI server menjalankan script tersebut pada database. Memiliki versi tabel untuk melacak arus database versi, dan hanya mengeksekusi script jika mereka adalah untuk versi yang lebih baru.

  2. Gunakan migrasi solusi. Solusi ini berbeda dengan bahasa, tapi untuk .BERSIH saya menggunakan Migrator.NET. Hal ini memungkinkan anda untuk versi database anda dan bergerak naik dan turun antara versi. Skema ditentukan dalam kode C#.

Komentar (0)

Pengembang anda perlu untuk menulis perubahan script (schema dan data perubahan) untuk setiap bug/fitur yang mereka kerjakan, tidak hanya sekedar membuang seluruh database ke kontrol sumber. Script ini akan meng-upgrade saat ini produksi database untuk versi baru dalam pembangunan.

Anda membangun proses yang dapat mengembalikan salinan database produksi ke lingkungan yang sesuai dan menjalankan semua script dari sumber kendali di atasnya, yang akan memperbarui database untuk versi saat ini. Kita lakukan hal ini setiap hari untuk memastikan semua script berjalan dengan benar.

Komentar (0)

Lihatlah bagaimana Ruby on Rails melakukan hal ini.

Pertama ada yang disebut file migrasi, yang pada dasarnya mengubah skema database dan data dari versi N untuk versi N+1 (atau dalam kasus downgrade dari versi N+1 sampai N). Database memiliki tabel yang menceritakan versi saat ini.

Uji database selalu dibersihkan sebelum unit-tes dan diisi dengan tetap data dari file.

Komentar (0)

Buku Refactoring Database: Evolusi Desain Database mungkin memberi anda beberapa ide tentang bagaimana untuk mengelola database. Versi pendek dapat dibaca juga di http://martinfowler.com/articles/evodb.html

Di satu PHP+MySQL proyek I've memiliki database nomor revisi yang tersimpan dalam database, dan ketika program ini menghubungkan ke database, ia akan terlebih dahulu memeriksa revisi. Jika program ini memerlukan revisi, maka akan terbuka halaman untuk melakukan upgrade database. Setiap upgrade ditentukan dalam kode PHP, yang akan mengubah skema database dan memindahkan semua data yang ada.

Komentar (0)
  • Nama database anda sebagai berikut - dev_<<db>> , tst_<<db>> , stg_<<db>> , prd_<<db>> (Jelas anda tidak pernah harus hardcode db nama
  • Dengan demikian anda akan dapat untuk menyebarkan bahkan berbagai jenis db's pada server fisik yang sama ( saya tidak menyarankan itu , tapi anda mungkin harus ... jika sumber daya yang ketat )
  • Memastikan anda akan dapat memindahkan data antara orang-orang secara otomatis
  • Memisahkan db penciptaan script dari populasi = Itu harus selalu mungkin untuk menciptakan db dari awal dan mengisi ( dari tua db versi atau sumber data eksternal
  • jangan gunakan hardcode koneksi string dalam kode ( bahkan tidak dalam config file ) - digunakan di file konfigurasi koneksi string template , yang anda lakukan mengisi dinamis , masing-masing rekonfigurasi application_layer yang tidak perlu mengkompilasi ulang lebih BURUK
  • jangan menggunakan database versi dan benda db versi - jika anda mampu membelinya menggunakan produk siap , jika tidak mengembangkan sesuatu pada anda sendiri
  • melacak setiap DDL mengubah dan menyimpannya ke dalam beberapa tabel sejarah ( contoh )
  • Backup HARIAN ! Menguji seberapa cepat anda akan bisa mengembalikan sesuatu yang hilang dari cadangan (menggunakan automathic mengembalikan script
  • bahkan DEV database dan PROD memiliki persis sama pembuatan script anda akan memiliki masalah dengan data, sehingga memungkinkan pengembang untuk membuat salinan tepat dari prod dan bermain dengan itu ( aku tahu aku akan menerima minus untuk yang satu ini , tapi perubahan dalam pola pikir dan proses bisnis akan dikenakan biaya jauh lebih sedikit ketika shit hits the fan - sehingga memaksa para pemrogram untuk subscript hukum apa pun yang membuatnya , tapi memastikan satu ini
Komentar (2)

Ini adalah sesuatu yang saya'm terus-menerus tidak puas dengan kami solusi untuk masalah ini itu. Selama beberapa tahun kami dipelihara terpisah mengubah script untuk setiap rilis. Script ini akan berisi delta dari produksi terakhir rilis. Dengan setiap rilis dari aplikasi, nomor versi akan kenaikan, memberikan sesuatu seperti berikut:

  • dbChanges_1.sql
  • dbChanges_2.sql
  • ...
  • dbChanges_n.sql

Ini bekerja cukup baik sampai kita mulai menjaga dua jalur pengembangan: Batang/Mainline untuk pengembangan baru, dan pemeliharaan cabang untuk perbaikan bug, jangka pendek tambahan, dll. Tak pelak, kebutuhan muncul untuk membuat perubahan pada skema di cabang. Pada titik ini, kita sudah memiliki dbChanges_n+1.sql di Bagasi, jadi kami akhirnya pergi dengan skema seperti berikut:

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql
  • ...
  • dbChanges_n.3.sql

Sekali lagi, ini bekerja dengan cukup baik, sampai kita satu hari kita mendongak dan melihat 42 delta script di jalur utama dan 10 di cabang. ARGH!

Hari-hari ini kita hanya mempertahankan satu delta script dan biarkan SVN versi itu - yaitu kita menimpa script dengan setiap rilis. Dan kita menghindar dari membuat perubahan skema di cabang-cabang.

Jadi, saya'm tidak puas dengan hal ini. Aku benar-benar seperti konsep migrasi dari Rel. I've menjadi sangat terpesona dengan LiquiBase. Hal ini mendukung konsep tambahan database refactorings. It's layak lihat dan I'akan melihat secara rinci segera. Ada yang punya pengalaman dengan ini? I'd menjadi sangat penasaran untuk mendengar tentang hasil anda.

Komentar (0)

Anda juga bisa melihat menggunakan alat seperti SQL Membandingkan untuk naskah perbedaan antara berbagai versi dari database, yang memungkinkan anda untuk dengan cepat bermigrasi antara versi

Komentar (0)

I'm takut aku'm dalam perjanjian dengan poster lainnya. Pengembang perlu script perubahan mereka.

Dalam banyak kasus sederhana ALTER TABLE won't bekerja, anda perlu untuk memodifikasi data-data yang ada terlalu - pengembang perlu apa-apa mengenai migrasi yang diperlukan dan pastikan mereka're ditulis dengan benar (tentu saja anda perlu untuk menguji ini dengan hati-hati di beberapa titik dalam siklus rilis).

Selain itu, jika anda memiliki rasa, anda'll mendapatkan pengembang untuk script rollbacks untuk perubahan mereka juga sehingga mereka dapat dikembalikan jika perlu. Ini harus diuji untuk memastikan bahwa mereka rollback tidak hanya mengeksekusi tanpa kesalahan, tapi daun DB dalam keadaan yang sama seperti itu di sebelumnya (hal ini tidak selalu mungkin atau diinginkan, tetapi merupakan aturan yang baik sebagian besar waktu).

Bagaimana anda kait yang menjadi CI server, saya don't tahu. Mungkin anda CI server perlu diketahui membangun snapshot, yang beralih untuk setiap malam dan kemudian menerapkan semua perubahan sejak saat itu. Yang's mungkin yang terbaik, jika tidak rusak migrasi script akan istirahat tidak hanya malam itu's membangun, tetapi semua yang berikutnya.

Komentar (0)

Kami memiliki sangat mirip setup untuk OP.

Pengembang berkembang di VM's dengan pribadi DB's.

[Pengembang akan segera melakukan ke cabang-cabang swasta]

Pengujian dijalankan pada mesin yang berbeda ( sebenarnya di dalam VM's-host pada server) [Akan segera dijalankan oleh Hudson CI server]

Tes dengan memuat referensi dump ke db. Menerapkan skema pengembang patch kemudian menerapkan pengembang data patch

Kemudian jalankan unit dan pengujian sistem.

Produksi dikerahkan untuk pelanggan sebagai installer.

Apa yang kita lakukan:

Kami mengambil skema dump kami sandbox DB. Kemudian data sql dump. Kami diff yang sebelumnya baseline. yang sepasang delta adalah untuk meng-n-1-n.

kita mengkonfigurasi kesedihan dan delta.

Jadi untuk menginstal versi N BERSIH kita menjalankan dump ke kosong db. Untuk patch, menerapkan intervensi patch.

( Juha disebutkan Rel's gagasan memiliki sebuah meja rekaman saat ini DB versi adalah satu yang baik dan harus membuat menginstal update yang lebih penuh. )

Delta dan kesedihan harus ditinjau sebelum pengujian beta. Saya dapat't melihat ada cara sekitar ini seperti yang saya've melihat pengembang menyisipkan akun uji coba ke DB untuk diri mereka sendiri.

Komentar (0)

Check out dbdeploy, ada Jawa dan .net tools yang sudah tersedia, anda bisa mengikuti standar SQL file layout dan skema versi meja dan menulis python versi.

Komentar (0)

Jika anda berada di .Lingkungan BERSIH maka solusinya adalah Tarantino. Ini menangani semua ini (termasuk yang sql script untuk install) di NANT membangun.

Komentar (1)

Kami adalah menggunakan command-line mysql-diff: output perbedaan antara dua skema database (dari live DB atau script) seperti MENGUBAH naskah. mysql-diff dijalankan pada aplikasi start, dan jika skema berubah, itu laporan ke pengembang. Sehingga pengembang tidak perlu menulis Mengubah secara manual, skema update terjadi secara semi-otomatis.

Komentar (0)

I've menulis sebuah alat yang (dengan mengaitkan ke Open DBDiff) membandingkan skema database, dan akan menyarankan migrasi script untuk anda. Jika anda membuat perubahan yang menghapus atau memodifikasi data, ia akan melempar kesalahan, tetapi memberikan saran untuk script (misalnya ketika sebuah kolom di hilang dalam skema baru, itu akan memeriksa apakah kolom yang telah berganti nama dan membuat xx - dihasilkan script.sql.saran yang berisi pernyataan ganti nama).

http://code.google.com/p/migrationscriptgenerator/ SQL Server hanya aku'm takut :( Itu's juga cukup alpha, tapi itu adalah gesekan SANGAT rendah (terutama jika anda menggabungkan itu dengan Tarantino atau http://code.google.com/p/simplescriptrunner/)

Cara yang saya gunakan itu adalah untuk memiliki SQL script project anda .sln. Anda juga memiliki db_next database lokal yang membuat perubahan (menggunakan Manajemen Studio atau NHibernate Skema Ekspor atau LinqToSql CreateDatabase atau sesuatu). Kemudian anda menjalankan migrationscriptgenerator dengan _dev dan sela_njutnya DBs, yang menciptakan. SQL update script untuk bermigrasi melintasi.

Komentar (0)

Untuk oracle database yang kita gunakan oracle-ddl2svn alat-alat.

Alat ini otomatis proses selanjutnya

  1. untuk setiap db skema mendapatkan skema ddls
  2. meletakkannya di bawah versi contol

perubahan antara kasus diselesaikan secara manual

Komentar (0)