Tại sao không thể sao lưu vi sai chỉ định cơ sở của nó?


18

Đây là bài viết DBA.SE đầu tiên của tôi, vì vậy xin vui lòng thông báo cho tôi về bất kỳ sai lầm, cảm ơn!

Tôi là một DBA mới (không phải là một chuyên gia CNTT, chỉ là không có ai khác trong công ty làm điều đó), vì vậy giải thích càng cơ bản thì càng tốt. Tôi đã đọc về các chiến lược sao lưu cơ sở dữ liệu (hoặc, như tôi đã học để gọi chúng là "chiến lược khôi phục"). Tôi hiểu các bản sao lưu Full, khác biệt và Nhật ký giao dịch làm gì, nhưng tôi muốn biết tại sao một bản sao lưu khác biệt chỉ có thể dựa trên bản sao lưu đầy đủ gần đây nhất.

Nếu một bản sao lưu vi sai là tất cả mọi thứ đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng, thì tại sao sự khác biệt đó không thể dựa trên bất kỳ bản sao lưu nào tôi chọn? Để rõ ràng hơn, tôi đang hỏi về việc chỉ định cơ sở khi sao lưu được thực hiện , không phải khi khôi phục. Tôi giả sử rằng khi khôi phục bạn sẽ chọn đúng cơ sở và vi sai tương ứng để thực hiện khôi phục (không sử dụng vi sai được tạo từ cơ sở B để khôi phục từ cơ sở A).

Lý do ngăn chức năng này là có thể là gì? Tôi nghĩ rằng phải có một lý do, tôi chỉ không biết nó là gì.

Lưu ý: Tôi hiểu rằng cơ sở không thể được chỉ định, nhưng câu hỏi của tôi là tại sao không ? (Tôi cũng không quan tâm đến cuộc thảo luận về "tại sao bạn?")

Sự giống nhau

Đây là một tương tự cho cách tôi hiểu một bản sao lưu khác biệt:

Tôi có một tệp Excel với một số dữ liệu trong các ô.

Vào ngày 1, tôi tạo một bản sao của tập tin này và lưu trữ nó ở một nơi khác ("bản sao lưu đầy đủ").

Vào ngày thứ 2, tôi xem tập tin và so sánh nó với bản sao lưu mà tôi đã tạo vào ngày 1 và tôi lưu ý tất cả các ô đã thay đổi và giá trị mới của chúng là gì (một "bản sao lưu vi sai"). Tôi không lưu ý mọi thay đổi được thực hiện cho một ô, chỉ có giá trị cuối cùng của nó là gì. Nếu ô A1 bắt đầu là "Alfred", đổi thành "Betty", "Charlie", sau đó là "Dave", tôi sẽ chỉ lưu ý rằng "A1 giờ là Dave".

Vào ngày thứ 3, tôi so sánh tệp hiện tại với tệp sao lưu một lần nữa và lưu ý các thay đổi (một "sao lưu vi sai" khác có cùng cơ sở với ngày 2). Một lần nữa, chỉ lưu ý các giá trị cuối cùng trên mỗi ô tại thời điểm được quan sát, không phải tất cả các giá trị mà ô đó có trong suốt cả ngày.

Vào ngày thứ 4, tôi so sánh lại và ghi chú thay đổi một lần nữa. Tiếp tục với ô A1, bây giờ nó có chữ "Sarah", ngay cả khi đó là 10 tên khác trong suốt cả ngày và tất cả những gì tôi lưu ý là "Bây giờ A1 là Sarah".

Vào ngày thứ 5, tập tin của tôi bị rối tung lên; Vì vậy, tôi nhìn vào bản sao lưu mà tôi đã tạo vào ngày 1, sau đó là các trạng thái cuối cùng được ghi chú vào ngày 4 và tôi áp dụng các thay đổi được ghi nhận cho bản sao lưu và bây giờ tôi đã khôi phục tệp vào ngày 4 Vì vậy, tôi nhìn vào bản sao lưu được thực hiện vào ngày 1, thấy rằng vào ngày 4 ô A1 kết thúc là "Sarah" và thay đổi ô dự phòng A1 thành "Sarah".

