Là sao lưu cơ sở dữ liệu MySQL trong Git là một ý tưởng tốt?


57

Tôi đang cố gắng cải thiện tình hình sao lưu cho ứng dụng của mình. Tôi có một ứng dụng Django và cơ sở dữ liệu MySQL. Tôi đọc một bài viết đề nghị sao lưu cơ sở dữ liệu trong Git.

Một mặt tôi thích nó, vì nó sẽ giữ một bản sao của dữ liệu và mã đồng bộ.

Nhưng Git được thiết kế cho mã, không phải cho dữ liệu. Vì vậy, nó sẽ thực hiện rất nhiều công việc bổ sung khác với kết xuất MySQL mỗi cam kết, điều này không thực sự cần thiết. Nếu tôi nén tệp trước khi lưu trữ, git vẫn khác các tệp chứ?

(Tệp kết xuất hiện không được nén 100 MB, 5,7 MB khi được giải nén.)

Chỉnh sửa: các định nghĩa lược đồ mã và cơ sở dữ liệu đã có trong Git, đây thực sự là dữ liệu tôi quan tâm về việc sao lưu.


13
Nếu công ty của bạn có bộ phận CNTT (ops), họ sẽ xử lý việc này.
Michael Hampton

1
là một phần dữ liệu của ứng dụng, hoặc những gì được tạo ra thông qua ứng dụng?
Winston Ewert

1
Git sẽ cố gắng tìm khác biệt tất cả các tệp khi bạn chạy git gc(hoặc nó nằm dưới git repack; git sẽ, theo mặc định có thể định cấu hình, đôi khi chạy tự động). Nó cũng sẽ luôn xì hơi chúng , vì vậy có thể tốt hơn để lưu trữ chúng không bị nén.
Jan Hudec

1
Đó là loại cơ sở dữ liệu nào: đó là cơ sở dữ liệu sản xuất hay phát triển?
el.pescado

6
viget.com/extend/backup-your-database-in-git , anh ấy là một "nhà phát triển cao cấp".
wobbily_col

Câu trả lời:


101

Trước khi bạn mất bất kỳ dữ liệu nào, hãy để tôi thử giới thiệu một viễn cảnh sysadmin cho câu hỏi này.

Chỉ có một lý do để chúng tôi tạo bản sao lưu: để có thể khôi phục khi có sự cố, vì nó luôn luôn như vậy . Như vậy, một hệ thống sao lưu thích hợp có các yêu cầu vượt xa những gì git có thể xử lý một cách hợp lý.

Dưới đây là một số vấn đề tôi có thể thấy trước khi cố gắng sao lưu cơ sở dữ liệu của mình trong git:

  • Các kho lưu trữ sẽ phát triển đáng kể với mỗi "bản sao lưu". Vì git lưu trữ toàn bộ các đối tượng (mặc dù đã được nén) và sau đó làm khác chúng sau này (ví dụ như khi bạn chạy git gc) và lưu giữ lịch sử mãi mãi , bạn sẽ có một lượng dữ liệu rất lớn được lưu trữ mà bạn không thực sự cần hoặc thậm chí muốn. Bạn có thể cần phải giới hạn số lượng hoặc thời gian lưu của các bản sao lưu bạn làm để tiết kiệm dung lượng ổ đĩa hoặc vì lý do pháp lý, nhưng rất khó để xóa các bản sửa đổi cũ khỏi repo git mà không có nhiều thiệt hại về tài sản thế chấp.
  • Việc khôi phục bị giới hạn ở các điểm mà bạn đã lưu trữ trong kho lưu trữ và vì dữ liệu quá lớn, việc quay lại nhiều hơn một lượng thời gian không đáng kể có thể bị chậm. Một hệ thống dự phòng được thiết kế cho mục đích giới hạn lượng dữ liệu được lưu trữ trong khi có khả năng cung cấp mức độ chi tiết cao hơn và cung cấp khả năng khôi phục nhanh hơn, giảm thời gian chết trong trường hợp xảy ra thảm họa. Các giải pháp sao lưu nhận biết cơ sở dữ liệu ( ví dụ ) cũng có thể cung cấp sao lưu liên tục , đảm bảo rằng không có một giao dịch nào bị mất.
  • Các cam kết có khả năng cũng chậm và chậm hơn khi cơ sở dữ liệu phát triển. Hãy nhớ rằng git về cơ bản là một kho lưu trữ dữ liệu khóa-giá trị được ánh xạ vào một hệ thống tệp và do đó phải tuân theo các đặc tính hiệu suất của hệ thống tệp cơ bản. Khoảng thời gian này cuối cùng có thể vượt quá khoảng thời gian sao lưu và tại thời điểm đó, bạn không còn có thể đáp ứng SLA của mình nữa. Các hệ thống sao lưu phù hợp cũng mất nhiều thời gian hơn để sao lưu khi dữ liệu phát triển, nhưng gần như không đáng kể, vì chúng sẽ tự động quản lý kích thước của chúng dựa trên chính sách lưu giữ mà bạn sẽ định cấu hình.

