Làm cách nào để đặt cơ sở dữ liệu dưới git (kiểm soát phiên bản)?


274

Tôi đang làm một ứng dụng web và tôi cần tạo một nhánh cho một số thay đổi lớn, điều này là, những thay đổi này yêu cầu thay đổi đối với lược đồ cơ sở dữ liệu, vì vậy tôi cũng muốn đặt toàn bộ cơ sở dữ liệu theo git.

Làm thế nào để làm điều đó? Có một thư mục cụ thể mà tôi có thể giữ trong kho git không? Làm sao để biết cái nào? Làm thế nào tôi có thể chắc chắn rằng tôi đang đặt đúng thư mục?

Tôi cần chắc chắn, vì những thay đổi này không tương thích ngược; Tôi không đủ khả năng để làm hỏng việc.

Cơ sở dữ liệu trong trường hợp của tôi là PostgreSQL

Biên tập:

Có người đề nghị lấy bản sao lưu và đặt tệp sao lưu dưới sự kiểm soát phiên bản thay vì cơ sở dữ liệu. Thành thật mà nói, tôi thấy rằng thực sự khó nuốt.

Có phải là một cách tốt hơn.

Cập nhật:

OK, vì vậy không có cách nào tốt hơn, nhưng tôi vẫn chưa hoàn toàn bị thuyết phục, vì vậy tôi sẽ thay đổi câu hỏi một chút:

Tôi muốn đặt toàn bộ cơ sở dữ liệu dưới sự kiểm soát phiên bản, tôi có thể sử dụng công cụ cơ sở dữ liệu nào để tôi có thể đặt cơ sở dữ liệu thực tế dưới sự kiểm soát phiên bản thay vì kết xuất của nó?

Sqlite sẽ thân thiện với git?

Vì đây chỉ là môi trường phát triển, tôi có thể chọn bất kỳ cơ sở dữ liệu nào tôi muốn.

Chỉnh sửa2:

Điều tôi thực sự muốn không phải là theo dõi lịch sử phát triển của mình, mà là có thể chuyển từ nhánh "thay đổi căn bản mới" của tôi sang "nhánh ổn định hiện tại" và có thể sửa chữa một số lỗi / sự cố, v.v. Chi nhánh ổn định. Như vậy khi tôi chuyển đổi các nhánh, cơ sở dữ liệu sẽ tự động tương thích với nhánh mà tôi hiện đang sử dụng. Tôi không thực sự quan tâm nhiều đến dữ liệu thực tế.


5
Thành thật mà nói, tôi chỉ tạo các bản sao của cơ sở dữ liệu nếu tôi giới thiệu các thay đổi lược đồ và phải xử lý nhiều nhánh phát triển cùng một lúc ... cơ sở dữ liệu dev hy vọng đủ nhỏ để thực hiện điều đó. Tôi coi bất kỳ hệ thống nào cố tỏ ra thông minh và thực hiện thay đổi DB chỉ vì tôi đã thay đổi nhánh nguồn với sự nghi ngờ. Và tôi cũng muốn chắc chắn rằng mọi thứ sẽ tiếp tục hoạt động nếu tôi chỉ nhân bản không gian làm việc của mình và có một chi nhánh ở một địa điểm, và chi nhánh khác ở địa điểm mới.
araqnid


Nếu bạn coi tập lệnh (và các thành phần của nó) để khởi tạo cơ sở dữ liệu của bạn như là một tạo tác dưới sự kiểm soát phiên bản, thì 'bản sao lưu' có vẻ không phải là một điều tồi tệ như vậy. Nếu bạn thay đổi lược đồ db của mình trong một nhánh cấp tiến, bạn cần cập nhật tập lệnh nhập dữ liệu vào cơ sở dữ liệu.
Fuhrmanator

1
Kiểm tra câu trả lời của tôi cho một phần mềm thực hiện chính xác điều này: stackoverflow.com/a/28123546/1662984
Kevin

Câu trả lời:


140

Thay vào đó, hãy lấy cơ sở dữ liệu và kiểm soát phiên bản. Cách này là một tệp văn bản phẳng.

Cá nhân tôi khuyên bạn nên giữ cả kết xuất dữ liệu và kết xuất lược đồ. Cách này sử dụng diff nó trở nên khá dễ dàng để xem những gì đã thay đổi trong lược đồ từ sửa đổi sang sửa đổi.

Nếu bạn đang thực hiện các thay đổi lớn, bạn nên có một cơ sở dữ liệu thứ cấp mà bạn thực hiện các thay đổi lược đồ mới và không chạm vào cơ sở dữ liệu cũ vì như bạn đã nói bạn đang tạo một nhánh.


132
Gì? Phải có một cách tốt hơn.
hasen