Tại sao nó lại quan trọng nếu tôi đã tạo một bản sao lưu khác ("đầy đủ") của tệp vào ngày 2? Tại sao vẫn không thể so sánh (đọc, "sao lưu vi sai") tệp vào ngày 3 hoặc 4 với bản sao được tạo vào ngày 1? Theo tôi hiểu, SQL Server sẽ yêu cầu tôi so sánh (khi thực hiện sao lưu vi sai khác) với bản sao lưu đầy đủ được thực hiện vào ngày 2 (nếu đã được thực hiện) - không có tùy chọn nào khác.

Câu trả lời:


14

Một bản sao lưu khác biệt sử dụng cái được gọi là bản đồ thay đổi khác biệt để xây dựng một danh sách các trang đã được sửa đổi kể từ lần sao lưu đầy đủ cuối cùng. Danh sách này là một danh sách "khác biệt", do đó tên của loại sao lưu và lý do sao lưu chỉ có thể được khôi phục trên đầu của bản sao lưu đầy đủ liên quan.

Thực hiện sao lưu toàn bộ đặt lại bản đồ thay đổi vi sai. Từ thời điểm đó trở đi, bất kỳ trang nào được sửa đổi đều được ghi lại trên bản đồ. Nếu sau đó bạn có một vi sai, bản sao lưu đó chỉ chứa các trang đã được sửa đổi kể từ lần sao lưu đầy đủ cuối cùng và được ghi lại trên bản đồ.

Trong sự tương tự của bạn, hai bản sao lưu đầy đủ, đóng vai trò là cơ sở cho toàn bộ quá trình khôi phục có thể có các nội dung khác nhau và do đó các bản đồ khác nhau. Nếu bạn khôi phục khác biệt dựa trên bản sao lưu đầu tiên so với bản sao lưu thứ 2, cơ sở dữ liệu có thể sẽ bị hỏng. Trong thực tế, SQL Server ngăn chặn việc khôi phục một bản sao lưu khác so với bất kỳ thứ gì ngoại trừ bản sao lưu đầy đủ ban đầu mà nó dựa trên.

Khi bạn yêu cầu SQL Server thực hiện sao lưu vi sai, "cơ sở" duy nhất cho vi sai là bản đồ thay đổi vi sai duy nhất có trong cơ sở dữ liệu tại thời điểm sao lưu vi sai bắt đầu. Đây là lý do tại sao bạn không thể chỉ định cơ sở cho sao lưu vi sai.


Đáp lại nhận xét từ @MartinSmith - bạn có thể sử dụng các COPY_ONLYbản sao lưu để khôi phục bản sao lưu vi sai qua một số bản sao lưu đầy đủ. Hãy xem xét kịch bản sau đây:

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

Sao lưu vi sai ở bước 5 phải có khả năng được khôi phục trên bất kỳ bản sao lưu nào được thực hiện trong các bước 1 đến 4, vì bản đồ thay đổi vi sai chỉ bị xóa khi xảy ra sao lưu toàn bộ trong bước 1. Các COPY_ONLYbản sao lưu trong các bước 2, 3 và 4, không đặt lại bản đồ thay đổi. Do bản đồ thay đổi khác biệt tích lũy các thay đổi được thực hiện kể từ khi sao lưu toàn bộ, mỗi COPY_ONLYbản sao lưu liên tiếp chứa đủ thông tin để bản sao lưu vi sai hoạt động với bất kỳ 4 bản sao lưu trước.

Mặc dù có vẻ như nó sẽ hoạt động, nhưng trên thực tế, việc khôi phục vi sai so với đầu sao lưu dự phòng sao chép kết quả trong lỗi sau:

