Có bất kỳ vấn đề nào với việc triển khai cơ sở dữ liệu SQL Server đến máy chủ sản xuất bằng cách sao lưu không?


7

Đây là một câu hỏi hơi tải trong đó tôi đã giả sử rằng kịch bản được mô tả là sai.

Một DBA đang triển khai một ứng dụng mà tôi đã viết bao gồm cơ sở dữ liệu MS SQL Server 2008. Anh ấy đã yêu cầu tôi lấy một bản sao lưu cơ sở dữ liệu từ máy phát triển của mình để anh ấy có thể khôi phục nó về máy chủ sản xuất, do đó triển khai nó. Đây là một triển khai trường xanh nên không có dữ liệu hiện có để được di chuyển. Tôi đã mong đợi để cung cấp một kịch bản DDL, mà tôi đã siêng năng kiểm tra và đảm bảo rằng nó chứa mọi thứ cần thiết. Nếu tôi thực thi nó trong SSMS, cơ sở dữ liệu được tạo bằng một cú nhấp chuột.

Đối với tôi, sử dụng phương tiện sao lưu để triển khai có vẻ không đúng, nhưng không phải là một chuyên gia về máy chủ SQL, tôi không thể nghĩ ra một lý do chắc chắn để không làm điều đó. Ví dụ, tôi đã nghĩ rằng sẽ có một số 'ô nhiễm' cơ sở dữ liệu từ máy phát triển - có lẽ là tên máy tính, cấu trúc thư mục hoặc tên người dùng được lưu trữ ở đó ở đâu đó. Đây có phải là trường hợp, hoặc là sao lưu và khôi phục một kỹ thuật triển khai hợp lệ?


Tại sao không đặt câu hỏi như "Có ổn không ..." thay vì nêu câu hỏi như thể có gì đó không ổn với nó?
Aaron Bertrand

... bởi vì tôi thích khám phá những nhược điểm chưa biết của cách tiếp cận hơn là tìm ra những lợi thế mà DBA đã biết
Stephen Hewlett

Nhưng câu hỏi của bạn vẫn được nêu ra như "Tôi biết điều này là xấu, nhưng hãy cho tôi biết tại sao!" Tại sao không hỏi "có bất kỳ nhược điểm nào chưa biết ...?" Nếu đó là câu hỏi bạn thực sự muốn hỏi?
Aaron Bertrand

1
Và bạn đang nói về việc triển khai một lần, ban đầu hay triển khai các thay đổi? Đối với tôi, đó là những câu hỏi rất khác nhau.
Aaron Bertrand

1
FYI về "siêu dữ liệu mà máy chủ SQL lưu trữ đằng sau hậu trường": vâng, có một số, nó được bảo tồn trong quá trình sao lưu / khôi phục và bạn thể gặp vấn đề. Đọc stackoverflow.com/q/2723061/105929 , dba.stackexchange.com/q/39500/708
Remus Rusanu

Câu trả lời:


10

Mọi thứ đều sai khi sử dụng các tập tin sao lưu khi triển khai. Nhưng gánh nặng không nằm ở DBA để cung cấp DDL, đang phát triển. Các tạo phẩm thiết kế và phát triển của bạn nên được cài đặt cơ sở dữ liệu và nâng cấp các tập lệnh. Không bao giờ thay đổi bất cứ điều gì trong cơ sở dữ liệu theo cách thủ công, mọi thứ nên được sửa đổi bằng ứng dụng của bạn. Rails có được điều này trong các cuộc đua với toàn bộ cơ sở hạ tầng di chuyển và bạn cũng nên cố gắng áp dụng nó. Tôi đã ủng hộ từ lâu bằng cách sử dụng các kỹ thuật tương tự, xem Kiểm soát phiên bản và Cơ sở dữ liệu của bạn .