Mặc dù thực tế rõ ràng có một số điều thú vị bạn có thể làm với kết xuất cơ sở dữ liệu nếu bạn đặt nó vào git, nhưng tổng thể tôi không thể đề xuất nó cho mục đích giữ bản sao lưu. Đặc biệt là vì các hệ thống sao lưu có sẵn rộng rãi (và nhiều thậm chí là nguồn mở) và hoạt động tốt hơn nhiều trong việc giữ an toàn cho dữ liệu của bạn và giúp có thể khôi phục nhanh nhất có thể.


Đây là câu trả lời tốt nhất vì Michael đã đề cập đến các vấn đề nhất quán. Tùy thuộc vào kích thước và cách sử dụng cơ sở dữ liệu, một ảnh chụp nhanh không thể tái tạo dữ liệu một cách đáng tin cậy tại thời điểm nhất định và bạn có thể gặp phải các vấn đề ràng buộc. Bản sao có thể là thứ bạn muốn xem xét - dev.mysql.com/doc/refman/5.0/en/replication.html
Aaron Newton

4
Đây không chỉ là câu trả lời tốt nhất, nó là câu trả lời duy nhất. Theo nguyên tắc chung, bạn là nhà phát triển nên sao lưu không phải là doanh nghiệp của bạn; ai đó khác (hoặc nên) đang chăm sóc họ, và nếu bạn bắt đầu tham gia, bạn có thể can thiệp vào một hệ thống đã hoạt động. Các hộp này đã được sao lưu, vì vậy sau đó bạn sẽ có một bản sao lưu, bản sao lưu của riêng bạn và bản sao lưu của bản sao lưu của riêng bạn, tất cả đều có kích thước ngày càng tăng. Đó chỉ là các loại hạt. Thêm vào đó: bạn là nhà phát triển: tại sao bạn (có thể) sẽ đến gần các hộp sản xuất?
Maximus Minimus

2
@JimmyShelter Có một trường phái cho rằng DevOps có nghĩa là không phải Dev và Ops phối hợp chặt chẽ với nhau, mà Dev thực sự làm Ops. Nó thường không hoạt động tốt, nhưng điều đó không ngăn cản mọi người thử nó.
Michael Hampton

Đây phải là câu trả lời được chấp nhận. Nó giải thích rõ ràng các yêu cầu và mục đích của một hệ thống dự phòng, sau đó cho thấy git không phù hợp như thế nào. Điểm thưởng thêm cho thảo luận về tính nhất quán và hiệu suất.
Gabriel Bauman

Hãy để tôi nhận xét rằng tôi đã đăng câu trả lời của mình với giả định rằng OP không có bất kỳ nhóm Hoạt động nào có thể xử lý vấn đề này cho anh ta. Tôi đồng ý với bạn rằng loại nhiệm vụ này là tốt nhất để lại cho những người thực sự vận hành hệ thống, và biết cách của họ xung quanh nó. Nhưng có những tình huống bạn phải đội một chiếc mũ không chính xác là của bạn và tôi tin rằng trong tình huống đó, tốt hơn là cố gắng học một số thực tiễn tốt nhất hơn là đưa ra giải pháp giả định của riêng bạn. Tôi phải nói rằng tôi cũng đã tìm thấy câu trả lời của bạn rất hướng dẫn!
đăng nhập

39

Hai xu của tôi: Tôi không nghĩ đó là một ý tưởng tốt. GIT thực hiện một số việc như "lưu trữ ảnh chụp nhanh của một tập hợp các tệp tại các thời điểm khác nhau", vì vậy bạn hoàn toàn có thể sử dụng GIT cho những thứ tương tự, nhưng điều đó không có nghĩa là bạn nên làm . GIT được thiết kế để lưu trữ mã nguồn, do đó bạn sẽ thiếu hầu hết các chức năng của nó và bạn sẽ giao dịch rất nhiều hiệu suất chỉ với một chút thuận tiện.

