Kami menggunakan sesuatu yang mirip dengan bcwoord untuk menjaga skema database kami tersinkronisasi di 5 instalasi yang berbeda (produksi, pementasan dan beberapa instalasi pengembangan), dan dicadangkan dalam kontrol versi, dan bekerja dengan cukup baik. Saya akan menjelaskan sedikit:
Untuk menyinkronkan struktur database, kami memiliki satu skrip, update.php, dan sejumlah file bernomor 1.sql, 2.sql, 3.sql, dll. Skrip ini menggunakan satu tabel tambahan untuk menyimpan nomor versi saat ini dari database. File N.sql dibuat dengan tangan, untuk beralih dari versi (N-1) ke versi N database.
Mereka dapat digunakan untuk menambahkan tabel, menambah kolom, memigrasi data dari format kolom lama ke kolom baru kemudian menjatuhkan kolom, memasukkan baris data "master" seperti jenis pengguna, dll. Pada dasarnya, ini dapat melakukan apa saja, dan dengan data yang tepat skrip migrasi Anda tidak akan pernah kehilangan data.
Skrip pembaruan berfungsi seperti ini:
- Hubungkan ke database.
- Buat cadangan dari database saat ini (karena barang akan salah) [mysqldump].
- Buat tabel pembukuan (disebut _meta) jika tidak ada.
- Baca VERSION saat ini dari tabel _meta. Asumsikan 0 jika tidak ditemukan.
- Untuk semua file .sql bernomor lebih tinggi dari VERSION, jalankan secara berurutan
- Jika salah satu file menghasilkan kesalahan: putar kembali ke cadangan
- Jika tidak, perbarui versi dalam tabel pembukuan ke file .sql tertinggi yang dijalankan.
Semuanya masuk ke kontrol sumber, dan setiap instalasi memiliki skrip untuk memperbarui ke versi terbaru dengan satu eksekusi skrip (memanggil update.php dengan kata sandi database yang tepat, dll.). Kami SVN memperbarui lingkungan pementasan dan produksi melalui skrip yang secara otomatis memanggil skrip pembaruan basis data, sehingga pembaruan kode dilengkapi dengan pembaruan basis data yang diperlukan.
Kita juga dapat menggunakan skrip yang sama untuk membuat ulang seluruh database dari awal; kami hanya melepas dan membuat ulang database, lalu menjalankan skrip yang akan mengisi kembali database sepenuhnya. Kami juga dapat menggunakan skrip untuk mengisi database kosong untuk pengujian otomatis.
Hanya perlu beberapa jam untuk menyiapkan sistem ini, secara konseptual sederhana dan semua orang mendapatkan skema penomoran versi, dan sangat berharga dalam memiliki kemampuan untuk bergerak maju dan mengembangkan desain database, tanpa harus berkomunikasi atau menjalankan modifikasi secara manual. di semua database.
Berhati-hatilah saat menempelkan kueri dari phpMyAdmin! Kueri yang dihasilkan tersebut biasanya menyertakan nama database, yang pasti tidak Anda inginkan karena akan merusak skrip Anda! Sesuatu seperti CREATE TABLE mydb
. newtable
(...) akan gagal jika database pada sistem tidak disebut mydb. Kami membuat hook SVN pra-komentar yang akan melarang file .sql yang berisi mydb
string, yang merupakan tanda pasti bahwa seseorang menyalin / menempel dari phpMyAdmin tanpa pemeriksaan yang benar.