Trước tiên, hãy để tôi đưa ra trường hợp tại sao triển khai / nâng cấp dựa trên mã nguồn lại vượt trội so với triển khai dựa trên nhị phân (.bak hoặc các công cụ tìm khác biệt):

  • mã nguồn có thể được kiểm tra trong kiểm soát nguồn. Điều này một mình nên giải quyết toàn bộ tranh luận. Kiểm soát nguồn cung cấp cho lịch sử yo, một tương lai bạn có thể nhìn lại và đọc kiểm tra trong ghi chú, hiểu lý do đằng sau trạng thái hiện tại.
  • mã nguồn có thể được kiểm tra nhanh chóng trong nháy mắt. Bạn nhìn vào nó và đọc nó. cơ sở dữ liệu nhị phân yêu cầu phải được đính kèm và yêu cầu kiến ​​thức sâu rộng về danh mục siêu dữ liệu để đọc ngay cả các thuộc tính cơ bản
  • mã nguồn sạch Bạn thấy CREATE TABLE Foo (...), trong đó rõ ràng truyền đạt ý định. Phân phối nhị phân, nếu bạn muốn trích xuất đối tượng, hiển thị cho bạn rất nhiều thuộc tính mặc định. Bạn mất ý định ban đầu.
  • mã nguồn có thể được xem xét ngang hàng khi kiểm tra.
  • mã nguồn tích hợp trong triển khai liền kề

Và tôi cũng có lý do tại sao triển khai bằng sao lưu là xấu (rất tệ):

  • bạn chỉ hoãn lại vấn đề Bản cập nhật đầu tiên của ứng dụng sẽ đối mặt với vấn đề triển khai bản cập nhật mà không mất dữ liệu. Điều này có thể xảy ra vào ngày hôm sau sau khi triển khai, khi một vấn đề được chú ý trong sản xuất và bạn sẽ phải đối mặt với khoảng trống: làm thế nào để sửa đổi DB sản xuất để phù hợp với dev DB?
  • Cơ sở dữ liệu không khép kín. Triển khai gọi các đối tượng bên ngoài DB (đăng nhập, công việc SQL Agent, kế hoạch bảo trì, v.v.) không ai trong số chúng có thể được triển khai với bản sao lưu.
  • Bạn không bao giờ biết những gì bạn đã triển khai. Bảng bị lãng quên trong dev? Kiểm tra dữ liệu? Rất khó để dọn dẹp cơ sở dữ liệu, nhưng giữ cho mã nguồn của bạn được cập nhật và chính xác là điều tự nhiên.

Tôi nghĩ rằng câu hỏi tập trung vào triển khai ban đầu, không phải triển khai định kỳ. Ít nhất đó là bối cảnh tôi đã sử dụng để trả lời.
Aaron Bertrand

@AaronBertrand Đôi khi trả lời một câu hỏi có nghĩa là chỉ ra câu trả lời cho các câu hỏi không có nội dung hoặc không suy nghĩ (từ?).
WernerCD

@WernerCD vâng, cảm ơn, tôi quen thuộc với khái niệm này. Tuy nhiên, câu trả lời của Remus đọc như một luận văn từng điểm về lý do tại sao bạn không nên sử dụng sao lưu / khôi phục để triển khai phát hành chấm và dường như bỏ qua trường hợp sử dụng thực tế (triển khai ban đầu).
Aaron Bertrand

5

Không, không có gì sai khi sử dụng bản sao lưu để triển khai ban đầu , thực tế tôi sẽ nói rằng đây thường là cách an toàn nhất để làm điều đó. Thực sự không có bất kỳ sự "ô nhiễm" nào có thể xảy ra trừ khi bạn có những thứ được mã hóa cứng như tên máy chủ hoặc tên cơ sở dữ liệu khác với sản xuất so với trong môi trường thử nghiệm.

Mặc dù sao lưu / khôi phục (giống như tập lệnh DDL của riêng bạn bị giới hạn trong cơ sở dữ liệu) sẽ không mang theo những thứ như thông tin đăng nhập cấp máy chủ, máy chủ được liên kết, công việc Tác nhân SQL, v.v.

