Bagaimana Anda menangani penyebaran perubahan basis data?


13

Kami telah membahas teknik penyebaran basis data hari ini, setelah mengalami beberapa kegagalan baru-baru ini dalam proses kami saat ini dan telah melihat situasi di mana kami ingin membatalkan penerapan, tetapi versi aplikasi yang lama tidak pernah diuji terhadap versi baru dari basis data.

Di satu sisi, ada penyebaran gaya Migrasi, di mana Anda memiliki instruksi versi-atas dan instruksi versi-turun (apakah itu ditulis dalam SQL atau dalam bahasa aplikasi Anda) dan aplikasi Anda tahu versi mana yang diperlukan.

Ini sederhana, dan karena kami tidak akan sering mundur, pengembang tertarik pada yang sederhana. Namun, ada risiko saat Anda menambahkan bidang / tabel dan bidang itu diisi sebelum Anda memutar kembali. Atau lebih buruk, di mana Anda menjatuhkan data yang relevan dengan versi sebelumnya.

Di sisi lain, kita dapat mempertimbangkan pendekatan upgrade, rollback, rollforward di mana rolling back tidak sedrastis Migrasi. Misalnya, peningkatan dapat menambahkan bidang yang tidak dapat dibatalkan; rollback membuatnya nullable sehingga aplikasi lama tidak peduli; rollforward mengisi bidang nol dan menjadikannya tidak dapat dibatalkan lagi.

Ini menyimpan data tetapi rumit baik untuk kode maupun untuk menguji (sayangnya, tes integrasi otomatis kami hampir tidak ada dan sementara kami memperbaiki itu, kami memiliki masalah sementara itu).

Apakah ada cara aman untuk mengurangi masalah dengan ini? Apakah ada opsi lain yang harus saya pertimbangkan? Pernahkah Anda memiliki pengalaman buruk yang ingin Anda bagikan yang dapat menyelamatkan saya dari rasa sakit nantinya?

Jawaban:


9

Perubahan basis data harus ditangani seperti semua perubahan lain dan digunakan sebagai skrip sebagai bagian dari penyebaran (dan tentu saja disimpan dalam kontrol sumber). Karena mereka dikerahkan dengan kode untuk versi aplikasi yang sama, Anda tahu persis apa yang perlu dibatalkan. Anda bisa mendapatkan mewah dan menulis skrip untuk membatalkan setiap perubahan pada saat Anda menulis skrip database tetapi jika rollback tidak umum, Anda mungkin tidak ingin melakukan itu. Jika kolom baru diisi Anda akan kehilangan data jika Anda kembali ke database asli.

Di SQL Server Anda bisa mengambil snapshot tepat sebelum penyebaran dan kemudian segera kembali ke itu jika penyebaran gagal. Ini mengasumsikan penyebaran TIDAK terjadi ketika pengguna berada di sistem (Anda tidak ingin kehilangan perubahan data mereka). Ini sangat berguna selama rilis besar ketika Anda mungkin harus mengambil seluruh sistem sementara untuk melakukan upgrade. Atau Anda masih dapat mengambil snapshot dan melakukan perbandingan database antara snapshot dan database untuk melihat perbedaannya jika Anda perlu mengembalikan. Alat seperti SQLCompare bahkan dapat menghasilkan kode untuk kembali ke struktur snapshot. Saya tidak tahu apa yang tersedia untuk database lain.


3

Perubahan pada struktur basis data harus diotomatisasi / dituliskan dan diuji menggunakan lingkungan pengujian. Perubahan manual terlalu berisiko pada lingkungan produksi

Satu-satunya strategi rollback yang masuk akal (strategi dengan kemungkinan paling buruk untuk memperburuk keadaan) adalah kembali ke snapshot pra-pemutakhiran. Jika ada yang salah, itu akan terjadi dengan cukup cepat untuk membuatnya dapat kembali ke snapshot, atau terlambat untuk rollback (laporan akhir minggu berikutnya gagal karena masalah dalam database).

Perubahan dapat dilakukan secara bertahap (seperti menambahkan bidang) dan dengan demikian diuji langsung dengan risiko yang lebih rendah daripada saat melakukan semuanya dalam satu gerakan.

Dengan perencanaan, Anda dapat membuat perubahan pada basis data untuk mendukung beberapa rilis mendatang, alih-alih harus menghadapi pembaruan perangkat lunak dan basis data dengan setiap rilis.

Bersiaplah untuk berada dalam mode darurat hari-hari setelah pemutakhiran basis data, seperti yang Anda lakukan jika itu merupakan peningkatan perangkat lunak.

Tahan keinginan untuk memperbaiki masalah secara manual. Gunakan strategi kontingensi Anda (rollback, snapshot) dan kemudian pikirkan mengapa ada masalah sebelum mencoba upgrade lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.