Vấn đề sao lưu khác biệt - Tại sao? Đây có phải là có thể?


13

Tôi đang sử dụng SQL Server 2014 và đây là tình huống:

  • Tôi có máy chủ A và máy chủ B.
  • ETL qua đêm được xử lý trên máy chủ A.
  • Sau khi quá trình tải hoàn tất, cơ sở dữ liệu X sẽ được sao lưu (với CHECKSUMRESTORE VERIFYONLYđể đảm bảo độ tin cậy) và sau đó được gửi đến máy chủ B.
  • Máy chủ B nhận baktệp và sau đó khôi phục cơ sở dữ liệu ở đó.

Tôi muốn sử dụng chiến lược sao lưu khác biệt để:

  1. Sao lưu toàn bộ chỉ được thực hiện vào Thứ Bảy,
    tức là Sao lưu toàn bộ trên máy chủ A vào Thứ Bảy -> gửi đến máy chủ B -> Khôi phục sao lưu toàn bộ trên máy chủ B

  2. Những ngày còn lại sẽ là sao lưu vi sai
    tức là Sao lưu vi sai trên máy chủ A -> gửi đến máy chủ B -> Khôi phục sao lưu vi sai trên máy chủ B

Tôi đã thử nhưng tôi gặp lỗi, nói:

bản sao lưu nhật ký hoặc vi sai không thể được khôi phục vì không có tệp nào sẵn sàng để tiến hành.

Không chắc chắn lý do tại sao. Tôi đã kiểm tra sys.database_filestrên máy chủ A và máy chủ B, và tôi có thể thấy rằng differential_Base_LSNdifferential_base_GUIDgiống nhau. Bất cứ nơi nào / bất cứ điều gì khác để kiểm tra?

Nhân tiện, ở bước 2 ở trên, khi tôi khôi phục lại bản sao lưu diff trên máy chủ B, tôi có luôn cần khôi phục cả bản sao lưu đầy đủ + bản sao lưu vi sai mỗi lần không?

Tôi chỉ khôi phục bản sao lưu vi sai WITH RECOVERY(và nhận được thông báo lỗi đó) vì bản sao lưu đầy đủ đã được khôi phục vào ngày hôm trước.

Để làm rõ: Có, tôi muốn db trên máy chủ B có thể đọc được giữa các vi sai. Làm thế nào tôi có thể nhận được xung quanh đó? Là lựa chọn duy nhất của tôi để RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)chuỗi kết hợp mỗi đêm?

Bất kỳ hướng dẫn sẽ được nhiều đánh giá cao.

Câu trả lời:


15

Bạn không cần phải lộn xộn RECOVERYNORECOVERYở đây, tất cả những gì bạn cần là STANDBYtùy chọn. Đây là một bản demo nhanh về cách sử dụng nó.

Tạo một cơ sở dữ liệu, thiết lập nó để phục hồi đơn giản và tạo một bảng.

Chèn dữ liệu, lấy một số khác biệt.

Vui chứ nhỉ?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

Vâng, tôi đã nói dối. Đó là phần nhàm chán.

Bạn có thể khôi phục lại bản sao lưu đầy đủ của mình trong STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Bạn có thể khôi phục Diffs theo thứ tự với STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Và không giống như các tệp Nhật ký phiền phức đó, bạn cũng có thể bỏ qua khi khôi phục Diffs:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Nếu bạn muốn kiểm tra khả năng đọc, chỉ cần chạy cái này ở giữa các lệnh khôi phục. Bạn sẽ thấy ID tăng dần với mỗi. Nếu bạn không, bạn đã làm một cái gì đó sai lầm khủng khiếp.

Hãy nhớ rằng khi bạn khôi phục tệp, nó sẽ loại bỏ bất kỳ người dùng cuối nào ra khỏi cơ sở dữ liệu và sẽ không chờ truy vấn của họ kết thúc.

Điều này cũng khiến cơ sở dữ liệu ở trạng thái chỉ đọc, không có thay đổi nào có thể được thực hiện ở đây.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Và cuối cùng, dọn dẹp sau khi chính mình.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

Hi vọng điêu nay co ich!!

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.