18
Các tệp cơ sở dữ liệu PostGreSQL là các tệp nhị phân, vui lòng đặt chúng vào kho git của bạn, bạn sẽ không thể thực hiện bất kỳ khác biệt nào trên chúng và mọi thay đổi rất có thể sẽ thay đổi toàn bộ cơ sở dữ liệu và do đó bạn phải gửi đầy đủ cơ sở dữ liệu qua dây để repo git của bạn và lưu trữ nó. Điều này là không hiệu quả, chậm, và làm cho nó cực kỳ khó để làm việc với. Ngoài ra, tôi không chắc chắn rằng các tệp cơ sở dữ liệu được lưu trữ trên đĩa mà không có VACUUM và tắt PostgreQuery để tạo một bản sao là "ổn định" vì trong tất cả các dữ liệu luôn chính xác, do đó có thể khiến bạn bị hỏng dữ liệu.
X-Istence

6
Hmm tôi thấy! Chà, có hệ thống db nào thân thiện với git hơn không?
hasen

16
Loại giải pháp này khá chuẩn và lược đồ thực sự mã nguồn.
Dana the Sane

12
Đó là năm 2017, có bản cập nhật nào cho câu hỏi này không? Có thực sự không có kiểm soát phiên bản DB ra khỏi hộp không? có thật không ?
Stavm

48

