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:
- Đầy
- Đăng nhập
- Đầy
- Sao chép đầy đủ
- Đă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 đầy đủ
- Nhật ký 1
- Nhật ký 2
Sau đây SELECT
chứ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_ONLY
Sao 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:
- Copy_Only Full
- Nhật ký 2
Sau đó, SELECT
chứ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_ONLY
bả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 DIFFERENTIAL
phiê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 đầy đủ
- Chênh lệch thứ 1
- Đầy đủ thứ 2
- Chênh lệch thứ 2
- Copy_Only Diff
- Chênh lệch thứ 3
Sau đó, nó sẽ thử tuyến đường khôi phục này:
- 1 đầy đủ
- Chênh lệch thứ 1
- 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ử:
- Copy_Only Full
- 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:
- Đầy đủ thứ 2
- Chênh lệch thứ 2
- 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_ONLY
bản sao lưu đầy đủ không làm gián đoạn chuỗi vi sai.