Tự động hóa các bản sao lưu của số lượng lớn cơ sở dữ liệu


7

Trong một ứng dụng web nhiều người thuê nơi cơ sở dữ liệu được thiết lập cho mỗi người thuê, cơ sở dữ liệu có thể được sao lưu và khôi phục thủ công thông qua một cách tiếp cận khá thông thường.

Tôi đang xem xét loại kiến ​​trúc này cho một ứng dụng có thể có 5.000-10.000 người thuê và việc chạy loại quy trình này cho nhiều cơ sở dữ liệu của người thuê này sẽ rất cồng kềnh.

Nếu tôi thực hiện quy trình như vậy cho một số lượng lớn cơ sở dữ liệu khách thuê:

  • Có khả năng có một chi phí hiệu năng quá mức cho một số lượng lớn các bản sao lưu riêng biệt như vậy không?

  • Làm thế nào một số lượng lớn các quá trình sao lưu sẽ được tự động?

  • Làm thế nào người ta có thể theo dõi một số lượng lớn các bản sao lưu như vậy và đảm bảo rằng các hoạt động khôi phục có bản sao lưu và cơ sở dữ liệu chính xác để khôi phục lại?

  • Làm thế nào người ta có thể thực hiện các điều khiển để theo dõi trạng thái sao lưu và tính toàn vẹn của một số lượng lớn cơ sở dữ liệu như vậy?

Câu trả lời:


6

Nếu các bản sao lưu trên các cơ sở dữ liệu 5-10K đó được chạy một cách an toàn, thì không nên có sự khác biệt về hiệu suất vật liệu so với khi bạn đang chạy bản sao lưu trên một cơ sở dữ liệu khổng lồ. Bạn có thể nhận được bằng cách chạy một vài bản sao lưu cùng lúc, nếu cơ sở dữ liệu của bạn không lớn và bạn có khả năng I / O tốt, nhưng tôi sẽ không tin vào điều đó.

Bạn sẽ muốn tránh xa các công việc loại "kế hoạch bảo trì" vì bạn cần kiểm soát nhiều hơn những gì xảy ra và những công việc đó sẽ không tạo ra loại nhật ký bạn muốn. Thêm vào đó, các kế hoạch có những cách thất bại nặng nề hơn mà không phải lúc nào cũng được chú ý, đặc biệt là trên các phiên bản SQL Server cũ hơn. Viết một thủ tục để sao lưu tất cả các cơ sở dữ liệu trên một máy chủ là khá dễ dàng. Quy trình đó sẽ giữ một bảng nhật ký mô tả cơ sở dữ liệu nào được sao lưu, khi nào nó được sao lưu và tệp nào được chuyển đến. Tên tệp có thể có một số loại dấu thời gian trong đó, để dễ dàng tìm thấy các tệp chính xác. Tôi đảm bảo rằng có một cách để "phân chia" tất cả các tệp sao lưu đó vào các thư mục và hệ thống tệp khác nhau; không chỉ đổ chúng vào một thư mục. Bạn sẽ cần một cách tự động để lưu trữ hoặc xóa các bản sao lưu 'cũ'. Sẽ tốt hơn nếu điều đó cũng đi vào bảng nhật ký đó và gắn cờ bất kỳ tệp sao lưu cụ thể nào là 'có sẵn', 'được lưu trữ', 'đã xóa', v.v. như bạn sẵn sàng giữ

Tự động khôi phục là thủ thuật. Một phần vì bạn có thể nhanh chóng xóa sạch cơ sở dữ liệu sai, một phần vì bạn cần một cách để loại bỏ người dùng cơ sở dữ liệu để bắt đầu khôi phục.