Hãy để tôi giả sử rằng lý do chính khiến bạn nghĩ về điều này là "giữ một bản sao dữ liệu và mã đồng bộ" và điều này có nghĩa là bạn lo lắng rằng phiên bản 2.0 của mã của bạn cần một lược đồ cơ sở dữ liệu khác với phiên bản 1.0 . Một giải pháp đơn giản hơn là lưu trữ lược đồ cơ sở dữ liệu, dưới dạng một tập lệnh SQL với các CREATEcâu lệnh, dọc theo mã nguồn trong kho Git của bạn. Sau đó, một phần của quy trình cài đặt của bạn sẽ là thực thi các tập lệnh đó trên máy chủ cơ sở dữ liệu đã cài đặt trước đó.

Nội dung thực tế của các CREATEbảng chỉ -d đó không liên quan gì đến phiên bản mã nguồn của bạn. Hãy tưởng tượng bạn cài đặt phần mềm, phiên bản 1.0, trên máy chủ A và trên máy chủ B, được sử dụng trong các công ty khác nhau bởi các nhóm khác nhau. Sau một vài tuần, nội dung của các bảng sẽ rất khác nhau, mặc dù các lược đồ hoàn toàn giống nhau.

Vì bạn muốn sao lưu nội dung của cơ sở dữ liệu, tôi sẽ đề nghị với bạn rằng bạn nên sử dụng tập lệnh sao lưu gắn thẻ kết xuất dự phòng với phiên bản hiện tại của phần mềm mà kết xuất đó thuộc về. Tập lệnh phải nằm trong kho GIT (để nó có quyền truy cập vào chuỗi phiên bản mã nguồn), nhưng bản thân các bản ghi không thuộc hệ thống kiểm soát phiên bản.

CHỈNH SỬA :

Sau khi đọc bài viết gốc thúc đẩy câu hỏi , tôi thấy đây là một ý tưởng thậm chí còn đáng ngờ hơn. Điểm mấu chốt là mysqldumplệnh biến đổi trạng thái hiện tại của DB thành một chuỗi các câu lệnh SQL INSERTvà GIT có thể khác chúng để chỉ nhận các hàng của bảng được cập nhật.

Phần mysqldumpnày là âm thanh, vì đây là một trong những phương thức sao lưu được liệt kê trong tài liệu của MySQL. Phần GIT là nơi tác giả không nhận thấy rằng các máy chủ cơ sở dữ liệu giữ nhật ký giao dịch để phục hồi sau sự cố, bao gồm cả MySQL . Nó đang sử dụng nhật ký này , không phải GIT, mà bạn nên tạo bản sao lưu gia tăng cho cơ sở dữ liệu của mình. Điều này trước tiên và quan trọng nhất, đó là lợi thế mà bạn có thể xoay hoặc xóa các bản ghi sau khi khôi phục, thay vì làm đầy kho lưu trữ GIT thành vô tận và hơn thế nữa ...


2
Tôi không chắc chắn tôi thấy bất kỳ điểm nào trong việc lưu trữ lược đồ cơ sở dữ liệu mà không có dữ liệu trong kiểm soát phiên bản. Dữ liệu là điều quan trọng nhất, và đó là những gì tôi muốn sao lưu. Tôi thích ý tưởng gắn thẻ sao lưu cơ sở dữ liệu với phiên bản phần mềm hiện tại. Tôi sẽ cố gắng thực hiện một cái gì đó như thế.
wobbily_col

10
Điểm lưu trữ lược đồ mà không có dữ liệu là, ngay sau khi cài đặt, phần mềm của bạn sẽ "sẵn sàng để được sử dụng". Nếu đó là wiki, thì nó nên sẵn sàng bắt đầu tạo các trang wiki và viết một cái gì đó vào chúng. Nếu bạn cài đặt lược đồ nội dung, thì wiki của bạn đã được lấp đầy bởi các trang wiki X sau khi cài đặt ... Đó không chính xác là "cài đặt hệ thống wiki để viết nội dung của chúng tôi", nhưng "sao chép wiki từ đâu đó để đọc" .
đăng nhập

3
Có thể là một ý tưởng tốt để sửa đổi câu hỏi của bạn với tình huống thực tế bạn đang gặp phải. Ngay cả khi bạn không thể đăng tất cả các chi tiết, điều quan trọng là phải nói rằng bạn cần rất nhiều dữ liệu để xuất hiện không được sửa đổi trong mỗi cài đặt, hoặc có một cài đặt duy nhất ...
logc

