SQL Server 2008 R2 Kembalikan COPY_ONLY cadangan penuh dengan log transaksi

11

Setelah melakukan riset, sepertinya saya tidak dapat menemukan jawaban untuk pertanyaan ini.

Latar Belakang Saya mencoba menyiapkan paket cadangan yang sesuai dengan tiga persyaratan berikut:

  1. Keandalan cadangan, memiliki cadangan penuh setiap malam
  2. Pencadangan log transaksi yang dapat dipulihkan dari
  3. Jumlah ruang disk yang digunakan rendah
  4. Cadangan harus dapat diakses secara lokal untuk alat audit

Jadi untuk memenuhi kebutuhan itu saya berpikir backup penuh setiap minggu, diferensial setiap hari, dan transaksi setiap jam. Kemudian setiap malam backup copy_only akan berjalan yang dapat dikirim ke luar kantor, backup ini dilakukan agar rantai log tidak rusak, dan kami memiliki backup lengkap per malam di luar kantor, tanpa harus menghabiskan banyak ruang disk lokal.

Pertanyaan Apakah mungkin untuk memulihkan dari cadangan copy_only, dan mengembalikan log transaksi setelah.

Izinkan saya memberi contoh agar Anda tahu apa yang saya bicarakan.

Menggunakan daftar di bawah ini saya bertanya-tanya apakah mungkin untuk mengembalikan FullbackupCOPY_ONLYC.bak diikuti oleh TransactionbackupG.trn, TransactionbackupH.trn, akhirnya 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

Mungkin seluruh pengaturan ini tidak masuk akal. Saya cukup baru untuk SQL Server dan saya mencoba untuk belajar saat saya pergi. Setiap saran / bantuan akan dihargai.

dv10t
sumber

Jawaban:

14

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:

  1. Penuh
  2. Catatan
  3. Penuh
  4. Copy_Only penuh
  5. Catatan

Selanjutnya basis data dijatuhkan dan dikembalikan seperti ini:

  1. 1 Penuh
  2. Log 1
  3. 2nd Log

Berikut ini SELECTmenunjukkan bahwa pemulihan berhasil.

Ini menunjukkan bahwa COP_ONLYFull Backup normal atau normal tidak memutus rantai log.

Kemudian basis data dijatuhkan lagi dan dikembalikan seperti ini:

  1. Salin_Hanya Penuh
  2. 2nd Log

Setelah itu SELECTmenunjukkan keberhasilan lagi.

Ini menunjukkan bahwa Anda dapat menggunakan COPY_ONLYcadangan lengkap sebagai dasar Pemulihan Log Anda.

Tes diferensial

Saya membuat DIFFERENTIALversi 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. 1 Penuh
  2. Diferensial 1
  3. 2 Penuh
  4. Diferensial 2
  5. Copy_Only Diff
  6. Diferensial ke-3

Kemudian mencoba rute pemulihan ini:

  1. 1 Penuh
  2. Diferensial 1
  3. 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:

  1. Salin_Hanya Penuh
  2. 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:

  1. 2 Penuh
  2. Diferensial 2
  3. Diferensial ke-3

Pilihan berikut membuktikan bahwa pemulihan ini berhasil. Ini menunjukkan bahwa COPY_ONLYcadangan penuh tidak mengganggu rantai diferensial.

Sebastian Meine
sumber
Saya sedang mencari informasi tentang apakah Anda dapat menerapkan log transaksi ke salinan lengkap copy_only. Ini informasi yang sangat bagus!
Brain2000
2

Inilah yang terjadi ketika perbedaan terlibat:

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;

Dengan kata lain: ya, Anda dapat menggunakan COPY_ONLYcadangan untuk memulihkan cadangan log lebih lanjut. Yang tidak bisa Anda lakukan adalah menggunakan COPY_ONLYcadangan sebagai basis diferensial. Itu berarti Anda tidak akan dapat memulihkan cadangan diferensial apa pun pada COPY_ONLYcadangan yang dipulihkan :

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

Jika Anda mencoba ini, Anda akan mendapatkan kesalahan:

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.

Pencadangan diferensial mungkin sulit untuk dipahami dan bahkan bisa menipu DBA yang berpengalaman.

spaghettidba
sumber