Kiểm tra tái cấu trúc cơ sở dữ liệu ( http://databaserefactoring.com/ ) để biết một loạt các kỹ thuật tốt để duy trì cơ sở dữ liệu của bạn song song với các thay đổi mã.

Đủ để nói rằng bạn đang hỏi những câu hỏi sai. Thay vì đưa cơ sở dữ liệu của bạn vào git, bạn nên phân tách các thay đổi của mình thành các bước có thể kiểm chứng nhỏ để bạn có thể di chuyển / khôi phục các thay đổi lược đồ một cách dễ dàng.

Nếu bạn muốn có khả năng phục hồi hoàn toàn, bạn nên xem xét việc lưu trữ nhật ký WAL của mình và sử dụng PITR (phục hồi theo thời gian) để phát lại các giao dịch chuyển tiếp đến các trạng thái tốt đã biết cụ thể.


2
Tôi không tìm thấy thông tin liên quan trên trang web databaserefactoring ... Nó dường như liệt kê các kỹ thuật tái cấu trúc khác nhau cho mã DB (giống như Fowler đã làm cho mã thông thường)
Nickolay

26

Tôi bắt đầu nghĩ về một giải pháp thực sự đơn giản, không biết tại sao trước đây tôi không nghĩ đến nó !!

  • Sao y cơ sở dữ liệu, (cả lược đồ và dữ liệu).
  • Trong nhánh cho các thay đổi chính mới, chỉ cần thay đổi cấu hình dự án để sử dụng cơ sở dữ liệu trùng lặp mới.

Bằng cách này tôi có thể chuyển đổi các nhánh mà không phải lo lắng về các thay đổi lược đồ cơ sở dữ liệu.

BIÊN TẬP:

Bằng cách sao chép, tôi có nghĩa là tạo một cơ sở dữ liệu khác với một tên khác (như my_db_2); không làm một bãi rác hoặc bất cứ điều gì như thế.


3
Đây có vẻ là giải pháp đơn giản và hiệu quả nhất, nhưng sẽ rất tuyệt nếu có cách nào đó để tự động hóa điều này ... Tôi ngạc nhiên khi chưa có thứ gì đó ở ngoài đó ...
JustMaier

git hook để tạo cơ sở dữ liệu từ mẫu dựa trên tên chi nhánh,
d361

Đây là những gì tôi làm, tôi cũng thêm một dòng kiểm tra IP vào tệp bao gồm các biến DB để nếu tôi vô tình tải tệp "nhánh" sai lên máy chủ trực tiếp thì không có gì bị hỏng.
liamvictor

Rất nhiều chi nhánh đều có DB của riêng mình, phải không? 🤔
Olli

19

Sử dụng một cái gì đó giống như LiquiBase, điều này cho phép bạn giữ quyền kiểm soát sửa đổi các tập tin Liquibase của mình. bạn chỉ có thể gắn thẻ các thay đổi cho sản xuất và có thể cập nhật DB cho sản xuất hoặc phát triển, (hoặc bất kỳ kế hoạch nào bạn muốn).


3
Các thực tiễn tốt nhất của Liguibase khuyên bạn nên giữ các tập lệnh tạo lược đồ như một tập hợp các tập lệnh tuần tự được chạy theo thứ tự. Mặc dù đây là một cách thực hành tốt nhất nhưng tôi không thấy nó hoạt động như thế nào nếu không có kho lưu trữ trung tâm, không phải là GIT.
Frank Schwieterman

1
Chà, nó sẽ hoạt động tốt trên git nếu bạn cẩn thận với thẻ id = và Author = tags. Về lý thuyết, mỗi người dùng sẽ có mục tác giả riêng (TỐT) và nếu bạn làm điều gì đó hợp lý với id =, hãy nói YYYYMMDD_REV, thì bạn sẽ khá tốt. Ngay cả với git, hầu hết mọi người đều có 'repo trung tâm', cho một dự án nhất định. 99% mọi người không có "trung tâm". Một lần nữa, các tệp Liquibase chỉ lập kế hoạch cho các tệp XML-ish văn bản, với một chồng các lệnh để thực thi đối với một DB (hoặc bộ) đã cho. Có thể 99% tất cả các dự án sẽ có 0 vấn đề theo sau trong thực tế, ngay cả với DVCS.
zie

+1 Cho câu trả lời này. Đây là những gì chúng tôi sử dụng trong một số dự án. Id chỉ cần là duy nhất trong một tệp xml. Nếu bạn đặt tên cho id từ trường hợp sử dụng đang triển khai thì chúng đủ độc đáo. Bạn phải cẩn thận không sửa đổi các thay đổi đã áp dụng nếu không bạn sẽ gặp lỗi kiểm tra.
bernardn

7

Đối mặt với nhu cầu tương tự và đây là những gì nghiên cứu của tôi về các hệ thống kiểm soát phiên bản cơ sở dữ liệu đã đưa ra:

  1. Sqitch - nguồn mở dựa trên perl; có sẵn cho tất cả các cơ sở dữ liệu chính bao gồm PostgreSQL https://github.com/sqitchers/sqitch
  2. Mahout - chỉ dành cho PostgreSQL; kiểm soát phiên bản lược đồ cơ sở dữ liệu nguồn mở. https://github.com/cbbrowne/mahout
  3. Liquibase - một phiên bản db kiểm soát mã nguồn mở khác. phiên bản miễn phí của Datical. http://www.liquibase.org/index.html
  4. Datical - phiên bản thương mại của Liquibase - https://www.datical.com/
  5. Flyway by BoxFuse - sw thương mại. https://flywaydb.org/
  6. Một dự án nguồn mở khác https://gitlab.com/depesz/Versioning Author cung cấp một hướng dẫn tại đây: https://www.depesz.com/2010/08/22/versioning/
  7. Red Gate Change Automatic - chỉ dành cho SQL Server. https://www.red-gate.com/products/sql-development/sql-change-automation/

Trong quá khứ, cũng đã có một cái gì đó được gọi ChronicDBlà: ChronicDB provides dynamic database upgrades with zero database downtime and inconsistencies. crunchbase.com/organization/chronicdb#section-overview Một chàng trai tên là Kristis Makris là một trong những người sáng lập, có thể được biết đến với SCMBug: mkgnu.net/scmbug
Thorsten Schöning

6

Có một dự án tuyệt vời được gọi là Di chuyển theo Học thuyết được xây dựng chỉ cho mục đích này.

Nó vẫn ở trạng thái alpha và được xây dựng cho php.

http://docs.doctrine-project.org/projects/doctrine-migations/en/latest/index.html


ops liên kết của bạn bị hỏng ... có thể bạn muốn nói điều này: github.com/doctrine/migations
Francesco Casula

ở đây các tài liệu cho gói tích hợp di chuyển học thuyết trong Symfony2: symfony.com/doc/master/bundles/DoctrineMigationsBundle/iêu
Francesco Casula

1
Cảm ơn vì tiền boa, các anh chàng của Doctrine có xu hướng thay đổi vị trí của các tài liệu, dẫn đến nhiều liên kết bị hỏng, cả ở đây và trên Google. Đã sửa lỗi liên kết.
Hakan Deryal

4

Tôi đã gặp câu hỏi này, vì tôi gặp một vấn đề tương tự, trong đó có thứ gì đó xấp xỉ cấu trúc Thư mục dựa trên DB, lưu trữ 'tệp' và tôi cần git để quản lý nó. Nó được phân phối, trên một đám mây, sử dụng bản sao, do đó điểm truy cập sẽ thông qua MySQL.

Ý chính của các câu trả lời ở trên, dường như tương tự đề xuất một giải pháp thay thế cho vấn đề được hỏi, loại sai nào khi sử dụng Git để quản lý một cái gì đó trong Cơ sở dữ liệu, vì vậy tôi sẽ cố gắng trả lời câu hỏi đó.

Git là một hệ thống, về bản chất lưu trữ một cơ sở dữ liệu về deltas (sự khác biệt), có thể được lắp lại, để tái tạo bối cảnh. Việc sử dụng bình thường của git giả định rằng bối cảnh là một hệ thống tệp và các deltas đó là khác nhau trong hệ thống tệp đó, nhưng thực sự tất cả git là, một cơ sở dữ liệu phân cấp của deltas (phân cấp, bởi vì trong hầu hết các trường hợp, mỗi delta là một cam kết có ít nhất 1 cha mẹ, sắp xếp trong một cái cây).

Miễn là bạn có thể tạo ra một delta, theo lý thuyết, git có thể lưu trữ nó. Vấn đề thường là git mong đợi bối cảnh, trong đó nó tạo ra delta là một hệ thống tệp và tương tự, khi bạn kiểm tra một điểm trong hệ thống phân cấp git, nó sẽ tạo ra một hệ thống tệp.

Nếu bạn muốn quản lý thay đổi, trong cơ sở dữ liệu, bạn có 2 vấn đề riêng biệt và tôi sẽ giải quyết chúng một cách riêng biệt (nếu tôi là bạn). Đầu tiên là lược đồ, thứ hai là dữ liệu (mặc dù trong câu hỏi của bạn, dữ liệu của bạn không phải là thứ bạn quan tâm). Một vấn đề tôi gặp phải trong quá khứ, là cơ sở dữ liệu Dev và Prod, nơi Dev có thể thực hiện các thay đổi gia tăng cho lược đồ và những thay đổi đó phải được ghi lại trong CVS và được hỗ trợ để tồn tại, cùng với một trong một số 'tĩnh' những cái bàn. Chúng tôi đã làm điều đó bằng cách có một cơ sở dữ liệu thứ 3, được gọi là Cruise, chỉ chứa dữ liệu tĩnh. Tại bất kỳ thời điểm nào, lược đồ từ Dev và Cruise có thể được so sánh và chúng tôi đã có một tập lệnh để lấy khác biệt của 2 tệp đó và tạo ra tệp SQL chứa các câu lệnh ALTER, để áp dụng nó. Tương tự như bất kỳ dữ liệu mới nào, có thể được chưng cất vào một tệp SQL có chứa các lệnh INSERT. Miễn là các trường và bảng chỉ được thêm vào và không bao giờ bị xóa, quá trình có thể tự động hóa việc tạo các câu lệnh SQL để áp dụng delta.

Cơ chế mà git tạo ra deltas là diffvà cơ chế mà nó kết hợp 1 hoặc nhiều deltas với một tệp, được gọi merge. Nếu bạn có thể đưa ra một phương pháp để phân biệt và hợp nhất từ ​​một bối cảnh khác, git sẽ hoạt động, nhưng như đã được thảo luận, bạn có thể thích một công cụ làm điều đó cho bạn. Suy nghĩ đầu tiên của tôi về việc giải quyết đó là https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools chi tiết cách thay thế khác biệt nội bộ của git và công cụ hợp nhất. Tôi sẽ cập nhật câu trả lời này, vì tôi đưa ra một giải pháp tốt hơn cho vấn đề, nhưng trong trường hợp của tôi, tôi hy vọng chỉ phải quản lý các thay đổi dữ liệu, từ trước đến nay vì một filestore dựa trên DB có thể thay đổi, vì vậy giải pháp của tôi có thể không chính xác những gì bạn cần.


3

Hãy xem RedGate SQL Source Control.

http://www.red-gate.com/products/sql-development/sql-source-control/

Công cụ này là một snap-in SQL Server Management Studio cho phép bạn đặt cơ sở dữ liệu của mình dưới Kiểm soát nguồn với Git.

Nó hơi đắt với $ 495 mỗi người dùng, nhưng có bản dùng thử miễn phí 28 ngày.

LƯU Ý Tôi không liên kết với RedGate dưới bất kỳ hình thức nào.


3

Tôi muốn làm một cái gì đó tương tự, thêm các thay đổi cơ sở dữ liệu của tôi vào hệ thống kiểm soát phiên bản của tôi.

Tôi sẽ làm theo những ý tưởng trong bài đăng này từ Vladimir Khorikov "Thực hành tốt nhất phiên bản cơ sở dữ liệu" . Tóm lại tôi sẽ

  • lưu trữ cả lược đồ của nó và dữ liệu tham chiếu trong một hệ thống kiểm soát nguồn.
  • với mỗi sửa đổi, chúng tôi sẽ tạo một tập lệnh SQL riêng với các thay đổi

Trong trường hợp nó giúp!


3
  • Irmin
  • Flur.ee
  • Crux DB

Tôi đã tìm kiếm tính năng tương tự cho Postgres (hoặc cơ sở dữ liệu SQL nói chung) trong một thời gian, nhưng tôi thấy không có công cụ nào đủ phù hợp (đơn giản và trực quan). Điều này có lẽ là do tính chất nhị phân của cách dữ liệu được lưu trữ. Klonio nghe có vẻ lý tưởng nhưng có vẻ đã chết. Noms DB trông thú vị ( và còn sống ). Ngoài ra hãy xem Irmin (dựa trên OCaml với các thuộc tính Git).

Mặc dù điều này không trả lời câu hỏi rằng nó sẽ hoạt động với Postgres, hãy kiểm tra cơ sở dữ liệu Flur.ee. Nó có tính năng "du hành thời gian" cho phép bạn truy vấn dữ liệu từ một thời điểm tùy ý. Tôi đoán nó sẽ có thể hoạt động với mô hình "phân nhánh".

Cơ sở dữ liệu này gần đây đã được phát triển cho mục đích blockchain. Do tính chất của blockchains, dữ liệu cần phải được ghi lại theo gia số, đó chính xác là cách git hoạt động. Họ đang nhắm mục tiêu phát hành nguồn mở vào quý 2 năm 2019 .

Bởi vì mỗi cơ sở dữ liệu Fluree là một blockchain, nó lưu trữ toàn bộ lịch sử của mọi giao dịch được thực hiện. Đây là một phần trong cách blockchain đảm bảo thông tin là bất biến và an toàn .

Cập nhật : Đồng thời kiểm tra cơ sở dữ liệu Crux , có thể truy vấn theo chiều thời gian của các phần chèn, mà bạn có thể xem là 'phiên bản'. Crux dường như là một triển khai nguồn mở của Datomic được đánh giá cao.

Crux là một cơ sở dữ liệu bitemporal lưu trữ thời gian giao dịch và lịch sử thời gian hợp lệ. Mặc dù cơ sở dữ liệu tạm thời [uni] cho phép truy vấn "du hành thời gian" thông qua chuỗi giao dịch của trạng thái cơ sở dữ liệu từ thời điểm tạo cơ sở dữ liệu đến trạng thái hiện tại, Crux cũng cung cấp truy vấn "du hành thời gian" cho trục thời gian hợp lệ rời rạc mà không phức tạp thiết kế không cần thiết hoặc tác động hiệu suất. Điều này có nghĩa là người dùng Crux có thể cung cấp cơ sở dữ liệu với thông tin trong quá khứ và tương lai bất kể thứ tự thông tin đến và sửa các bản ghi trong quá khứ để xây dựng mô hình tạm thời cải tiến của một miền nhất định.


2

Bạn không thể làm điều đó mà không có tính nguyên tử và bạn không thể có được tính nguyên tử mà không cần sử dụng pg_dump hoặc hệ thống tập tin chụp nhanh.

Ví dụ postgres của tôi là trên zfs, thỉnh thoảng tôi chụp nhanh. Đó là khoảng ngay lập tức và nhất quán.


2

Những gì bạn muốn, về tinh thần, có lẽ là một cái gì đó giống như Post Facto , nơi lưu trữ các phiên bản của cơ sở dữ liệu trong cơ sở dữ liệu. Kiểm tra bài trình bày này .

Dự án dường như chưa bao giờ thực sự đi đến đâu, vì vậy có lẽ nó sẽ không giúp bạn ngay lập tức, nhưng đó là một khái niệm thú vị. Tôi sợ rằng làm điều này đúng sẽ rất khó, bởi vì ngay cả phiên bản 1 cũng sẽ phải có được tất cả các chi tiết ngay để mọi người tin tưởng vào công việc của họ.


2

Tôi đã phát hành một công cụ cho sqlite, đó là những gì bạn yêu cầu. Nó sử dụng trình điều khiển khác biệt tùy chỉnh tận dụng công cụ dự án sqlite 'sqldiff', UUID làm khóa chính và rời khỏi hàng sqlite. Nó vẫn ở dạng alpha nên thông tin phản hồi được đánh giá cao.

Postgres và mysql phức tạp hơn, vì dữ liệu nhị phân được lưu trong nhiều tệp và thậm chí có thể không hợp lệ nếu bạn có thể chụp nhanh nó.

https://github.com/cannadayr/git-sqlite


Có vẻ như bạn cho phép git lưu trữ dữ liệu nhị phân nguyên trạng. Thay vào đó, người ta có thể sử dụng các bộ lọc sạch / nhòe để lưu trữ các bãi chứa. Có một số kịch bản làm điều đó.
max630

1
Cách tiếp cận hợp lý, ngoại trừ khi bạn tìm hai trạng thái cơ sở dữ liệu, bạn đang thực hiện một khác biệt văn bản của kết xuất. Bằng cách sử dụng sqldiff như một trình điều khiển khác biệt tùy chỉnh, bạn có được các lệnh thực tế để thay đổi cơ sở dữ liệu của bạn sang trạng thái tiếp theo.
cannadayr

1

Tôi nghĩ X-Istence đang đi đúng hướng, nhưng có một vài cải tiến nữa bạn có thể thực hiện cho chiến lược này. Lần dùng đầu tiên:

$pg_dump --schema ... 

để kết xuất các bảng, trình tự, vv và đặt tệp này dưới sự kiểm soát phiên bản. Bạn sẽ sử dụng điều này để phân tách các thay đổi tương thích giữa các chi nhánh của bạn.

Tiếp theo, thực hiện kết xuất dữ liệu cho tập hợp các bảng chứa cấu hình cần thiết để ứng dụng của bạn hoạt động (có thể nên bỏ qua dữ liệu người dùng, v.v.), như mặc định của biểu mẫu và dữ liệu không thể sửa đổi dữ liệu khác của người dùng. Bạn có thể làm điều này một cách chọn lọc bằng cách sử dụng:

$pg_dump --table=.. <or> --exclude-table=..

Đây là một ý tưởng tốt vì repo có thể trở nên thực sự lộn xộn khi cơ sở dữ liệu của bạn đạt 100Mb + khi thực hiện kết xuất dữ liệu đầy đủ. Một ý tưởng tốt hơn là sao lưu một bộ dữ liệu tối thiểu hơn mà bạn yêu cầu để kiểm tra ứng dụng của mình. Nếu dữ liệu mặc định của bạn là rất lớn, điều này vẫn có thể gây ra vấn đề.

Nếu bạn thực sự cần đặt các bản sao lưu đầy đủ trong repo, hãy xem xét thực hiện nó trong một nhánh bên ngoài cây nguồn của bạn. Một hệ thống sao lưu ngoài với một số tham chiếu đến svn rev phù hợp có khả năng tốt nhất cho điều này mặc dù.

Ngoài ra, tôi đề nghị sử dụng các định dạng văn bản kết xuất trên nhị phân cho mục đích sửa đổi (ít nhất là cho lược đồ) vì chúng dễ dàng khác hơn. Bạn luôn có thể nén chúng để tiết kiệm không gian trước khi đăng ký.

Cuối cùng, hãy xem tài liệu sao lưu postgres nếu bạn chưa có. Cách bạn bình luận về việc sao lưu 'cơ sở dữ liệu' chứ không phải là kết xuất khiến tôi tự hỏi liệu bạn có nghĩ đến các bản sao lưu dựa trên hệ thống tệp không (xem phần 23.2 để biết thêm).


không phải bãi rác chỉ là một bản sao lưu?
hasen

Có, nhưng bạn có thể khôi phục nó vào cơ sở dữ liệu thay thế và thực hiện các sửa đổi của mình ở đó.
Dana the Sane

1

Câu hỏi này được trả lời khá nhiều nhưng tôi muốn bổ sung cho câu trả lời của X-Istence và Dana the Sane bằng một gợi ý nhỏ.

Nếu bạn cần kiểm soát sửa đổi với một mức độ chi tiết nào đó, giả sử hàng ngày, bạn có thể kết hợp kết xuất văn bản của cả bảng và lược đồ với một công cụ như sao lưu dự phòng , sao lưu dự phòng gia tăng. Ưu điểm là thay vì lưu trữ ảnh chụp nhanh của các bản sao lưu hàng ngày, bạn chỉ cần lưu trữ sự khác biệt so với ngày trước.

Với điều này, bạn có cả lợi thế của kiểm soát sửa đổi và bạn không lãng phí quá nhiều không gian.

Trong mọi trường hợp, sử dụng git trực tiếp trên các tệp phẳng lớn thay đổi rất thường xuyên không phải là một giải pháp tốt. Nếu cơ sở dữ liệu của bạn trở nên quá lớn, git sẽ bắt đầu gặp một số vấn đề trong việc quản lý các tệp.


1

Đây là những gì tôi đang cố gắng làm trong các dự án của mình:

  • dữ liệu riêng biệt và lược đồ và dữ liệu mặc định.

Cấu hình cơ sở dữ liệu được lưu trữ trong tệp cấu hình không thuộc kiểm soát phiên bản (.gitignore)

Mặc định cơ sở dữ liệu (để thiết lập Dự án mới) là một tệp SQL đơn giản dưới sự kiểm soát phiên bản.

Đối với lược đồ cơ sở dữ liệu, hãy tạo một kết xuất lược đồ cơ sở dữ liệu dưới sự kiểm soát phiên bản.

Cách phổ biến nhất là có các tập lệnh cập nhật có chứa Câu lệnh SQL, (Bảng ALTER .. hoặc CẬP NHẬT). Bạn cũng cần phải có một vị trí trong cơ sở dữ liệu của bạn, nơi bạn lưu phiên bản hiện tại của lược đồ của bạn)