2
@wobbily_col Một định dạng dựa trên nhị phân, không có văn bản có giá trị giới hạn trong ngữ cảnh kiểm soát nguồn. Bạn không thể phân biệt nó, bạn không thể phân nhánh / hợp nhất nó, v.v. Vì vậy, trong khi bạn chắc chắn CÓ THỂ sử dụng git để lưu trữ DB, hầu hết mọi người thích kịch bản cấu trúc DB cũng như dữ liệu cần thiết. Đó là một sự thỏa hiệp giữa việc có thêm một chút công việc, nhưng cung cấp danh sách các tính năng trên. Bạn sẽ phải cân nhắc xem liệu đây có phải là một ý tưởng tốt cho giải pháp của bạn hay không. Mặt khác, bạn có thể có được GIT để lưu trữ DB trực tiếp, nó không chính xác là phù hợp nhất cho nhiệm vụ.
Daniel B

3
@RaduMurzea: Tôi nghĩ đây là một câu hỏi về nguyên tắc. Một hệ thống kiểm soát phiên bản được thiết kế để quản lý mã nguồn chứ không phải nhị phân. Đó không phải là một câu hỏi về kích thước. Không, không nên kiểm tra các bãi chứa cơ sở dữ liệu vào kho lưu trữ, giống như các video đào tạo không nên được kiểm tra. Nhưng không ai ngăn cản bạn làm như vậy. :)
đăng nhập

7

Cá nhân, tôi không nghĩ nên sử dụng hệ thống phiên bản kiểm soát nguồn để lưu trữ các tệp sao lưu, bởi vì kiểm soát phiên bản GIT được thiết kế cho các tệp dữ liệu, không phải cho các tệp nhị phân hoặc tệp kết xuất như tệp kết xuất sao lưu MySQL. Thực tế là bạn có thể làm điều đó không có nghĩa là tự động mà bạn nên làm điều đó. Hơn nữa, kho lưu trữ của bạn, xem xét sao lưu cơ sở dữ liệu mới cho mỗi lần xác nhận mới, sẽ tăng lên đáng kể, sử dụng nhiều dung lượng ổ cứng và hiệu suất của GIT sẽ bị ảnh hưởng, dẫn đến hệ thống kiểm soát nguồn chậm. Đối với tôi, thật tốt khi thực hiện chiến lược sao lưu và luôn sẵn sàng tệp sao lưu khi bạn cần khôi phục cơ sở dữ liệu khi có lỗi trong mã của bạn, nhưng các công cụ kiểm soát nguồn không được thực hiện để lưu trữ dữ liệu nhị phân.

Vì những lý do này, tôi không thấy bất kỳ tiện ích nào trong việc lưu trữ các tệp sao lưu cho ngày 1 và ngày 2, và sau đó thấy sự khác biệt giữa hai tệp sao lưu. Nó sẽ đòi hỏi rất nhiều công việc phụ và vô ích. Thay vì sử dụng GIT để lưu trữ các bản sao lưu cơ sở dữ liệu khi bạn cam kết mã mới, hãy lưu trữ các bản sao lưu cơ sở dữ liệu theo một đường dẫn khác, được phân tách theo ngày và thời gian và chèn vào mã của bạn một số tham chiếu đến các bản sao lưu cơ sở dữ liệu mới được tạo cho mỗi phiên bản, sử dụng các thẻ, như ai đó đã đề nghị.

Lưu ý cuối cùng của tôi về sao lưu cơ sở dữ liệu và GIT: Quản trị viên cơ sở dữ liệu, khi anh ta cần khôi phục cơ sở dữ liệu vì một số dữ liệu đã bị mất, không cần kiểm tra sự khác biệt giữa tệp sao lưu cho ngày 1 và tệp sao lưu cho ngày 2, anh ta chỉ cần biết đó là gì tập tin sao lưu cuối cùng sẽ cho phép anh ta khôi phục cơ sở dữ liệu, không có bất kỳ lỗi và mất dữ liệu, giảm thời gian chết. Thật vậy, nhiệm vụ của một quản trị viên cơ sở dữ liệu là làm cho dữ liệu có sẵn để phục hồi càng sớm càng tốt, khi hệ thống, vì một số lý do, không thành công. Nếu bạn lưu trữ các bản sao lưu cơ sở dữ liệu trong GIT, được liên kết với các cam kết của bạn, bạn không cho phép người quản trị cơ sở dữ liệu khôi phục dữ liệu một cách nhanh chóng, vì các bản sao lưu của bạn bị giới hạn tại các điểm mà bạn đã lưu trữ trong kho GIT và để giảm thời gian chết của hệ thống,

