SQL Server 2008 R2 Khôi phục sao lưu đầy đủ COPY_ONLY với nhật ký giao dịch


11

Sau khi thực hiện một số nghiên cứu tôi dường như không thể tìm thấy câu trả lời cho câu hỏi này.

Bối cảnh Tôi đang cố gắng thiết lập một kế hoạch dự phòng phù hợp với ba yêu cầu sau:

  1. Độ tin cậy của các bản sao lưu, có các bản sao lưu đầy đủ hàng đêm
  2. Sao lưu nhật ký giao dịch có thể được khôi phục từ
  3. Dung lượng đĩa sử dụng thấp
  4. Các bản sao lưu phải có thể truy cập cục bộ cho một công cụ kiểm toán

Vì vậy, để phù hợp với những nhu cầu đó, tôi nghĩ rằng sao lưu toàn bộ hàng tuần, khác biệt hàng ngày và giao dịch hàng giờ. Sau đó, mỗi đêm, một bản sao lưu copy_only sẽ chạy có thể được vận chuyển ngoài cơ sở, bản sao lưu này được thực hiện để chuỗi nhật ký không bị phá vỡ và chúng tôi có các bản sao lưu đầy đủ đáng tin cậy hàng đêm bên ngoài, mà không phải ăn quá nhiều không gian đĩa cục bộ.

Câu hỏi Có thể khôi phục từ bản sao lưu copy_only và khôi phục nhật ký giao dịch sau.

Hãy để tôi chỉ đưa ra một ví dụ để bạn biết những gì tôi đang nói về.

Sử dụng danh sách dưới đây, tôi tự hỏi liệu có thể khôi phục FullbackupCOPY_ONLYC.bak theo sau là TransactionbackupG.trn, TransactionbackupH.trn, cuối cùng là TransactionbackupI.trn

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

Có lẽ toàn bộ thiết lập này không hợp lý Tôi khá mới đối với SQL Server và đang cố gắng học khi tôi đi. Bất kỳ lời khuyên / giúp đỡ sẽ được đánh giá cao.

Câu trả lời:


14

Một bản sao lưu đầy đủ trong SQL Server 2008 không phá vỡ chuỗi nhật ký. Nó chỉ đặt lại cơ sở vi sai-lsn.

Bạn cũng có thể khôi phục bản sao lưu nhật ký sau khi chỉ khôi phục từ một bản sao. Các đoạn mã sau đây trình diễn:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

Nó tạo ra một cơ sở dữ liệu và một bảng và chèn 50 hàng vào bảng đó. Ở giữa những lần chèn đó, một số bản sao lưu được thực hiện theo thứ tự này:

  1. Đầy
  2. Đăng nhập
  3. Đầy
  4. Sao chép đầy đủ
  5. Đăng nhập

Tiếp theo cơ sở dữ liệu được loại bỏ và khôi phục như thế này:

  1. 1 đầy đủ
  2. Nhật ký 1
  3. Nhật ký 2

Sau đây SELECTchứng tỏ rằng việc khôi phục đã thành công.

Điều này cho thấy rằng cả COP_ONLYSao lưu bình thường cũng không phá vỡ chuỗi nhật ký.

Sau đó, cơ sở dữ liệu được loại bỏ một lần nữa và khôi phục như thế này:

  1. Copy_Only Full
  2. Nhật ký 2

Sau đó, SELECTchứng minh thành công một lần nữa.

Điều này chứng tỏ rằng bạn có thể sử dụng COPY_ONLYbản sao lưu đầy đủ làm cơ sở của Khôi phục nhật ký.

Kiểm tra khác biệt

Tôi cũng đã tạo một DIFFERENTIALphiên bản:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

Điều này có bản sao lưu theo thứ tự này:

  1. 1 đầy đủ
  2. Chênh lệch thứ 1
  3. Đầy đủ thứ 2
  4. Chênh lệch thứ 2
  5. Copy_Only Diff
  6. Chênh lệch thứ 3

Sau đó, nó sẽ thử tuyến đường khôi phục này:

  1. 1 đầy đủ
  2. Chênh lệch thứ 1
  3. Chênh lệch thứ 2

Bước 3 không thành công với lỗi này:

Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.

Điều này cho thấy một bản sao lưu đầy đủ bình thường phá vỡ chuỗi vi sai.

Tiếp theo cơ sở dữ liệu bị hủy và luồng khôi phục này được thử:

  1. Copy_Only Full
  2. Chênh lệch thứ 3

Bước 2 không thành công với lỗi tương tự như bước 3 ở trên. Điều này cho thấy rằng một bản sao lưu chỉ sao chép không thể được sử dụng làm cơ sở cho việc khôi phục vi sai.

Sau đó, cơ sở dữ liệu được loại bỏ một lần nữa và khôi phục sau đây được thực hiện:

  1. Đầy đủ thứ 2
  2. Chênh lệch thứ 2
  3. Chênh lệch thứ 3

Lựa chọn sau đây chứng tỏ rằng khôi phục này đã thành công. Điều này cho thấy rằng một COPY_ONLYbản sao lưu đầy đủ không làm gián đoạn chuỗi vi sai.


Tôi đang tìm kiếm thông tin về việc bạn có thể áp dụng nhật ký giao dịch cho bản sao lưu đầy đủ copy_only hay không. Đây thực sự là thông tin tốt!
Brain2000

2

Đây là những gì xảy ra khi sự khác biệt có liên quan:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO


USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

Trong một từ: có, bạn có thể sử dụng COPY_ONLYbản sao lưu để khôi phục bản sao lưu nhật ký tiếp theo. Những gì bạn không thể làm là sử dụng COPY_ONLYbản sao lưu làm cơ sở khác biệt. Điều đó có nghĩa là bạn sẽ không thể khôi phục bất kỳ bản sao lưu vi sai nào trên bản sao lưu được khôi phục COPY_ONLY:

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

Nếu bạn thử điều này, bạn sẽ gặp lỗi:

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Sao lưu khác biệt có thể khó hiểu và có thể đánh lừa cả các DBA có kinh nghiệm.

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.