Hãy xem các dự án cơ sở dữ liệu nguồn mở lớn khác (piwik hoặc hệ thống cms yêu thích của bạn), tất cả đều sử dụng các bản cập nhật (1.sql, 2.sql, 3.sh, 4.php.5.sql)

Nhưng đây là một công việc rất tốn thời gian, bạn phải tạo và kiểm tra các bản cập nhật và bạn cần chạy một bản cập nhật chung để so sánh phiên bản và chạy tất cả các tập lệnh cập nhật cần thiết.

Vì vậy, về mặt lý thuyết (và đó là những gì tôi đang tìm kiếm), bạn có thể kết xuất lược đồ cơ sở dữ liệu sau mỗi thay đổi (thủ công, conjob, git hook (có thể trước khi cam kết)) (và chỉ trong một số trường hợp rất đặc biệt mới tạo bản cập nhật)

Sau đó trong bản cập nhật chung của bạn (chạy các bản cập nhật thông thường, cho các trường hợp đặc biệt) và sau đó so sánh các lược đồ (kết xuất và cơ sở dữ liệu hiện tại) và sau đó tự động tạo ra các Báo cáo ALTER không cần thiết. Có một số công cụ có thể làm điều này rồi, nhưng vẫn chưa tìm thấy một công cụ tốt.


