Tôi đã có một thời gian khó khăn để cố gắng tìm các ví dụ tốt về cách quản lý các lược đồ cơ sở dữ liệu và dữ liệu giữa các máy chủ phát triển, thử nghiệm và sản xuất.
Đây là thiết lập của chúng tôi. Mỗi nhà phát triển có một máy ảo chạy ứng dụng của chúng tôi và cơ sở dữ liệu MySQL. Đó là hộp cát cá nhân của họ để làm bất cứ điều gì họ muốn. Hiện tại, các nhà phát triển sẽ thực hiện thay đổi lược đồ SQL và chuyển cơ sở dữ liệu sang tệp văn bản mà họ cam kết vào SVN.
Chúng tôi muốn triển khai một máy chủ phát triển tích hợp liên tục sẽ luôn chạy mã cam kết mới nhất. Nếu chúng ta làm điều đó ngay bây giờ, nó sẽ tải lại cơ sở dữ liệu từ SVN cho mỗi bản dựng.
Chúng tôi có một máy chủ thử nghiệm (ảo) chạy "phát hành ứng viên". Triển khai đến máy chủ thử nghiệm hiện là một quy trình rất thủ công và thường liên quan đến việc tôi tải SQL mới nhất từ SVN và điều chỉnh nó. Ngoài ra, dữ liệu trên máy chủ thử nghiệm không nhất quán. Bạn kết thúc với bất kỳ dữ liệu thử nghiệm nào mà nhà phát triển cuối cùng cam kết có trên máy chủ hộp cát của mình.
Nơi mọi thứ đổ vỡ là việc triển khai để sản xuất. Vì chúng ta không thể ghi đè dữ liệu trực tiếp bằng dữ liệu thử nghiệm, điều này liên quan đến việc tạo lại thủ công tất cả các thay đổi lược đồ. Nếu có một số lượng lớn các thay đổi lược đồ hoặc tập lệnh chuyển đổi để thao tác dữ liệu, điều này có thể thực sự có lông.
Nếu vấn đề chỉ là lược đồ, thì đó sẽ là một vấn đề dễ dàng hơn, nhưng có dữ liệu "cơ sở" trong cơ sở dữ liệu cũng được cập nhật trong quá trình phát triển, chẳng hạn như dữ liệu meta trong bảng bảo mật và quyền.
Đây là rào cản lớn nhất mà tôi thấy trong việc tiến tới tích hợp liên tục và xây dựng một bước. Làm thế nào để bạn giải quyết nó?
Một câu hỏi tiếp theo: làm thế nào để bạn theo dõi các phiên bản cơ sở dữ liệu để bạn biết tập lệnh nào sẽ chạy để nâng cấp một thể hiện cơ sở dữ liệu đã cho? Là một bảng phiên bản như Lance đề cập dưới quy trình chuẩn?
Cảm ơn bạn đã tham khảo Tarantino. Tôi không ở trong môi trường .NET, nhưng tôi thấy trang wiki DataBaseChangeMangement của họ rất hữu ích. Đặc biệt là bản trình bày Powerpoint này (.ppt)
Tôi sẽ viết một tập lệnh Python để kiểm tra tên của *.sql
các tập lệnh trong một thư mục đã cho dựa vào một bảng trong cơ sở dữ liệu và chạy các tập lệnh không có theo thứ tự dựa trên một số nguyên tạo thành phần đầu tiên của tên tệp. Nếu đó là một giải pháp khá đơn giản, như tôi nghi ngờ nó sẽ có, thì tôi sẽ đăng nó ở đây.
Tôi đã có một kịch bản làm việc cho điều này. Nó xử lý việc khởi tạo DB nếu nó không tồn tại và chạy các kịch bản nâng cấp khi cần thiết. Ngoài ra còn có các công tắc để xóa một cơ sở dữ liệu hiện có và nhập dữ liệu thử nghiệm từ một tệp. Đó là khoảng 200 dòng, vì vậy tôi sẽ không đăng nó (mặc dù tôi có thể đưa nó lên pastebin nếu có hứng thú).