Saya merasa bahwa toko saya memiliki lubang karena kami tidak memiliki proses yang solid di tempat untuk versi perubahan skema database kami. Kami melakukan banyak cadangan sehingga kami sedikit banyak terlindungi, tetapi praktik yang buruk mengandalkan garis pertahanan terakhir Anda dengan cara ini.
Anehnya, ini tampaknya menjadi benang merah. Banyak toko yang saya ajak bicara mengabaikan masalah ini karena database mereka tidak sering berubah, dan mereka pada dasarnya hanya berusaha untuk teliti.
Namun, saya tahu bagaimana ceritanya. Hanya masalah waktu sebelum hal-hal berbaris salah dan ada yang hilang.
Apakah ada praktik terbaik untuk ini? Apa sajakah strategi yang berhasil untuk Anda?
database
version-control
Brian MacKay
sumber
sumber
Jawaban:
Harus membaca Dapatkan basis data Anda di bawah kontrol versi . Periksa serangkaian posting oleh K. Scott Allen.
sumber
Basis data sendiri? Tidak
Skrip yang membuatnya, termasuk sisipan data statis, prosedur tersimpan dan sejenisnya; tentu saja. Mereka adalah file teks, mereka termasuk dalam proyek dan diperiksa masuk dan keluar seperti yang lainnya.
Tentu saja di dunia yang ideal alat manajemen basis data Anda akan melakukan ini; tetapi Anda hanya harus disiplin tentang hal itu.
sumber
Saya sangat menyukai migrasi Rails ActiveRecord. Itu abstrak DML ke skrip ruby yang kemudian dapat dengan mudah versi di repositori sumber Anda.
Namun, dengan sedikit kerja, Anda bisa melakukan hal yang sama. Perubahan DDL (ALTER TABLE, dll.) Dapat disimpan dalam file teks. Simpan sistem penomoran (atau stempel tanggal) untuk nama file, dan terapkan secara berurutan.
Rails juga memiliki tabel 'versi' di DB yang melacak migrasi terapan terakhir. Anda dapat melakukan hal yang sama dengan mudah.
sumber
Lihat LiquiBase untuk mengelola perubahan basis data menggunakan kontrol sumber.
sumber
Anda tidak boleh hanya masuk dan mulai memasukkan perintah "ALTER TABLE" untuk mengubah basis data produksi. Proyek yang saya jalankan memiliki basis data di setiap situs pelanggan, dan setiap perubahan pada basis data dibuat di dua tempat, file dump yang digunakan untuk membuat database baru di situs pelanggan baru, dan file pembaruan yang dijalankan pada setiap pembaruan yang memeriksa nomor versi database Anda saat ini terhadap angka tertinggi dalam file, dan memperbarui database Anda di tempat. Jadi misalnya, beberapa pembaruan terakhir:
Saya yakin ada cara yang lebih baik untuk melakukan ini, tetapi sejauh ini berhasil bagi saya.
sumber
begin transaction; ... end transaction;
dengan meneruskan--single-transaction
kepsql
.Iya. Kode adalah kode. Aturan praktis saya adalah bahwa saya harus dapat membangun dan menggunakan aplikasi dari awal , tanpa melihat mesin pengembangan atau produksi.
sumber
Praktik terbaik yang saya lihat adalah membuat skrip build untuk memo dan membangun kembali database Anda pada server staging. Setiap iterasi diberikan folder untuk perubahan basis data, semua perubahan ditulis dengan "Drop ... Create". Dengan cara ini Anda dapat mengembalikan ke versi sebelumnya kapan saja dengan mengarahkan folder build ke versi yang Anda inginkan.
Saya percaya ini dilakukan dengan NaNt / CruiseControl.
sumber
YA, saya pikir penting untuk versi database Anda. Bukan data, tapi skema pasti.
Di Ruby On Rails, ini ditangani oleh kerangka kerja dengan "migrasi". Setiap kali Anda mengubah db, Anda membuat skrip yang menerapkan perubahan dan memeriksanya menjadi kontrol sumber.
Toko saya sangat menyukai gagasan itu sehingga kami menambahkan fungsionalitas ke build berbasis Java kami menggunakan skrip shell dan Ant. Kami mengintegrasikan proses tersebut ke dalam rutinitas penerapan kami. Akan cukup mudah untuk menulis skrip untuk melakukan hal yang sama dalam kerangka kerja lain yang tidak mendukung DB versi out-of-the-box.
sumber
Proyek-proyek Database baru di Visual Studio menyediakan kontrol sumber dan mengubah skrip.
Mereka memiliki alat yang bagus yang membandingkan database dan dapat menghasilkan skrip yang mengubah skema satu menjadi yang lain, atau memperbarui data dalam satu agar sesuai dengan yang lain.
Skema db "robek" untuk membuat banyak, banyak file .sql kecil, satu per perintah DDL yang menjelaskan DB.
+ tom
Info tambahan 2008-11-30
Saya telah menggunakannya sebagai pengembang selama setahun terakhir dan sangat menyukainya. Itu membuatnya mudah untuk membandingkan pekerjaan dev saya dengan produksi dan menghasilkan skrip untuk digunakan untuk rilis. Saya tidak tahu apakah itu fitur yang hilang yang dibutuhkan DBA untuk proyek "tipe perusahaan".
Karena skema "robek" menjadi file sql kontrol sumber berfungsi dengan baik.
Salah satunya adalah Anda harus memiliki pola pikir yang berbeda ketika Anda menggunakan proyek db. Alat ini memiliki "proyek db" di VS, yang hanya sql, ditambah database lokal yang dihasilkan secara otomatis yang memiliki skema dan beberapa data admin lainnya - tetapi tidak ada data aplikasi Anda, ditambah db dev lokal yang Anda gunakan untuk aplikasi data dev bekerja. Anda jarang mengetahui db yang dihasilkan secara otomatis, tetapi Anda harus mengetahuinya di sana sehingga Anda dapat membiarkannya sendirian :). Db khusus ini jelas dikenali karena memiliki Bimbingan dalam namanya,
Proyek VS DB melakukan pekerjaan yang baik untuk mengintegrasikan perubahan db yang telah dibuat anggota tim lain ke proyek lokal Anda / db terkait. tetapi Anda perlu mengambil langkah ekstra untuk membandingkan skema proyek dengan skema dev db lokal Anda dan menerapkan mod. Masuk akal, tetapi pada awalnya terasa canggung.
Proyek DB adalah alat yang sangat kuat. Mereka tidak hanya menghasilkan skrip tetapi dapat langsung menerapkannya. Pastikan untuk tidak menghancurkan db produksi Anda dengan itu. ;)
Saya sangat menyukai proyek-proyek VS DB dan saya berharap untuk menggunakan alat ini untuk semua proyek db saya ke depan.
+ tom
sumber
Memerlukan tim pengembangan untuk menggunakan sistem manajemen kontrol sumber basis data SQL bukanlah peluru ajaib yang akan mencegah masalah terjadi. Dengan sendirinya, kontrol sumber database memperkenalkan overhead tambahan karena pengembang diminta untuk menyimpan perubahan yang mereka buat pada objek dalam skrip SQL terpisah, buka klien sistem kontrol sumber, periksa file skrip SQL menggunakan klien dan kemudian terapkan perubahan pada live database.
Saya dapat menyarankan menggunakan add-in SSMS yang disebut ApexSQL Source Control . Ini memungkinkan pengembang untuk dengan mudah memetakan objek database dengan sistem kontrol sumber via wizard langsung dari SSMS. Add-in termasuk dukungan untuk TFS, Git, Subversion dan sistem SC lainnya. Ini juga termasuk dukungan untuk sumber yang mengendalikan data Statis.
Setelah mengunduh dan menginstal Kontrol Sumber ApexSQL, cukup klik kanan database yang ingin Anda kontrol versi dan navigasikan ke sub-menu Kontrol Sumber ApexSQL di SSMS. Klik tautan Tautan basis data ke kontrol sumber, pilih sistem kontrol sumber dan model pengembangan. Setelah itu, Anda harus memberikan informasi masuk dan string repositori untuk sistem kontrol sumber yang Anda pilih.
Anda dapat membaca artikel ini untuk informasi lebih lanjut: http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/
sumber
Saya lakukan dengan menyimpan skrip buat / perbarui dan skrip yang menghasilkan sampledata.
sumber
Ya, kami melakukannya dengan menjaga SQL kami sebagai bagian dari build kami - kami menjaga DROP.sql, CREATE.sql, USERS.sql, VALUES.sql, dan versi mengontrolnya, sehingga kami dapat kembali ke versi yang ditandai.
Kami juga memiliki tugas semut yang dapat membuat ulang db kapan pun diperlukan.
Plus, SQL kemudian ditandai bersama dengan kode sumber Anda yang menyertainya.
sumber
Skema paling sukses yang pernah saya gunakan pada suatu proyek telah menggabungkan cadangan dan file SQL diferensial. Pada dasarnya kami akan mengambil cadangan db kami setelah setiap rilis dan melakukan dump SQL sehingga kami dapat membuat skema kosong dari awal jika kami juga perlu. Kemudian kapan pun Anda perlu membuat perubahan ke DB Anda akan menambahkan skrip alter ke direktori sql di bawah kontrol versi. Kami akan selalu mengawali nomor urut atau tanggal ke nama file sehingga perubahan pertama akan menjadi seperti 01_add_created_on_column.sql, dan skrip berikutnya adalah 02_added_customers_index. Mesin CI kami akan memeriksa ini dan menjalankannya secara berurutan pada salinan baru db yang telah dipulihkan dari cadangan.
Kami juga memiliki beberapa skrip yang dapat digunakan devs untuk menginisialisasi ulang db lokal mereka ke versi saat ini dengan satu perintah.
sumber
Kami mengontrol sumber semua objek yang dibuat dabase kami. Dan hanya untuk menjaga kejujuran para pengembang (karena Anda dapat membuat objek tanpa mereka berada dalam Kontrol Sumber), dbas kami secara berkala mencari apa pun yang tidak ada dalam kontrol sumber dan jika mereka menemukan sesuatu, mereka menjatuhkannya tanpa menanyakan apakah itu ok.
sumber
Saya menggunakan SchemaBank untuk mengontrol versi semua perubahan skema database saya:
Aturan tim kami adalah JANGAN PERNAH menyentuh server db secara langsung tanpa menyimpan karya desain terlebih dahulu. Tapi itu terjadi, seseorang mungkin tergoda untuk melanggar aturan, demi kenyamanan. Kami akan mengimpor dump skema lagi ke schemabank dan membiarkannya melakukan diff dan bash seseorang jika ditemukan ketidaksesuaian. Meskipun kita dapat membuat skrip alter dari skrip itu untuk membuat desain db dan skema kita sinkron, kita hanya membenci itu.
Omong-omong, mereka juga memungkinkan kami membuat cabang di dalam pohon kontrol versi sehingga saya dapat mempertahankan satu untuk pementasan dan satu untuk produksi. Dan satu lagi untuk coding sandbox.
Alat desain skema berbasis web yang cukup apik dengan kontrol versi dan manajemen perubahan.
sumber
Saya memiliki semua yang diperlukan untuk membuat ulang DB saya dari logam kosong, minus data itu sendiri. Saya yakin ada banyak cara untuk melakukannya, tetapi semua skrip saya dan semacamnya disimpan dalam subversi dan kita dapat membangun kembali struktur DB dan semacamnya dengan menarik semua yang keluar dari subversi dan menjalankan installer.
sumber
Saya biasanya membangun skrip SQL untuk setiap perubahan yang saya buat, dan yang lain untuk mengembalikan perubahan itu, dan menjaga skrip tersebut di bawah kontrol versi.
Kemudian kami memiliki sarana untuk membuat database baru yang terkini sesuai permintaan, dan dapat dengan mudah berpindah antar revisi. Setiap kali kami melakukan rilis, kami menyatukan skrip (mengambil sedikit pekerjaan manual, tapi itu jarang benar - benar sulit ) sehingga kami juga memiliki satu set skrip yang dapat mengkonversi antar versi.
Ya, sebelum Anda mengatakannya, ini sangat mirip dengan hal-hal yang Rails dan lainnya lakukan, tetapi tampaknya bekerja dengan cukup baik, jadi saya tidak punya masalah mengakui bahwa saya tanpa malu-malu mengangkat ide :)
sumber
Saya menggunakan skrip SQL CREATE yang diekspor dari MySQL Workbech, kemudian menggunakan fungsionalitas mereka "Ekspor SQL ALTER" Saya berakhir dengan serangkaian skrip buat (tentu saja bernomor) dan skrip alter yang dapat menerapkan perubahan di antara mereka.
Sumber: Edisi Komunitas MySQL Workbench: Panduan untuk Sinkronisasi Skema
Semua skrip ini tentu saja ada di dalam di bawah kontrol versi.
sumber
Ya selalu. Anda harus dapat membuat ulang struktur basis data produksi Anda dengan satu set data sampel yang berguna kapan pun diperlukan. Jika tidak, seiring waktu perubahan kecil untuk membuat hal-hal berjalan dilupakan maka suatu hari Anda akan digigit, waktu besar. Asuransi yang mungkin Anda pikir tidak Anda butuhkan tetapi pada hari Anda melakukannya, harganya layak 10 kali lipat!
sumber
Ada banyak diskusi tentang model database itu sendiri, tetapi kami juga menyimpan data yang diperlukan dalam file .SQL.
Misalnya, agar berguna, aplikasi Anda mungkin memerlukan ini dalam pemasangan:
Kami akan memiliki file yang disebut di
currency.sql
bawah subversi. Sebagai langkah manual dalam proses pembuatan, kami membandingkan currency.sql sebelumnya dengan yang terbaru dan menulis skrip pemutakhiran.sumber
Kami versi dan sumber mengontrol semua yang ada di sekitar basis data kami:
Kami melakukan semua ini dengan pekerjaan otomatis menggunakan Change Manager dan beberapa skrip khusus. Kami memiliki Change Manager yang memantau perubahan-perubahan ini dan memberi tahu ketika mereka selesai.
sumber
Saya percaya bahwa setiap DB harus di bawah kendali sumber, dan pengembang harus memiliki cara mudah untuk membuat database lokal mereka dari awal. Terinspirasi oleh Visual Studio for Database Professionals, saya telah membuat alat open-source yang membuat skrip dengan basis data MS SQL, dan menyediakan serta cara mudah untuk menyebarkannya ke mesin DB lokal Anda. Coba http://dbsourcetools.codeplex.com/ . Selamat bersenang-senang, - Nathan.
sumber
Jika Database Anda adalah SQL Server, kami mungkin memiliki solusi yang Anda cari. SQL Source Control 1.0 kini telah dirilis.
http://www.red-gate.com/products/SQL_Source_Control/index.htm
Ini terintegrasi ke dalam SSMS dan menyediakan lem antara objek database Anda dan VCS Anda. 'Scripting out' terjadi secara transparan (menggunakan mesin SQL Compare di bawah tenda), yang seharusnya membuatnya mudah untuk digunakan sehingga pengembang tidak akan berkecil hati untuk mengadopsi proses.
Solusi Visual Studio alternatif adalah ReadyRoll , yang diimplementasikan sebagai sub-jenis Proyek Database SSDT. Ini mengambil pendekatan yang didorong oleh migrasi, yang lebih cocok dengan persyaratan otomatisasi tim DevOps.
sumber
Saya sumber mengontrol skema database dengan membuat skrip semua objek (definisi tabel, indeks, prosedur tersimpan, dll). Tapi, untuk data itu sendiri, cukup mengandalkan cadangan biasa. Ini memastikan bahwa semua perubahan struktural ditangkap dengan riwayat revisi yang tepat, tetapi tidak membebani database setiap kali data berubah.
sumber
Di bisnis kami, kami menggunakan skrip perubahan basis data. Ketika skrip dijalankan, namanya disimpan dalam database dan tidak akan berjalan lagi, kecuali jika baris itu dihapus. Skrip diberi nama berdasarkan tanggal, waktu dan cabang kode, sehingga eksekusi yang terkontrol dimungkinkan.
Banyak dan banyak pengujian dilakukan sebelum skrip dijalankan di lingkungan langsung, sehingga "oopsi" hanya terjadi, secara umum, pada basis data pengembangan.
sumber
Kami sedang dalam proses memindahkan semua database ke kontrol sumber. Kami menggunakan sqlcompare untuk skrip basis data (fitur edisi profesi, sayangnya) dan memasukkan hasilnya ke SVN.
Keberhasilan implementasi Anda akan sangat tergantung pada budaya dan praktik organisasi Anda. Orang-orang di sini percaya dalam membuat database per aplikasi. Ada satu set umum database yang digunakan oleh sebagian besar aplikasi dan juga menyebabkan banyak ketergantungan antar-database (beberapa dari mereka adalah lingkaran). Menempatkan skema basis data ke dalam kendali sumber sangat terkenal sulit karena ketergantungan antar-database yang dimiliki sistem kami.
Semoga beruntung untuk Anda, semakin cepat Anda mencobanya semakin cepat Anda akan memiliki masalah Anda beres.
sumber
Saya telah menggunakan alat dbdeploy dari ThoughtWorks di http://dbdeploy.com/ . Ini mendorong penggunaan skrip migrasi. Setiap rilis, kami mengkonsolidasikan skrip perubahan ke dalam satu file untuk memudahkan pemahaman dan memungkinkan DBA untuk 'memberkati' perubahan.
sumber
Ini selalu menjadi gangguan besar bagi saya juga - sepertinya terlalu mudah untuk membuat perubahan cepat ke database pengembangan Anda, simpan (lupa untuk menyimpan skrip perubahan), dan kemudian Anda terjebak. Anda dapat membatalkan apa yang baru saja Anda lakukan dan mengulanginya untuk membuat skrip perubahan, atau menulisnya dari awal jika Anda ingin tentunya juga, meskipun itu banyak waktu yang dihabiskan untuk menulis skrip.
Alat yang saya gunakan di masa lalu yang telah membantu beberapa ini adalah SQL Delta. Ini akan menunjukkan kepada Anda perbedaan antara dua database (SQL server / Oracle saya percaya) dan menghasilkan semua skrip perubahan yang diperlukan untuk memigrasi A-> B. Hal baik lainnya yang dilakukannya adalah menunjukkan semua perbedaan antara konten basis data antara DB produksi (atau tes) dan DB pengembangan Anda. Karena semakin banyak aplikasi menyimpan konfigurasi dan menyatakan bahwa sangat penting untuk eksekusi mereka dalam tabel database, bisa jadi sangat menyusahkan memiliki skrip perubahan yang menghapus, menambah, dan mengubah baris yang tepat. SQL Delta menunjukkan baris-baris dalam basis data sama seperti mereka akan terlihat pada alat Diff - diubah, ditambahkan, dihapus.
Alat yang luar biasa. Berikut tautannya: http://www.sqldelta.com/
sumber
RedGate hebat, kami menghasilkan snapshot baru ketika perubahan database dibuat (file biner kecil) dan menyimpan file itu di proyek sebagai sumber daya. Setiap kali kami perlu memperbarui basis data, kami menggunakan perangkat RedGate untuk memperbarui basis data, serta mampu membuat basis data baru dari yang kosong.
RedGate juga membuat snapshot data, sementara saya belum bekerja secara pribadi dengan mereka, mereka sama kuatnya.
sumber
FYI Ini juga dibawa beberapa hari yang lalu oleh Dana ... Menyimpan prosedur / skema DB dalam kontrol sumber
sumber