Sau đó, tôi không khuyên bạn nên lưu trữ các bản sao lưu bằng GIT, thay vào đó sử dụng một giải pháp phần mềm sao lưu tốt (có một số trong số chúng ở đây ), sẽ cung cấp mức độ chi tiết hơn và sẽ cho phép bạn giữ an toàn và bảo mật dữ liệu của mình và làm cho phục hồi dữ liệu đơn giản và nhanh chóng trong trường hợp thảm họa.


Có lẽ người downvoter sẽ giải thích lý do tại sao anh ta / cô ta hạ cấp ..
Alberto Solano

1
Không phải là downvoter, nhưng tôi nghĩ cách tiếp cận này đưa ra một xung đột hợp nhất hiện tại không đặc biệt có lợi cho quy trình làm việc thường xuyên, hợp nhất - thường được hầu hết người dùng git ưa thích.
Daniel B

@DanielB Tôi đề xuất không sử dụng hệ thống kiểm soát phiên bản để lưu trữ các tệp sao lưu cơ sở dữ liệu. Tôi nghĩ vấn đề sao lưu cơ sở dữ liệu có thể được giải quyết dễ dàng mà không cần sử dụng bất kỳ hệ thống kiểm soát phiên bản nào. Các hệ thống kiểm soát phiên bản (GIT, TFS, SVN, v.v.) được thiết kế cho phần mềm, không kết xuất tệp hoặc sao lưu cơ sở dữ liệu hoặc chỉ để lưu trữ dữ liệu (có rất nhiều giải pháp cho việc đó).
Alberto Solano

Tôi nghĩ rằng hầu hết người dùng đọc vài câu đầu tiên và downvote, vì có vẻ như bạn sẽ nói rằng nó ổn để sử dụng.

1
@AlbertoSolano tôi thấy; nhưng đọc câu hỏi ("tôi có thể sao lưu DB của mình trong GIT không?") và sau đó là câu lệnh đầu tiên của bạn ("không sao để lưu tệp sao lưu ..."), có vẻ như bạn đang nói ngược lại. Phần còn lại của câu trả lời dường như nói rằng nó không ở đây cũng không ở đó, trong khi tôi nghi ngờ hầu hết mọi người nghĩ rằng đó là một vụ đắm tàu ​​đang chờ xảy ra.
Daniel B

1

Bạn không nên lưu trữ dữ liệu nhị phân trong Git - đặc biệt là cơ sở dữ liệu.
Thay đổi mã và thay đổi DML cơ sở dữ liệu là những thứ hoàn toàn khác nhau.

MySQL và Oracle có thể viết nhật ký lưu trữ cho mục đích được khôi phục đến bất kỳ thời điểm nào. Chỉ cần sao lưu những bản ghi đó đến một nơi an toàn và bạn sẽ ổn thôi.

Để sử dụng Git để sao lưu các "nhật ký lưu trữ" này không có ý nghĩa. Nhật ký lưu trữ trong môi trường sản xuất khá nặng và nên được gỡ bỏ sau khi sao lưu toàn bộ thường xuyên. Ngoài ra, thật vô ích khi đặt chúng trong git - chúng đã là một kho lưu trữ theo một nghĩa nào đó.


1
Tại sao người ta không sử dụng Git để sao lưu các "nhật ký lưu trữ" được tạo bởi MySQL?
gnat

1
Chỉ vì nó không có ý nghĩa. Nhật ký lưu trữ trong môi trường sản xuất khá nặng và nên được gỡ bỏ sau khi sao lưu toàn bộ thường xuyên. Ngoài ra, thật vô ích khi đặt chúng trong git - chúng đã là một kho lưu trữ theo một nghĩa nào đó. Michael Hampton đưa ra một câu trả lời khá tốt về vấn đề này (trên trang này).
Jehy

1
Tại sao phải xoay vòng các bản ghi, nếu bạn sẽ giữ một bản sao của mọi thứ trong git? Cũng có thể chỉ giữ một tệp nhật ký quái vật.
wobbily_col
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.