1

Tôi muốn giới thiệu neXtep cho phiên bản kiểm soát cơ sở dữ liệu, nó có một bộ tài liệu và diễn đàn tốt giải thích cách cài đặt và các lỗi gặp phải. Tôi đã thử nghiệm nó cho postgreSQL 9.1 và 9.3, tôi đã có thể làm cho nó hoạt động trong 9.1 nhưng cho 9.3 nó dường như không hoạt động.


@Nickolay Có vẻ như đã ngưng. Là một thay thế tại sao bạn không thử Skitch, bạn sẽ tìm thấy nó ở đây sqitch.org
Jerry M Sunny

Cảm ơn, sẽ kiểm tra xem nó ra!
Nickolay

1

Những gì tôi làm trong các dự án cá nhân của mình là, tôi lưu trữ toàn bộ cơ sở dữ liệu của mình vào dropbox và sau đó trỏ công việc MAMP, WAMP để sử dụng nó ngay từ đó .. Đó là cách cơ sở dữ liệu luôn cập nhật khi tôi cần phát triển. Nhưng đó chỉ là dành cho dev! Các trang web trực tiếp đang sử dụng máy chủ riêng cho khóa học đó! :)


1

Lưu trữ từng cấp độ thay đổi cơ sở dữ liệu trong điều khiển phiên bản git giống như đẩy toàn bộ cơ sở dữ liệu của bạn với từng cam kết và khôi phục toàn bộ cơ sở dữ liệu của bạn với mỗi lần kéo. Nếu cơ sở dữ liệu của bạn rất dễ bị thay đổi quan trọng và bạn không đủ khả năng để mất chúng, bạn chỉ có thể cập nhật các móc pre_commitpost_merge của mình . Tôi đã làm tương tự với một trong những dự án của tôi và bạn có thể tìm thấy hướng dẫn ở đây .


