SQL Server 2008 R2 Восстановление полной копии COPY_ONLY с журналами транзакций

После ряда исследований я не могу найти ответа на этот вопрос.

Фон Я пытаюсь настроить план резервного копирования, который соответствует следующим трем требованиям:

  1. Надежность резервных копий, имеющих ночные полные резервные копии
  2. Резервные копии журналов транзакций, которые можно восстановить из
  3. Низкое количество используемого дискового пространства
  4. Резервные копии должны быть доступны локально для инструмента аудита.

Таким образом, чтобы удовлетворить эти потребности, я думаю, что полные резервные копии еженедельно, дифференцируются ежедневно и транзакцию почасово. Затем каждую ночь запускается копия copy_only, которая может быть отправлена ​​за пределы страны, эта резервная копия выполняется так, что цепочка журналов не нарушена, и у нас есть надежные ночные полные резервные копии вне сайта, без необходимости потреблять столько места на локальном диске.

Вопрос Возможно восстановление из резервной копии copy_only и восстановление журналов транзакций после.

Позвольте мне привести пример, чтобы вы знали, о чем я говорю.

Используя приведенный ниже список, мне интересно, можно ли восстановить FullbackupCOPY_ONLYC.bak, а затем TransactionbackupG.trn, TransactionbackupH.trn, наконец 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

Может быть, вся эта настройка не является разумной. Я довольно новичок в SQL Server и стараюсь учиться, когда я иду. Любые советы /помощь будут оценены.

10 голосов | спросил dv10t 20 MaramWed, 20 Mar 2013 03:00:37 +04002013-03-20T03:00:37+04:0003 2013, 03:00:37

2 ответа


12

Полная резервная копия в SQL Server 2008 не прерывает цепочку журналов. Он только сбрасывает дифференциальную базу-lsn.

Вы также можете восстановить резервные копии журнала после восстановления только из копии. Следующие демонстрации скриптов, которые:

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;

Он создает базу данных и таблицу и вставляет 50 строк в эту таблицу. Между этими вставками выполняется несколько резервных копий в следующем порядке:

    Полный
  1. Вход
  2. Полный
  3. Полная копия_Одно
  4. Вход

Затем база данных удаляется и восстанавливается следующим образом:

  1. 1st Full
  2. 1-й журнал
  3. 2-й журнал

Следующий SELECT показывает, что восстановление было успешным.

Это показывает, что ни COP_ONLY, ни нормальное полное резервное копирование не прерывают цепочку журналов.

Затем база данных снова удаляется и восстанавливается следующим образом:

  1. Copy_Only Full
  2. 2-й журнал

Впоследствии SELECT снова демонстрирует успех.

Это демонстрирует, что вы можете использовать полную резервную копию COPY_ONLY в качестве базы вашего восстановления журнала.

Дифференциальные тесты

Я создал версию DIFFERENTIAL:

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;

Выполняет резервное копирование в следующем порядке:

  1. 1st Full
  2. 1-й дифференциальный
  3. 2nd Full
  4. 2-й дифференциальный
  5. Copy_Only Diff
  6. 3-й дифференциальный

Затем он пытается восстановить маршрут восстановления:

  1. 1st Full
  2. 1-й дифференциальный
  3. 2-й дифференциальный

Этап 3 завершается с ошибкой:

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.

Это показывает, что нормальная полная резервная копия разбивает дифференциальную цепочку.

Затем база данных отбрасывается и этот поток восстановления выполняется:

  1. Copy_Only Full
  2. 3-й дифференциальный

Шаг 2 выходит из строя с той же ошибкой, что и на этапе 3 выше. Это показывает, что резервная копия только для копирования не может использоваться в качестве базы для дифференциального восстановления.

Затем база данных снова удаляется и выполняется следующее восстановление:

  1. 2nd Full
  2. 2-й дифференциальный
  3. 3-й дифференциальный

Следующий выбор доказывает, что это восстановление удалось. Это показывает, что полная резервная копия COPY_ONLY не прерывает дифференциальную цепочку.

ответил Sebastian Meine 20 MaramWed, 20 Mar 2013 05:47:19 +04002013-03-20T05:47:19+04:0005 2013, 05:47:19
2

Вот что происходит при использовании дифференциалов:

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;

Одним словом: да, вы можете использовать резервную копию COPY_ONLY для восстановления дополнительных резервных копий журнала. То, что вы не можете сделать, это использовать резервную копию COPY_ONLY как дифференциальную базу. Это означает, что вы не сможете восстановить дифференциальные резервные копии восстановленной резервной копии 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;

Если вы попробуете это, вы получите сообщение об ошибке:

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.

Дифференциальное резервное копирование может быть трудно понять и может обмануть даже опытных администраторов баз данных.

ответил spaghettidba 20 MarpmWed, 20 Mar 2013 16:19:23 +04002013-03-20T16:19:23+04:0004 2013, 16:19:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132