Этот миф — один из самых распространённых, и я встречал очень мало людей, которые знают правду.
Миф №20: после разрыва цепочки резервного копирования журнала для её перезапуска требуется полная резервная копия базы данных.
ЛОЖЬ!
Обычная резервная копия журнала транзакций содержит весь журнал транзакций, созданный с момента предыдущей резервной копии журнала (или с момента первой полной резервной копии, если это первая резервная копия журнала для базы данных). Существуют различные операции, которые разрывают цепочку резервного копирования журнала — то есть предотвращают возможность создания SQL Server очередной резервной копии журнала до тех пор, пока цепочка не будет перезапущена. Список таких операций включает:
- Переключение из модели восстановления FULL или BULK_LOGGED в модель SIMPLE
- Возврат к состоянию из снимка базы данных (database snapshot)
- Выполнение BACKUP LOG с параметрами WITH NO_LOG или WITH TRUNCATE_ONLY (что больше нельзя сделать в SQL Server 2008 и новее)
Смотрите статью блога BACKUP LOG WITH NO_LOG – use, abuse, and undocumented trace flags to stop it.
Вот пример скрипта, который показывает, что я имею в виду:
CREATE DATABASE LogChainTest;
GO
ALTER DATABASE LogChainTest SET RECOVERY FULL;
GO
BACKUP DATABASE LogChainTest TO DISK = 'C:\SQLskills\LogChainTest.bck' WITH INIT;
GO
BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log1.bck' WITH INIT;
GO
ALTER DATABASE LogChainTest SET RECOVERY SIMPLE;
GO
ALTER DATABASE LogChainTest SET RECOVERY FULL;
GO
Processed 152 pages for database 'LogChainTest', file 'LogChainTest' on file 1.
Processed 1 pages for database 'LogChainTest', file 'LogChainTest_log' on file 1.
BACKUP DATABASE successfully processed 153 pages in 0.088 seconds (14.242 MB/sec).
Processed 2 pages for database 'LogChainTest', file 'LogChainTest_log' on file 1.
BACKUP LOG successfully processed 2 pages in 0.033 seconds (0.341 MB/sec).
Я создал базу данных, перевёл её в модель восстановления FULL, запустил цепочку резервного копирования журнала, а затем ненадолго переключил её в модель SIMPLE и обратно в FULL.
Теперь, если я попытаюсь создать резервную копию журнала:
BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log2.bck' WITH INIT;
GO
Msg 4214, Level 16, State 1, Line 1
BACKUP LOG cannot be performed because there is no current database backup.
Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
SQL Server знает, что я выполнил операцию, из-за которой следующая резервная копия журнала НЕ будет содержать весь журнал, созданный с момента предыдущей резервной копии журнала, поэтому он не позволяет мне её сделать.
Миф гласит, что для перезапуска цепочки резервного копирования журнала требуется полная резервная копия базы данных. В реальности всё, что мне нужно, — это резервная копия данных, которая перекрывает разрыв в LSN. Дифференциальная резервная копия подойдёт:
BACKUP DATABASE LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_Diff1.bck' WITH INIT, DIFFERENTIAL;
GO
BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log2.bck' WITH INIT;
GO
Processed 40 pages for database 'LogChainTest', file 'LogChainTest' on file 1.
Processed 1 pages for database 'LogChainTest', file 'LogChainTest_log' on file 1.
BACKUP DATABASE WITH DIFFERENTIAL successfully processed 41 pages in 0.083 seconds (4.040 MB/sec).
Processed 1 pages for database 'LogChainTest', file 'LogChainTest_log' on file 1.
BACKUP LOG successfully processed 1 pages in 0.010 seconds (0.768 MB/sec).
Это действительно здорово, потому что вам не нужно создавать (потенциально очень большую) полную резервную копию базы данных, чтобы продолжить регулярное резервное копирование журнала.
Если ваша стратегия резервного копирования включает резервное копирование файлов или файловых групп, а также резервное копирование баз данных, вы можете перезапустить цепочку резервного копирования журнала даже после одной дифференциальной резервной копии файла! Однако имейте в виду, что для возможности восстановления этой базы данных вам потребуется резервная копия данных для каждой её части, которая перекрывает разрыв в LSN (то есть полная или дифференциальная резервная копия файла или файловой группы), но это сложнее, чем я хочу вдаваться в подробности в этой статье.
Ещё один миф развеян!

Комментариев нет:
Отправить комментарий