1

Đó là cách tôi làm:

Vì bạn có quyền chọn miễn phí về loại DB, hãy sử dụng DB có tên như ví dụ như firebird.

Tạo một DB mẫu có lược đồ phù hợp với chi nhánh thực của bạn và lưu trữ nó trong kho lưu trữ của bạn.

Khi thực thi ứng dụng của bạn lập trình tạo một bản sao DB mẫu của bạn, lưu trữ nó ở một nơi khác và chỉ làm việc với bản sao đó.

Bằng cách này, bạn có thể đặt lược đồ DB của mình dưới sự kiểm soát phiên bản mà không cần dữ liệu. Và nếu bạn thay đổi lược đồ của mình, bạn chỉ cần thay đổi mẫu DB


1

Chúng tôi đã từng chạy một trang web xã hội, trên cấu hình LAMP tiêu chuẩn. Chúng tôi đã có một máy chủ Live, máy chủ thử nghiệm và máy chủ Phát triển, cũng như các máy phát triển cục bộ. Tất cả đều được quản lý bằng GIT.

Trên mỗi máy, chúng tôi có các tệp PHP, nhưng cũng có dịch vụ MySQL và một thư mục có Hình ảnh mà người dùng sẽ tải lên. Máy chủ Live phát triển để có một số người dùng định kỳ 100K (!), Đổ khoảng 2GB (!), Thư mục hình ảnh là khoảng 50 GB (!). Khi tôi rời đi, máy chủ của chúng tôi đã đạt đến giới hạn của CPU, Ram và hơn hết là giới hạn kết nối mạng đồng thời (Chúng tôi thậm chí đã biên dịch phiên bản trình điều khiển card mạng của riêng mình để tối đa hóa máy chủ 'lol'). Chúng tôi không thể (bạn cũng không nên giả sử với trang web của mình ) đặt 2GB dữ liệu và 50GB hình ảnh vào GIT.

