Cadangan penuh di SQL Server 2008 tidak memutus rantai log. Ini hanya mengatur ulang basis diferensial-lsn.
Anda juga dapat mengembalikan cadangan log setelah memulihkan dari salinan saja. Script berikut menunjukkan bahwa:
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;
Itu menciptakan database dan tabel dan menyisipkan 50 baris ke dalam tabel itu. Di antara sisipan tersebut, beberapa cadangan diambil dalam urutan ini:
- Penuh
- Catatan
- Penuh
- Copy_Only penuh
- Catatan
Selanjutnya basis data dijatuhkan dan dikembalikan seperti ini:
- 1 Penuh
- Log 1
- 2nd Log
Berikut ini SELECT
menunjukkan bahwa pemulihan berhasil.
Ini menunjukkan bahwa COP_ONLY
Full Backup normal atau normal tidak memutus rantai log.
Kemudian basis data dijatuhkan lagi dan dikembalikan seperti ini:
- Salin_Hanya Penuh
- 2nd Log
Setelah itu SELECT
menunjukkan keberhasilan lagi.
Ini menunjukkan bahwa Anda dapat menggunakan COPY_ONLY
cadangan lengkap sebagai dasar Pemulihan Log Anda.
Tes diferensial
Saya membuat DIFFERENTIAL
versi juga:
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;
Ini membutuhkan cadangan dalam urutan ini:
- 1 Penuh
- Diferensial 1
- 2 Penuh
- Diferensial 2
- Copy_Only Diff
- Diferensial ke-3
Kemudian mencoba rute pemulihan ini:
- 1 Penuh
- Diferensial 1
- Diferensial 2
Langkah 3 gagal dengan kesalahan ini:
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.
Ini menunjukkan bahwa cadangan penuh normal memutus rantai diferensial.
Selanjutnya basis data dijatuhkan dan aliran pemulihan ini dicoba:
- Salin_Hanya Penuh
- Diferensial ke-3
Langkah 2 gagal dengan kesalahan yang sama seperti langkah 3 di atas. Ini menunjukkan bahwa cadangan hanya salinan tidak dapat digunakan sebagai dasar untuk pengembalian diferensial.
Kemudian basis data dijatuhkan lagi dan pengembalian berikut dijalankan:
- 2 Penuh
- Diferensial 2
- Diferensial ke-3
Pilihan berikut membuktikan bahwa pemulihan ini berhasil. Ini menunjukkan bahwa COPY_ONLY
cadangan penuh tidak mengganggu rantai diferensial.
Inilah yang terjadi ketika perbedaan terlibat:
Dengan kata lain: ya, Anda dapat menggunakan
COPY_ONLY
cadangan untuk memulihkan cadangan log lebih lanjut. Yang tidak bisa Anda lakukan adalah menggunakanCOPY_ONLY
cadangan sebagai basis diferensial. Itu berarti Anda tidak akan dapat memulihkan cadangan diferensial apa pun padaCOPY_ONLY
cadangan yang dipulihkan :Jika Anda mencoba ini, Anda akan mendapatkan kesalahan:
Pencadangan diferensial mungkin sulit untuk dipahami dan bahkan bisa menipu DBA yang berpengalaman.
sumber