Sao lưu có thể được đọc thông qua RESTORE HeaderONLY và RESTORE FILELISTONLY để xác thực rằng sắp khôi phục lại những gì bạn nghĩ rằng bạn đang có. Tôi sẽ cố gắng xây dựng thông tin đó thành tên của tệp vì việc xem tên tệp dễ dàng hơn nhiều so với fiddle với các lệnh RESTORE. Bạn có thể viết một vài lệnh CLR nhanh để thực hiện danh sách thư mục và như vậy, tôi không phải là thiên tài C # vì vậy tôi đã tìm thấy một vài ví dụ trên web khi tôi phải làm điều đó. Chỉ cần chọn một định dạng tốt cho một tên tệp và sau đó gắn bó với nó. Một cái gì đó như SERVERNAME-INSTANCENAME-DATABASENAME-FULL-2012.04.18-09.24.00.bak. Bằng cách đó, thật dễ dàng để xem bản sao lưu đến từ đâu và khi nào nó được thực hiện. Đảm bảo rằng sơ đồ khôi phục của bạn có thể xử lý khôi phục cơ sở dữ liệu cho một máy chủ khác và / hoặc dưới một tên cơ sở dữ liệu khác. Một vấn đề phổ biến khi khôi phục vào cùng một máy chủ dưới một tên cơ sở dữ liệu khác là xung đột với tên tệp; bạn cần sử dụng tập tin mới

Tất cả điều đó giả định rằng các cơ sở dữ liệu đang chạy trong chế độ khôi phục SIMPLE. Nếu cơ sở dữ liệu không chạy ở chế độ SIMPLE, vấn đề của bạn sẽ tăng lên gấp bội. Bạn sẽ cần nhiều không gian hơn để giữ các bản sao lưu vì bạn sẽ cần các bản sao lưu tlog cũng như các bản sao lưu đầy đủ. Chạy sao lưu nhật ký giao dịch có thể là vấn đề thực sự bởi vì một công việc duy nhất sao lưu tất cả chúng có thể không chạy trong một cửa sổ chấp nhận được. . để sao lưu một hoặc nhiều cơ sở dữ liệu, tùy thuộc vào sự cố. Sẽ rất hữu ích khi chọn cơ sở dữ liệu và khôi phục chúng vào một phiên bản khác, để đảm bảo rằng mọi thứ đều hoạt động. Các DBA không tốt như các bản sao lưu cuối cùng của họ,

Mã khôi phục sẽ phức tạp hơn, đặc biệt nếu bạn có ý tưởng rằng người thuê có thể tự phục hồi.

Ngoài ra, ngoài việc sao lưu các cơ sở dữ liệu đó, bạn sẽ muốn tạo các quy trình tương tự để chạy DBCC CHECKDB và thực hiện lập chỉ mục lại. Tôi sẽ xem xét một số mã hiện có trên các blog DBA. Bạn thậm chí có thể tìm thấy một cái gì đó mà bạn có thể làm lại trong một thủ tục sao lưu.

Cuối cùng, kiểm tra mọi thứ như doanh nghiệp của bạn phụ thuộc vào nó. Ause Nguyên nhân, nó có thể. Đảm bảo rằng bạn kiểm tra các tình huống trong đó sao lưu không thành công (hết dung lượng cho tệp sao lưu, có thể?) Hoặc có cơ sở dữ liệu ngoại tuyến hoặc được đặt thành quyền truy cập hạn chế hoặc bị hỏng theo cách nào đó. Khi bạn chạy thử nghiệm, hãy theo dõi hiệu suất của hệ thống, tốt nhất là khi nó đã tải một số hệ thống.


6

Ở công việc trước đây tôi đã làm chính xác điều này. Chúng tôi đã ở trong phạm vi 500 người thuê nhà, nhưng một khi bạn đạt được trên 10 hoặc 20, phần tự động hóa làm cho con số thực tế ít quan trọng hơn nhiều.