Có một số lợi ích phụ khác mà bạn nhận được với bản sao lưu mà bạn không nhất thiết phải có với tập lệnh DDL, ví dụ: nếu bạn đã tạo bảng gốc như thế này:

CREATE TABLE dbo.foo
(
  bar INT PRIMARY KEY,
  mort INT FOREIGN KEY REFERENCES dbo.mort(MortID),
  x TINYINT CHECK (x IN (1,2)),
  y INT NOT NULL DEFAULT 1
);

Tất cả các ràng buộc này có tên do hệ thống tạo ra, như PK__foo__DE90ECFFA28BBAB8. Khi bạn chạy cùng một tập lệnh này trong sản xuất, tên sẽ khác, trừ khi bạn viết kịch bản định nghĩa bảng chính xác từ môi trường kiểm tra. Điều này có thể gây ra sự cố sau này nếu bạn tạo tập lệnh thả / tạo / thay đổi từ kiểm tra và cần chạy chúng trong sản xuất.

Bạn cũng sẽ nhận được tất cả dữ liệu trong các bảng tra cứu, v.v. khi bạn sao lưu, bạn sẽ phải tạo tập lệnh theo cách thủ công để đưa dữ liệu đó vào sản xuất. (Mặc dù bạn phải chắc chắn xóa mọi dữ liệu thử nghiệm mà bạn không muốn sản xuất.)

Và một điểm yếu của việc tự viết kịch bản này là bạn phải đảm bảo tất cả các đối tượng được tạo theo thứ tự phụ thuộc chính xác. Bạn có thể có các phụ thuộc tại chỗ trong thử nghiệm bị thiếu trong sản xuất vì các đối tượng không được tạo theo đúng thứ tự.

Khi nói đến nó, một bản sao lưu chỉ sạch hơn. Và bạn nên kiểm tra cơ sở dữ liệu khi nó được triển khai, vì vậy bạn sẽ tìm thấy bất kỳ "ô nhiễm" nào khá nhanh và sửa chúng trong cả hai môi trường.

Khi cơ sở dữ liệu ban đầu được triển khai, rõ ràng cách duy nhất để triển khai các thay đổi vào một ngày sau đó là kịch bản chúng. Tôi đã rất may mắn khi tạo các kịch bản so sánh / triển khai bằng cách sử dụng So sánh SQL của Red-Gate. Mặc dù Remus hoàn toàn đúng, nhưng kiểm soát nguồn đó là giải pháp tốt nhất cho vấn đề này, trong thực tế, kiểm soát nguồn thường sẽ lưu trữ một CREATE TABLEtập lệnh, điều này không giúp bạn tiến xa khi bạn đã thêm một cột và thay đổi loại dữ liệu của cột khác - bạn vẫn cần xây dựng một số loại kịch bản lệnh khác nhau sẽ chỉ áp dụng các thay đổi cho sản xuất, không bỏ và tạo lại bảng.

Nếu bạn có những thứ như bảng tra cứu cục bộ trong các cơ sở dữ liệu khác hoặc có thể ở các máy chủ khác nhau, thì thay vì mã hóa cứng các tên đó trong mã của bạn, bạn nên sử dụng từ đồng nghĩa. Sau đó, bạn chỉ phải đảm bảo các từ đồng nghĩa là chính xác trong từng môi trường, thay vì tìm tất cả ba / bốn tên phần trong tất cả các mô-đun của bạn và cập nhật chúng khi triển khai. Và nếu bạn có các đường dẫn tệp cục bộ khác nhau giữa các môi trường, hãy sử dụng bảng thuộc tính trung tâm thay vì mã hóa cứng các đường dẫn đó vào quy trình của bạn, v.v.

