Полное резервное копирование в SQL Server 2008 не нарушает цепочку журналов. Сбрасывает только дифференциал base-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 строк в эту таблицу. Между этими вставками делается несколько резервных копий в следующем порядке:
- Полный
- Журнал
- Полный
- Full Copy_Only
- Журнал
Затем база данных удаляется и восстанавливается следующим образом:
- 1-й полный
- 1-й журнал
- 2-й журнал
Ниже SELECT
показано, что восстановление прошло успешно.
Это показывает, что COP_ONLY
ни обычное полное резервное копирование, ни обычное резервное копирование не нарушают цепочку журналов.
Затем база данных снова удаляется и восстанавливается следующим образом:
- Copy_Only Full
- 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-й полный
- 1-й дифференциал
- 2-й полный
- 2-й дифференциал
- Copy_Only Diff
- 3-й дифференциал
Затем он пытается этот маршрут восстановления:
- 1-й полный
- 1-й дифференциал
- 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.
Это показывает, что нормальное полное резервное копирование разрывает дифференциальную цепь.
Затем база данных удаляется и выполняется попытка восстановления:
- Copy_Only Full
- 3-й дифференциал
Шаг 2 завершается с той же ошибкой, что и шаг 3 выше. Это показывает, что резервная копия только для копирования не может использоваться в качестве базы для дифференциального восстановления.
Затем база данных снова удаляется и выполняется следующее восстановление:
- 2-й полный
- 2-й дифференциал
- 3-й дифференциал
Следующий выбор подтверждает, что это восстановление прошло успешно. Это показывает, что COPY_ONLY
полное резервное копирование не прерывает дифференциальную цепочку.
Вот что происходит, когда задействованы дифференциалы:
Одним словом: да, вы можете использовать
COPY_ONLY
резервную копию для восстановления дальнейших резервных копий журнала. Что вы не можете сделать, это использоватьCOPY_ONLY
резервную копию в качестве дифференциальной базы. Это означает, что вы не сможете восстановить какие-либо дифференциальные резервные копии из восстановленнойCOPY_ONLY
резервной копии:Если вы попробуете это, вы получите ошибку:
Дифференциальные резервные копии могут быть трудны для понимания и могут обмануть даже опытных администраторов баз данных.
источник