Làm thế nào để bạn phiên bản lược đồ cơ sở dữ liệu của bạn? [đóng cửa]


128

Làm thế nào để bạn chuẩn bị deltas SQL của bạn? Bạn có tự lưu từng SQL thay đổi lược đồ vào một thư mục delta hay bạn có một quy trình khuếch tán tự động nào không?

Tôi quan tâm đến các quy ước cho việc lập phiên bản lược đồ cơ sở dữ liệu cùng với mã nguồn. Có lẽ một hook pre-commit khác với lược đồ?

Ngoài ra, những lựa chọn nào cho deltas khác biệt tồn tại ngoài DbDeploy ?

EDIT: nhìn thấy câu trả lời tôi muốn làm rõ rằng tôi quen thuộc với sơ đồ tiêu chuẩn để chạy di chuyển cơ sở dữ liệu bằng deltas. Câu hỏi của tôi là về việc tạo ra đồng bằng, tốt nhất là tự động.

Ngoài ra, phiên bản dành cho PHP và MySQL nếu nó tạo ra sự khác biệt. (Không có giải pháp Ruby xin vui lòng).


Tôi sử dụng lược đồ để tạo một bản vá (và tập lệnh rollback). Chúng được thêm vào repo SVN. Nó không hoàn hảo nhưng nó hoạt động tốt với tôi. Thêm vào đó, việc triển khai các thay đổi lược đồ khá dễ dàng với lược đồ
Jay Sidri

Liên kết này xuất hiện trống rỗng - điều này vẫn còn tồn tại?
vui vẻ

Có vẻ như nó đã di chuyển: github.com/mmatuson/SchemaSync
Jay Sidri

Câu trả lời:


61

Xem

Có một hệ thống kiểm soát phiên bản để thay đổi cấu trúc cơ sở dữ liệu?

Làm cách nào để phiên bản cơ sở dữ liệu MS SQL của tôi trong SVN?

và bài viết của Jeff

Nhận cơ sở dữ liệu của bạn dưới sự kiểm soát phiên bản

Tôi cảm thấy nỗi đau của bạn, và tôi muốn có một câu trả lời tốt hơn. Điều này có thể gần hơn với những gì bạn đang tìm kiếm.

Các cơ chế theo dõi thay đổi lược đồ DB

Nói chung, tôi cảm thấy không có giải pháp phù hợp, được chấp nhận cho vấn đề này, và tôi tự lăn lộn trong lĩnh vực này.


Như bạn có thể nói từ câu hỏi của tôi, tôi nhận thức được khái niệm về đồng bằng châu thổ. Câu hỏi của tôi là về các quy ước để tạo ra chúng, tốt nhất là tự động.
Eran Galperin

Tôi đoán tôi sẽ tự lăn lộn sau đó ...;)
Eran Galperin

Bạn đã thử DBDiff: github.com/DBDiff/DBDiff chưa? Nó phù hợp với những gì bạn đang tìm kiếm @EranGalperin vì nó tự động di chuyển cho cả lược đồ và dữ liệu trong SQL. Tiết lộ Tôi là nhà phát triển đằng sau nó!
Jasdeep Khalsa


4

Nếu bạn vẫn đang tìm kiếm các tùy chọn: hãy xem nhà thiết kế neXtep. Nó là một môi trường phát triển cơ sở dữ liệu GPL miễn phí dựa trên các khái niệm về kiểm soát phiên bản. Trong môi trường bạn luôn làm việc với các thực thể được phiên bản và có thể tập trung vào phát triển mô hình dữ liệu. Khi quá trình phát hành được thực hiện, công cụ tạo SQL được cắm trên hệ thống kiểm soát phiên bản có thể tạo ra bất kỳ delta nào bạn cần giữa 2 phiên bản và sẽ cung cấp cho bạn một số cơ chế phân phối nếu bạn cần.

Trong số những thứ khác, bạn có thể đồng bộ hóa và đảo ngược đồng bộ hóa cơ sở dữ liệu của mình trong quá trình phát triển, tạo sơ đồ mô hình dữ liệu, truy vấn cơ sở dữ liệu của bạn bằng các máy khách SQL tích hợp, v.v.

Hãy xem wiki để biết thêm thông tin: http://www.nextep-softwares.com/wiki

Nó hiện hỗ trợ Oracle, MySql và PostgreSql và có trong java nên sản phẩm chạy trên windows, linux và mac.


3