Về lý thuyết, bạn có thể sử dụng phương pháp sao lưu và khôi phục sau đó nhưng nó không hoạt động tốt nếu cơ sở dữ liệu sản xuất đã được sử dụng - thật khó để khôi phục cơ sở dữ liệu từ kiểm tra và không mất bất kỳ dữ liệu nào được thu thập trong sản xuất .


Tôi nghĩ rằng tốt hơn hết là tránh nhiễm bẩn hơn là đi cùng với nó và cố gắng tìm ra nó trong thử nghiệm, mặc dù khái niệm 'ô nhiễm' của tôi hiện khá trừu tượng và có thể không có căn cứ.
Stephen Hewlett

@StephenHewlett tốt, chúng tôi không thể dự đoán những gì chúng tôi không biết về môi trường của bạn. Cách tốt nhất để tránh ô nhiễm là không viết những thứ mà mã máy chủ cục bộ và tên cơ sở dữ liệu, đường dẫn tệp, v.v. có thể khác nếu cơ sở dữ liệu được chuyển sang máy chủ khác. Nếu bạn xây dựng một tập lệnh, bạn có thể bỏ lỡ những tập lệnh tương tự mà bạn bỏ lỡ bằng cách sao lưu cơ sở dữ liệu.
Aaron Bertrand

Tôi đã tạo cơ sở dữ liệu từ tập lệnh chứ không phải theo cách khác, vì vậy tôi biết không có gì khó mã hóa trong dữ liệu 'của tôi'. Đó là nhiều siêu dữ liệu mà máy chủ SQL lưu trữ đằng sau hậu trường - hoặc thiếu tiềm năng - mà tôi đang nghĩ đến.
Stephen Hewlett

2

Tôi nói đừng làm điều đó. Sử dụng tập lệnh SQL được tạo từ các câu lệnh chuẩn nhất có thể như bạn có thể thực hiện, lưu ý đến phiên bản máy chủ SQL mà phiên bản của tập lệnh đã làm việc.

Tôi đã gặp sự cố với phần mềm được phân phối qua bản sao lưu khi tôi cần cài đặt lại phần mềm vào một ngày sau đó.

Do tuổi của hình ảnh sao lưu gốc được sử dụng để triển khai và không có hình ảnh mới hơn, tôi đã phải sử dụng phiên bản máy chủ SQL cũ, vì các phiên bản SQL Server mới hơn không hỗ trợ sao lưu định dạng cũ. Sau đó, trong quá trình áp dụng gần như tất cả các bản cập nhật ứng dụng theo trình tự, tôi đã phải áp dụng nâng cấp máy chủ SQL so với phiên bản máy chủ SQL cũ do bản cập nhật ứng dụng yêu cầu phiên bản máy chủ SQL mới hơn phiên bản cũ yêu cầu Hình ảnh "triển khai dự phòng".

Là một DBA, tôi thấy điều này RẤT Bực bội để tìm ra và sau đó thực sự thực hiện các bước cần thiết. Như một phần thưởng bổ sung, tôi đã làm điều này trong tình huống khắc phục thảm họa để tôi có thể khôi phục cơ sở dữ liệu sản xuất hiện tại từ bản sao lưu, vì nó yêu cầu phiên bản mới nhất của phần mềm sẽ không cài đặt mà không cài đặt "bản sao lưu triển khai" ban đầu.


2

Tôi nghĩ rằng câu trả lời cho điều này trong cả có và không. Bạn đã nói:

Đây là một triển khai trường xanh nên không có dữ liệu hiện có để được di chuyển.

Nếu đây là một triển khai ban đầu thì tôi thấy không có vấn đề gì với việc sao lưu cơ sở dữ liệu phát triển để sử dụng trong sản xuất. Nói rằng, bạn (hoặc hy vọng DBA của bạn) rõ ràng sẽ phải xóa cơ sở dữ liệu và xóa bất kỳ người dùng bảo mật và các gubbins khác có thể đã được khôi phục với bản sao lưu cơ sở dữ liệu.