Msg 3136, Cấp 16, Trạng thái 1, Dòng 1
Sao lưu vi sai này không thể được khôi phục do cơ sở dữ liệu chưa được khôi phục về trạng thái chính xác trước đó.
Msg 3013, Cấp 16, Bang 1, Dòng 1
RESTORE DATABASE đang chấm dứt bất thường.

Tôi đã tạo một repro nền tảng SQL Server 2012 để kiểm tra vi sai và copy_only khôi phục và lưu tệp trên gist.github.com - CẢNH BÁO tập lệnh sẽ bỏ bất kỳ cơ sở dữ liệu nào có tên RestoreTestlà bước đầu tiên.


Việc thực hiện sao lưu toàn bộ chỉ đặt lại bản đồ thay đổi vi sai nếu không COPY_ONLY- Nếu OP phải sao lưu toàn bộ thường xuyên vào ngày 1 và COPY_ONLYsao lưu toàn bộ vào ngày 2 thì sẽ có vấn đề gì xảy ra khi áp dụng vi sai sau từ cùng cơ sở đó đến ngày dự phòng 2?
Martin Smith

Tôi vừa thử nghiệm nó và trong thực tế, nó không cho phép khôi phục vi sai sau này vào copy_only mặc dù "Bản sao lưu vi sai này không thể được khôi phục do cơ sở dữ liệu chưa được khôi phục về trạng thái chính xác trước đó." - Tôi không chắc chắn nếu có một số lý do tại sao điều này sẽ không hoạt động hoặc chỉ là nó không được thực hiện.
Martin Smith

1
@MartinSmith - shooot. Tôi đã xác nhận điều đó quá bây giờ.
Max Vernon

5

Các tính năng bạn muốn có thể tồn tại trong nguyên tắc. Nó sẽ không hiệu quả với các cấu trúc cơ sở dữ liệu hiện tại (xem câu trả lời của Max Vernon). SQL Server sẽ phải duy trì một tập hợp các bản đồ khác hoặc so sánh các nội dung DB hiện tại với bản sao lưu đầy đủ mà bạn chỉ định làm cơ sở.

Có những ứng dụng sao chép các tập tin lớn. Bạn có thể tạo hai bản sao lưu đầy đủ và chỉ có dữ liệu thay đổi sẽ thực sự được lưu trữ. Điều này giống như một khác biệt với cơ sở tùy chỉnh. exdupeví dụ có thể làm điều đó

Điều tuyệt vời ở đây là nó hoạt động với mọi tập tin sao lưu. Trong thực tế bắt đầu với tệp sao lưu đầy đủ thứ 3, bạn sẽ chỉ trả tiền sử dụng không gian gia tăng (không phải vi sai). Việc sử dụng không gian là sự khác biệt với tệp sao lưu trước đó (không phải là lần đầu tiên). Lưu trữ trùng lặp có hành vi tương tự.

Tại sao tính năng mà bạn mô tả không tồn tại? Mỗi tính năng tiêu tốn ngân sách khiến các tính năng khác không có mặt. Điều này rõ ràng đã không làm cho nó đủ xa trong danh sách ưu tiên. Tôi không chắc nó sẽ tốt cho cái gì. Có vẻ như một yêu cầu khá bí truyền để sử dụng các cơ sở tùy chỉnh.


3

Đừng nhầm lẫn các bản sao lưu nhật ký giao dịch với các bản sao lưu khác biệt, chúng có các mục đích khác nhau! Những gì bạn đang gọi là "sao lưu vi sai", theo đó bạn "lưu ý tất cả các thay đổi đối với các ô", trên thực tế là nhật ký giao dịch .

Mục đích của sao lưu vi sai là giữ kích thước của tệp sao lưu kết quả nhỏ bằng cách chỉ ghi lại thông tin đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng và để giữ thời gian khôi phục trong mục tiêu thời gian phục hồi (RTO) của bạn.