Tôi chắc chắn rằng các thay đổi lược đồ luôn luôn là phụ gia. Vì vậy, tôi không bỏ cột và bảng, vì điều đó sẽ hạ gục dữ liệu và không thể quay lại sau. Bằng cách này, mã sử dụng cơ sở dữ liệu có thể được khôi phục mà không làm mất dữ liệu hoặc chức năng.

Tôi có một tập lệnh di chuyển chứa các câu lệnh tạo các bảng và cột nếu chúng chưa tồn tại và điền chúng vào dữ liệu.

Tập lệnh di chuyển chạy bất cứ khi nào mã sản xuất được cập nhật và sau khi cài đặt mới.

Khi tôi muốn loại bỏ một cái gì đó, tôi làm điều đó bằng cách loại bỏ chúng khỏi tập lệnh cài đặt cơ sở dữ liệu và tập lệnh di chuyển để các phần tử lược đồ lỗi thời này sẽ dần được loại bỏ trong các bản cài đặt mới. Với nhược điểm là các bản cài đặt mới không thể hạ cấp xuống phiên bản cũ hơn trước khi cài đặt.

Và tất nhiên tôi thực thi DDL thông qua các tập lệnh này và không bao giờ trực tiếp trên cơ sở dữ liệu để giữ mọi thứ đồng bộ.


2

Tôi không quản lý đồng bằng châu thổ. Tôi thực hiện các thay đổi đối với cơ sở dữ liệu chủ và có một công cụ tạo tập lệnh xây dựng dựa trên XML dựa trên cơ sở dữ liệu chính.

Khi đến lúc nâng cấp cơ sở dữ liệu hiện có, tôi có một chương trình sử dụng tập lệnh xây dựng dựa trên XML để tạo cơ sở dữ liệu mới và các bảng trống. Sau đó, tôi sao chép dữ liệu từ cơ sở dữ liệu cũ bằng cách sử dụng INSERT INTO x CHỌN TỪ y và sau đó áp dụng tất cả các chỉ mục, các ràng buộc và kích hoạt.

Tất cả các bảng mới, cột mới, cột bị xóa đều được xử lý tự động và với một vài thủ thuật nhỏ để điều chỉnh thói quen sao chép, tôi có thể xử lý việc đổi tên cột, thay đổi loại cột và các phép tái cấu trúc cơ bản khác.

Tôi sẽ không đề xuất giải pháp này trên cơ sở dữ liệu với lượng dữ liệu khổng lồ nhưng tôi thường xuyên cập nhật cơ sở dữ liệu trên 1GB với 400 bảng.


Điều này nghe có vẻ hơi cồng kềnh, đặc biệt là khi giao dịch với nhiều nhà phát triển. Ngoài ra quá trình xây dựng nghe có vẻ đòi hỏi, và tôi muốn đơn giản nhất có thể.
Eran Galperin

Tôi thừa nhận phải mất một thời gian để có được quyền nhưng bây giờ hầu như không cần nỗ lực để chuẩn bị nâng cấp và thậm chí ít hơn để thực hiện. Ngoài ra, một điều tôi thích là tôi có thể thực hiện các thay đổi hotfix tạm thời và nó không ảnh hưởng đến quy trình nâng cấp. Mỗi bản nâng cấp là một DB mới.
Darrel Miller

2

Bạn đã không đề cập đến RDBMS nào bạn đang sử dụng, nhưng nếu đó là MS SQL Server, So sánh SQL của Red-Gate là không thể thiếu đối với chúng tôi trong việc tạo ra các vùng đồng bằng giữa các tập lệnh tạo đối tượng.


1
Đó là vì Mysql, tôi đã cập nhật câu hỏi của mình
Eran Galperin

2

Tôi không phải là người tự mình tìm ra tiếng còi của mình, nhưng tôi đã phát triển một ứng dụng web nội bộ để theo dõi các thay đổi đối với các lược đồ cơ sở dữ liệu và tạo các tập lệnh cập nhật theo phiên bản.

Công cụ này được gọi là Brazil và hiện là nguồn mở theo giấy phép MIT. Brazil là ruby ​​/ ruby ​​trên đường ray dựa trên và hỗ trợ triển khai thay đổi cho bất kỳ cơ sở dữ liệu nào mà Ruby DBI hỗ trợ (MySQL, ODBC, Oracle, Postgres, SQLite).

Hỗ trợ đưa các kịch bản cập nhật vào kiểm soát phiên bản được lên kế hoạch.


Brazil có vẻ khá tốt, quá tệ Tôi đang sử dụng chủ yếu là PHP. Bao giờ xem xét chuyển hệ thống?
Eran Galperin


1