Để dễ dàng quản lý tất cả điều này trong GIT, chúng tôi sẽ bỏ qua các thư mục nhị phân (các thư mục chứa Hình ảnh) bằng cách chèn các đường dẫn thư mục này vào .gitignore. Chúng tôi cũng có một thư mục có tên SQL bên ngoài đường dẫn tài liệu Apache. Trong thư mục SQL đó, chúng tôi sẽ đặt các tệp SQL của chúng tôi từ các nhà phát triển theo số tăng dần (001.florianm.sql, 001.johns.sql, 002.florianm.sql, v.v.). Các tệp SQL này cũng được quản lý bởi GIT. Tệp sql đầu tiên thực sự sẽ chứa một tập hợp lớn lược đồ DB. Chúng tôi không thêm dữ liệu người dùng vào GIT (ví dụ: các bản ghi của bảng người dùng hoặc bảng nhận xét), nhưng dữ liệu như cấu hình hoặc cấu trúc liên kết hoặc dữ liệu cụ thể của trang web khác, được duy trì trong các tệp sql (và do đó là GIT). Chủ yếu là các nhà phát triển (người biết mã tốt nhất) xác định cái gì và cái gì không được GIT duy trì liên quan đến lược đồ và dữ liệu SQL.

Khi có bản phát hành, quản trị viên đăng nhập vào máy chủ dev, hợp nhất nhánh sống với tất cả các nhà phát triển và các nhánh cần thiết trên máy dev thành nhánh cập nhật và đẩy nó đến máy chủ thử nghiệm. Trên máy chủ thử nghiệm, anh ta kiểm tra xem quy trình cập nhật cho máy chủ Live có còn hợp lệ hay không và liên tiếp nhanh chóng, trỏ tất cả lưu lượng truy cập trong Apache đến một trang giữ chỗ, tạo một bãi chứa DB, trỏ thư mục làm việc từ 'live' sang 'update ', Thực thi tất cả các tệp sql mới vào mysql và đưa lại lưu lượng truy cập trở lại đúng trang web. Khi tất cả các bên liên quan đồng ý sau khi xem xét máy chủ thử nghiệm, Quản trị viên đã làm điều tương tự từ Máy chủ thử nghiệm đến Máy chủ trực tiếp. Sau đó, anh hợp nhất chi nhánh trực tiếp trên máy chủ sản xuất, đến chi nhánh chính trên tất cả các máy chủ và từ chối tất cả các chi nhánh trực tiếp.