Mục đích của bản sao lưu nhật ký giao dịch là cho phép bạn phát lại các giao dịch đến một thời điểm tùy ý - thường xuyên, nhưng chắc chắn không nhất thiết phải là " bất cứ điều gì gần đây nhất xảy ra".

Những gì bạn đang nói thực tế là có thể - nhưng bạn cần khôi phục lại bản sao lưu đầy đủ, sau đó khôi phục nhật ký giao dịch.

Nếu bạn có bản sao lưu đầy đủ ngày 1 và tất cả các bản sao lưu nhật ký giao dịch trong khoảng từ ngày 1 đến ngày 5, không có gì ngăn bạn khôi phục bản sao lưu ngày 1 và phát lại nhật ký giao dịch cho đến khi bạn có dữ liệu như ngày 4. Bạn cũng có thể bắt đầu từ bản sao lưu ngày 2, sẽ nhanh hơn một chút để khôi phục, vì bạn sẽ phát lại ít giao dịch hơn. Bạn cũng có thể khôi phục sao lưu đầy đủ ngày 1, sao lưu chênh lệch ngày 3 và sau đó khôi phục nhật ký giao dịch sang ngày 4.

Chỉnh sửa: OK, sự tương tự được chỉnh sửa của bạn có ý nghĩa hơn một chút. Câu trả lời là "bởi vì bạn đã có thể đạt được những gì bạn muốn với bản sao lưu nhật ký giao dịch". Một bản sao lưu khác biệt chỉ là một cách rẻ tiền và thuận tiện để ghi lại toàn bộ hoạt động nhật ký giao dịch. Nó không cung cấp bất kỳ mức độ phục hồi dữ liệu nào mà bản sao lưu nhật ký giao dịch không cung cấp. Chỉ có rất nhiều tính năng cung cấp "sự tiện lợi" làm cho nó trở thành một sản phẩm.


Tôi nghĩ rằng tôi có thể đã thực hiện tương tự kém, chờ để chỉnh sửa ... xin lỗi
elmer007

Chỉnh sửa cho sự tương tự mới của bạn.
dpw

1

Tương tự với Excel là so sánh táo và cam. Tại sao ? Excel không phải là cơ sở dữ liệu vì nó thiếu tính toàn vẹn dữ liệu. Excel là một ứng dụng bảng tính khá đẹp và có thể là phần bổ sung cho cơ sở dữ liệu.

SQL Server là một hệ thống cơ sở dữ liệu quan hệ cho phép bạn lưu trữ tất cả dữ liệu của bạn và cung cấp một cơ chế để truy vấn nó. Phần quan trọng là "Quan hệ" vì mối quan hệ dữ liệu rất quan trọng cùng với tính toàn vẹn dữ liệu (thuộc tính ACID).

Khái niệm cơ bản:

Dữ liệu trong cơ sở dữ liệu được tổ chức thành các thành phần logic (bảng, dạng xem, procs, trình kích hoạt, v.v.) mà người dùng có thể nhìn thấy. Tối thiểu, một cơ sở dữ liệu cũng được triển khai thực tế dưới dạng hai tệp (tệp dữ liệu & nhật ký) trở lên (tệp dữ liệu thứ cấp) trên đĩa.

  • Một cơ sở dữ liệu chứa trang là đơn vị cơ bản của lưu trữ dữ liệu được sử dụng để lưu trữ các bản ghi .
  • Một trang cơ sở dữ liệu là một đoạn dữ liệu 8192 byte (8KB) ​​của tệp dữ liệu cơ sở dữ liệu.
  • 8 trang tiếp giáp vật lý (8 * 8KB = 64KB) trong tệp cơ sở dữ liệu tạo thành một phạm vi .
  • Trang IAM (Bản đồ phân bổ chỉ mục) theo dõi dung lượng khoảng 4GB trong một tệp, được căn chỉnh trên ranh giới 4GB. Các khối 4GB này được gọi là khoảng GAM .