Giả sử rằng phần cứng của bạn có thể xử lý sao lưu 10.000 cơ sở dữ liệu trong một thời gian đủ và tất cả 10.000 không có hoạt động đủ quan trọng để áp đảo máy chủ của bạn có hoặc không có bản sao lưu, bước tiếp theo là tự động hóa quy trình nói chung. Điều thú vị ở mô hình này là nếu 10.000 cơ sở dữ liệu kết thúc áp đảo máy chủ của bạn, việc chuyển một nửa trong số chúng sang máy chủ thứ hai sẽ dễ dàng hơn và hướng ứng dụng của bạn vào đúng ví dụ tùy thuộc vào người thuê, hơn là thử và trích xuất một nửa dữ liệu trong một cơ sở dữ liệu. Bạn có một số trong FULL và một số trong SIMPLE, hoặc tất cả chúng đều trong cùng một mô hình khôi phục?

Chúng tôi đã có những ưu tiên. Vì vậy, một bảng để chứa thông tin người thuê (trong triển khai của tôi có nhiều cột hơn, nhưng đây phải là những điều cơ bản):

CREATE TABLE dbo.TenantBackups
(
  TenantID      INT PRIMARY KEY,
  RecoveryModel VARCHAR(6),
  Priority      TINYINT
);

Và sau đó là một bảng lịch sử (một lần nữa, nhiều hơn trong bảng hệ thống thực tế, nhưng cho mục đích của câu hỏi):

CREATE TABLE dbo.TenantBackupHistory
(
  TenantID   INT,          -- FOREIGN KEY,
  BackupType TINYINT,      -- lookup for FULL, LOG, RESTORE_TEST
  StartTime  DATETIME,
  EndTime    DATETIME,
  Status     NVARCHAR(1000) -- almost always NULL but held true "exceptions"
);

Vì vậy, bây giờ (các) công việc có thể chạy qua người thuê, được sắp xếp theo thứ tự ưu tiên và thực hiện sao lưu. Chúng tôi thực sự đã có các công việc riêng cho ưu tiên 1 so với ưu tiên 2-5.

Chúng tôi đã kiểm tra mức độ ưu tiên 1 người thuê hàng đêm bằng cách khôi phục lại toàn bộ bản sao lưu của họ trên máy chủ sao lưu. Chúng tôi cũng chọn 20 cơ sở dữ liệu ngẫu nhiên từ các ưu tiên khác mỗi đêm để kiểm tra khôi phục của họ. Tất nhiên, có các cảnh báo được định cấu hình để các lỗi được biết ngay lập tức và nếu ngoại lệ nằm ngoài phạm vi thử lại / lỗi thông thường của chúng tôi, cột Trạng thái sẽ chứa thông tin.

Chúng tôi cũng đã sử dụng SQL Sentry để xâu chuỗi các công việc để chúng tôi không phải lo lắng về việc lên lịch cho bộ đệm và cố gắng dự đoán khi nào các công việc sao lưu sẽ kết thúc. Đối với cơ sở dữ liệu ưu tiên 1, chúng tôi không bận tâm chờ đợi các bản sao lưu hoàn tất; chúng tôi đã có một luồng nền sẽ đợi cho mỗi bản sao lưu đầy đủ riêng lẻ hoàn thành và sau đó sẽ ngay lập tức lấy nó ra khỏi hàng đợi và bắt đầu quá trình kiểm tra sao chép / khôi phục. Đối với những người thuê nhà ưu tiên 1, chúng tôi cũng đã sử dụng bản sao được khôi phục làm giảm tải báo cáo - đối với bất kỳ báo cáo nào quan tâm đến dữ liệu trước ngày hôm nay (hầu hết các báo cáo), họ có thể chạy khỏi bản sao, vì điều duy nhất nó bị thiếu là ngày hôm nay.

Đối với người thuê phục hồi hoàn toàn (không phải tất cả khách hàng yêu cầu tại thời điểm), các công việc sao lưu nhật ký có thể dễ dàng kiểm tra bảng lịch sử để xem liệu có bản sao lưu nào đang được tiến hành hay không. Nhưng tất nhiên xử lý lỗi và logic thử lại đã được thực hiện xung quanh.

Tôi biết đây là những mô tả rất chung chung nhưng tôi hy vọng họ chỉ cho bạn đi đúng hướng. Hãy cho tôi biết nếu bạn muốn tôi mở rộng bất kỳ chi tiết nào.

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.