Chúng tôi đang xuất dữ liệu sang định dạng di động (sử dụng chuỗi công cụ của chúng tôi), sau đó nhập dữ liệu vào một lược đồ mới. không cần SQL delta. Rất khuyến khích.


3
Định dạng di động này là gì? và làm thế nào để bạn nhập nó vào lược đồ mới chỉ áp dụng những khác biệt so với phiên bản trước?
Eran Galperin

1

Tôi sử dụng cơ sở dữ liệu Firebird cho hầu hết sự phát triển và tôi sử dụng công cụ quản trị FlameRobin cho nó. Nó có một tùy chọn tốt đẹp để ghi lại tất cả các thay đổi. Nó có thể ghi lại mọi thứ vào một tệp lớn hoặc một tệp cho mỗi thay đổi cơ sở dữ liệu. Tôi sử dụng tùy chọn thứ hai này và sau đó tôi lưu trữ từng tập lệnh trong phần mềm kiểm soát phiên bản - trước đây tôi đã sử dụng Subversion, bây giờ tôi sử dụng Git.

Tôi giả sử bạn có thể tìm thấy một số công cụ MySQL có tính năng ghi nhật ký giống như FlameRobin dành cho Firebird.

Trong một trong các bảng cơ sở dữ liệu, tôi lưu trữ số phiên bản của cấu trúc cơ sở dữ liệu, vì vậy tôi có thể nâng cấp bất kỳ cơ sở dữ liệu nào một cách dễ dàng. Tôi cũng đã viết một tập lệnh PHP đơn giản thực thi từng tập lệnh SQL trên bất kỳ cơ sở dữ liệu đích nào (đường dẫn cơ sở dữ liệu và tên người dùng / mật khẩu được cung cấp trên dòng lệnh).

Ngoài ra còn có một tùy chọn để ghi nhật ký tất cả các câu lệnh DML (chèn, cập nhật xóa) và tôi kích hoạt điều này trong khi sửa đổi một số dữ liệu 'mặc định' mà mỗi cơ sở dữ liệu chứa.

Tôi đã viết một tờ giấy trắng đẹp về cách tôi làm tất cả điều này một cách chi tiết. Bạn có thể tải xuống bài báo ở định dạng .pdf cùng với các tập lệnh PHP demo từ đây .


1

Tôi cũng đã phát triển một tập các kịch bản PHP nơi các nhà phát triển có thể gửi các tập lệnh deltasql của họ đến một kho lưu trữ trung tâm.

Trong một trong các bảng cơ sở dữ liệu (được gọi là TBSYNCHRONIZE), tôi lưu trữ số phiên bản của tập lệnh thực thi mới nhất, vì vậy tôi có thể nâng cấp bất kỳ cơ sở dữ liệu nào một cách dễ dàng bằng cách sử dụng giao diện web hoặc máy khách được phát triển có chủ đích cho Eclipse.

Giao diện web cho phép quản lý một số dự án. Nó cũng hỗ trợ cơ sở dữ liệu "chi nhánh".

Bạn có thể kiểm tra ứng dụng tại http://www.gpu-grid.net/deltasql (nếu bạn đăng nhập với tư cách quản trị viên bằng mật khẩu testdbsync). Ứng dụng này là mã nguồn mở và có thể tải xuống tại đây: http://sourceforge.net/projects/deltasql

deltasql được sử dụng hiệu quả ở Thụy Sĩ và Ấn Độ, và phổ biến ở Nhật Bản.


1

Vài tháng trước tôi đã tìm kiếm công cụ để lập phiên bản lược đồ MySQL. Tôi đã tìm thấy nhiều công cụ hữu ích, như di chuyển Doctrine, di chuyển RoR, một số công cụ được viết bằng Java và Python.

Nhưng không ai trong số họ hài lòng với yêu cầu của tôi.

Yêu cầu của tôi:

  1. Không có yêu cầu, loại trừ PHP và MySQL
  2. Không có tệp cấu hình lược đồ, như lược đồ.yml trong Doctrine
  3. Có thể đọc lược đồ hiện tại từ kết nối và tạo tập lệnh di chuyển mới, hơn là biểu thị lược đồ giống hệt nhau trong các cài đặt ứng dụng khác.

Tôi bắt đầu viết công cụ di chuyển của mình và hôm nay tôi có phiên bản beta.

Xin vui lòng, hãy thử nó, nếu bạn có hứng thú với chủ đề này. Xin vui lòng gửi cho tôi yêu cầu trong tương lai và bugreports.