tại sao một bản sao lưu vi sai chỉ có thể dựa trên bản sao lưu đầy đủ gần đây nhất. - hoặc - Nếu một bản sao lưu vi sai là tất cả mọi thứ đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng, thì tại sao sự khác biệt không thể dựa trên bất kỳ bản sao lưu nào tôi chọn?

Dựa trên sự tương tự của bạn về excel, những gì bạn đang làm là áp dụng những gì đã thay đổi so với trước đây. Điều này đang áp dụng tất cả các giao dịch đã cam kết từ nhật ký giao dịch with STOP AT(lưu ý: Vào ngày thứ 5, tệp bị rối và bạn dừng lại ở ngày 4)

Trong mỗi phần 4GB (được gọi là khoảng GAM) của mỗi tệp dữ liệu, có một trang cơ sở dữ liệu đặc biệt gọi là bitmap vi sai theo dõi các phần (được gọi là phần mở rộng) của phần 4GB đó đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng, cho biết dữ liệu đã thay đổi hoặc đã được thêm vào cơ sở dữ liệu.

Một bản sao lưu vi sai quét qua các ảnh bitmap này và chỉ sao lưu các phạm vi tệp dữ liệu được đánh dấu là đã thay đổi. Ảnh bitmap được đặt lại bởi bản sao lưu đầy đủ tiếp theo (do đó, bản sao lưu vi sai chỉ có thể dựa trên bản sao lưu đầy đủ gần đây nhất) , vì vậy bạn có thể thấy rằng càng nhiều cơ sở dữ liệu thay đổi, phần lớn sẽ được đánh dấu trong ảnh bitmap khác biệt và sao lưu vi sai liên tiếp sẽ ngày càng lớn hơn.

Bạn thậm chí có thể sử dụng tập lệnh này để tìm hiểu Bao nhiêu cơ sở dữ liệu đã thay đổi kể từ lần sao lưu đầy đủ cuối cùng? .

Thông tin cơ sở khác biệt được lưu trữ trong mastercơ sở dữ liệu - sys.database_filehoặc ( sys.master_files- hữu ích khi cơ sở dữ liệu được đọc_only hoặc ngoại tuyến).

Có 3 cột quan trọng lưu trữ thông tin liên quan đến cơ sở vi sai .

  • Đây differential_base_lsnlà cơ sở để sao lưu vi sai. Các phạm vi dữ liệu được thay đổi sau differential_base_lsnsẽ được bao gồm trong bản sao lưu vi sai.
  • Đây differential_base_guidlà định danh duy nhất của bản sao lưu cơ sở dựa trên bản sao lưu vi sai.
  • Các differential_base_timelà thời gian mà tương ứng vớidifferential_base_lsn

Một bản sao lưu vi sai rất hữu ích để tăng tốc RTO (Mục tiêu thời gian phục hồi = Thời gian cần để khôi phục cơ sở dữ liệu của bạn), ngược lại với các bản sao lưu đầy đủ thường xuyên hơn sẽ là vấn đề đối với cơ sở dữ liệu lớn hoặc khôi phục khối lượng sao lưu nhật ký giao dịch khi chúng có thể tăng lên theo khung thời gian.

Lưu ý: Bản sao lưu đầy đủ COPY_ONLY không đặt lại cơ sở vi sai, do đó, bản sao lưu COPY_ONLY không thể dùng làm cơ sở vi sai.

Tài liệu tham khảo:



2
@PaulSRandal đã viết Trang tồn tại để lưu trữ hồ sơ. trên blog của anh ấy và vì vậy tôi đã tham khảo nó như là. Tham khảo logic những gì bạn đang nói (dựa trên tài liệu tham khảo) là đúng!
Kin Shah
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.