Nếu có vấn đề trên máy chủ thử nghiệm, vd. các sự hợp nhất có quá nhiều xung đột, sau đó mã được hoàn nguyên (hướng nhánh làm việc trở lại 'live') và các tệp sql không bao giờ được thực thi. Thời điểm các tệp sql được thực thi, đây được coi là một hành động không thể đảo ngược tại thời điểm đó. Nếu các tệp SQL không hoạt động chính xác, thì DB đã được khôi phục bằng cách sử dụng Dump (và các nhà phát triển đã loại bỏ, để cung cấp các tệp SQL không được kiểm tra).

Ngày nay, chúng tôi duy trì cả thư mục sql-up và sql-down, với tên tệp tương đương, trong đó các nhà phát triển phải kiểm tra rằng cả hai tệp nâng cấp sql, có thể bị hạ cấp như nhau. Điều này cuối cùng có thể được thực hiện với một tập lệnh bash, nhưng đó là một ý tưởng tốt nếu mắt người tiếp tục theo dõi quá trình nâng cấp.

Nó không tuyệt vời, nhưng nó có thể quản lý được. Hy vọng điều này cung cấp một cái nhìn sâu sắc về một trang web thực tế, thực tế, tương đối cao. Có thể là một chút lỗi thời, nhưng vẫn theo sau.


0

Sử dụng một công cụ như iBatis Migations ( thủ công , video hướng dẫn ngắn ) cho phép bạn phiên bản kiểm soát các thay đổi bạn thực hiện đối với cơ sở dữ liệu trong suốt vòng đời của dự án, thay vì cơ sở dữ liệu.

Điều này cho phép bạn áp dụng có chọn lọc các thay đổi riêng lẻ cho các môi trường khác nhau, giữ nguyên thay đổi trong đó thay đổi trong môi trường nào, tạo tập lệnh để áp dụng thay đổi từ A đến N, thay đổi rollback, v.v.


0

Tôi muốn đặt toàn bộ cơ sở dữ liệu dưới sự kiểm soát phiên bản, tôi có thể sử dụng công cụ cơ sở dữ liệu nào để tôi có thể đặt cơ sở dữ liệu thực tế dưới sự kiểm soát phiên bản thay vì kết xuất của nó?

Đây không phải là cơ sở dữ liệu phụ thuộc. Bởi Microsoft SQL Server có rất nhiều chương trình kiểm soát phiên bản. Tôi không nghĩ rằng vấn đề có thể được giải quyết bằng git, bạn phải sử dụng một hệ thống kiểm soát phiên bản lược đồ cụ thể pssql. Tôi không biết liệu một thứ như vậy có tồn tại hay không ...


2
Bạn thực sự nên xem klonio, nó được thiết kế riêng cho cơ sở dữ liệu phiên bản (hiện đang hỗ trợ Mongo và MySQL). Vẫn đang trong giai đoạn thử nghiệm, nhưng có vẻ khá hứa hẹn.
farthVader

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.