Mã nguồn: bitbucket.org/idler/mmp/src Tổng quan bằng tiếng Anh: bitbucket.org/idler/mmp/wiki/Home Tổng quan bằng tiếng Nga: antonoff.info/development/mysql-migration-with-php-project


Bạn cũng có một công cụ mới: DBV: stackoverflow.com/a/13837473/6309
VonC


1

Tôi quan tâm đến chủ đề này quá.

một số cuộc thảo luận về chủ đề này trong wiki Django .

Thật thú vị, có vẻ như CakePHP có phiên bản lược đồ được tích hợp sẵn bằng cách sử dụng cake schema generatelệnh.


Từ những gì tôi đọc về giải pháp của bánh - đó là phiên bản theo nghĩa rất cơ bản, tuy nhiên nó không có khả năng khác biệt nên nó không có ích gì với tôi.
Eran Galperin

1

Dành cho MySQL

Khi tôi hạ cánh trên một DB mới:

Đầu tiên, tôi kiểm tra cấu trúc:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Nhờ người dùng stackoverflow tôi có thể viết kịch bản nhanh này để tìm sự khác biệt về cấu trúc.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

Trong bước thứ hai, tôi kiểm tra dữ liệu, từng bảng một mysqldiff. Đó là một chút cổ xưa nhưng một vòng lặp php dựa trên information_schemadữ liệu làm cho công việc chắc chắn

Để tạo phiên bản, tôi sử dụng cùng một cách nhưng tôi định dạng tập lệnh cập nhật SQL (để nâng cấp hoặc khôi phục) với kết quả khác và tôi sử dụng quy ước số phiên bản (với một vài sửa đổi, số phiên bản trông giống như một địa chỉ IP) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

Tôi đang sử dụng phiên bản nghiêm ngặt của lược đồ cơ sở dữ liệu (được theo dõi trong một bảng riêng). Các tập lệnh được lưu trữ trong kiểm soát phiên bản, nhưng tất cả đều xác minh phiên bản lược đồ hiện tại trước khi thực hiện bất kỳ thay đổi nào.

Dưới đây là toàn bộ triển khai cho SQL Server (có thể phát triển cùng một giải pháp cho MySQL nếu cần): Cách duy trì phiên bản lược đồ cơ sở dữ liệu SQL Server


Tôi vừa đọc bài viết của bạn. Bạn vẫn sử dụng cái này hay bạn đã áp dụng một giải pháp sẵn có như DBUp hay ReadyRoll?
David Atkinson

Hiện tại, tất cả các dự án của tôi đều dựa vào Entity Framework Code-First và tôi sử dụng các chuyển đổi của nó để phiên bản cơ sở dữ liệu. Tôi có giải pháp từ bài báo trong một vài dự án cũ và tôi không bao giờ thay thế nó. Trong các dự án khác, tôi đã sử dụng các công cụ Redgate để quản lý lược đồ và di chuyển.
Zoran Horvat

Thật tuyệt khi bạn là người dùng Redgate! Nếu bạn muốn sử dụng các công cụ Redgate kết hợp với EF, thì có thể: red-gate.com/blog/database-lifecycle-man Quản lý / trộm
David Atkinson

Tôi chắc chắn sẽ thử nó trong cơ hội tiếp theo. Nó đã phục vụ chúng tôi tốt, nhưng tôi đã thay đổi nhóm trong khi đó và bây giờ tôi đang thử nghiệm với sự hỗ trợ của EF trước khi đẩy nó về phía trước.
Zoran Horvat

0

Sau một thời gian dài điều tra, tôi phát hiện ra rằng có một số công cụ của bên thứ 3 hoặc các loại dự án Visual Studio không làm tôi hài lòng, hoặc chỉ viết blog về lý thuyết nhưng không thực hiện. Vì vậy, tôi đã thực hiện một hệ thống làm việc, được sử dụng gần một năm và giải thích ở đây:

http://nalerskym.com/2015/11/09/database-versioning-part-1/

tùy theo sở thích, sẽ tiếp tục viết thêm.


2
Xin chào, chào mừng đến với SO. Câu trả lời này không thực sự đầy đủ, về cơ bản nó chỉ cung cấp một liên kết. Câu trả lời chỉ liên kết không phải là câu trả lời hay nhất: nếu liên kết trở nên không hợp lệ, câu trả lời của bạn sẽ trở nên vô dụng. Vì vậy, vui lòng chỉnh sửa nó và thêm ít nhất một bản tóm tắt về những gì có thể tìm thấy ở đó, để câu trả lời của bạn có giá trị độc lập với liên kết. Cảm ơn bạn!
Fabio nói Phục hồi lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.