Tuy nhiên:

Là một giải pháp lâu dài, không, đây không phải là một kỹ thuật triển khai tốt vì một khi khách hàng đã bắt đầu sử dụng cơ sở dữ liệu, họ sẽ có dữ liệu của họ trong đó để bạn không thể khôi phục cơ sở dữ liệu của mình qua cơ sở dữ liệu của họ.

Vì vậy, quay trở lại triển khai ban đầu, sẽ tốt hơn khi khôi phục bản sao lưu của cơ sở dữ liệu trống, nhưng đây là điểm mà bạn sẽ bắt đầu sử dụng kiểm soát phiên bản để quản lý các bản cập nhật và triển khai trong tương lai, do đó duy trì phiên bản cơ sở dữ liệu có thể triển khai sạch.

Các bước:

  1. Tạo cơ sở dữ liệu sạch của bạn (được khôi phục từ bản sao lưu nếu cần)
  2. Phiên bản kiểm soát nó tại thời điểm này
  3. Script bất kỳ cập nhật nào cho cơ sở dữ liệu và phiên bản kiểm soát chúng
  4. Khi một phiên bản / bản phát hành mới đã sẵn sàng để triển khai, hãy thực thi bất kỳ tập lệnh mới nào dựa trên cơ sở dữ liệu sạch để chuyển từ phiên bản X sang phiên bản Y và sau đó cập nhật phiên bản bạn có trong kiểm soát nguồn.
  5. Cuối cùng, bạn sẽ thực thi các tập lệnh đối với cơ sở dữ liệu máy khách để cập nhật nó.

Bất kỳ cập nhật nào bạn thực hiện cho cơ sở dữ liệu sẽ được kiểm tra cục bộ trước khi triển khai và cập nhật cơ sở dữ liệu khách hàng chỉ đơn giản là trường hợp chạy các tập lệnh đưa chúng từ phiên bản này sang phiên bản khác. Kiểm soát nguồn sẽ cung cấp cho bạn lịch sử giữa các phiên bản cơ sở dữ liệu sạch cùng với các tập lệnh được áp dụng.


đừng quên rằng đôi khi họ sẽ cần phải cài đặt lại từ đầu (phần mềm thông minh) và khôi phục dữ liệu của chính họ từ bản sao lưu, và họ sẽ phải trải qua trình tự nào.
BeowulfNode42

cài đặt lại DBMS hoặc ứng dụng nằm trên nó?
Tanner

cả 3 DMBS, ứng dụng và dữ liệu của riêng họ, như tôi đang nói về một tình huống khắc phục thảm họa hoàn toàn, nơi họ không có hình ảnh hệ thống đầy đủ.
BeowulfNode42

Tôi không nghĩ rằng việc xây dựng lại một máy chủ cài đặt phần mềm của nó trong tình huống khắc phục thảm họa có liên quan đến câu hỏi này không? Liên quan đến việc triển khai cơ sở dữ liệu, trong tình huống khắc phục thảm họa, dba chỉ cần khôi phục bản sao lưu từ tối hôm trước để có được cơ sở dữ liệu mới nhất trực tuyến, giả sử rằng nó được thực hiện hàng đêm.
Tanner

Điều đó sẽ ổn nếu bản thân máy chủ sống sót sau thảm họa. Tuy nhiên, một số thảm họa yêu cầu máy chủ phải được xây dựng lại hoàn toàn với phần cứng mới và cài đặt mới mọi thứ bao gồm DBMS và ứng dụng, và chỉ sau đó, sao lưu cơ sở dữ liệu mới có thể được khôi phục. Đây là bản cài đặt hoặc triển khai mới của một hệ thống đã sẵn sàng để nhận bản sao lưu cơ sở dữ liệu hiện tại mà tôi đang nói đến. Điều này có thể sẽ xảy ra trong nhiều năm và nhiều phiên bản chính sau khi triển khai ban đầu.
BeowulfNode42
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.