Проблема дифференциального резервного копирования - почему? Это возможно?

13

Я использую SQL Server 2014, и это ситуация:

  • У меня есть сервер A и сервер B.
  • Ночной ETL обрабатывается на сервере А.
  • После завершения процесса загрузки база данных X резервируется (с CHECKSUMи RESTORE VERIFYONLYдля обеспечения надежности), а затем отправляется на сервер B.
  • Сервер B получает bakфайл и затем восстанавливает базу данных там.

Я хочу использовать стратегию дифференциального резервного копирования, чтобы:

  1. Полное резервное копирование выполняется только в субботу,
    т.е. полное резервное копирование на сервере A в субботу -> отправка на сервер B -> Восстановление полного резервного копирования на сервере B

  2. Остальные дни будут дифференциальным резервным копированием,
    т. Е. Дифференциальным резервным копированием на сервере A -> отправка на сервер B -> восстановление дифференциального резервного копирования на сервере B

Я пытался, но я получил ошибку, говоря:

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

Не уверен почему. Я проверил sys.database_filesна сервере A и сервере B, и я вижу, что differential_Base_LSNи differential_base_GUIDто же самое. Где-нибудь еще проверить?

Кстати, на шаге 2 выше, когда я восстанавливаю резервную копию diff на сервере B, всегда ли мне нужно каждый раз восстанавливать как полную, так и дифференциальную резервную копию?

Я только восстановил дифференциальную резервную копию WITH RECOVERY(и получил это сообщение об ошибке), потому что полная резервная копия была восстановлена ​​уже накануне.

Чтобы уточнить: да, я хочу, чтобы БД на сервере B была читаемой между дифференциалами. Как я могу обойти это? Мой единственный вариант RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)комбо-последовательность каждую ночь?

Любое руководство будет высоко ценится.

я ничего не знаю
источник

Ответы:

15

Вам не нужно связываться RECOVERYи NORECOVERYздесь, все, что вам нужно, это STANDBYвариант. Вот краткое демо о том, как его использовать.

Создайте базу данных, установите ее для простого восстановления и создайте таблицу.

Вставьте данные, сделайте несколько различий.

Весело, правда?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

Да, я солгал. Это скучная часть.

Вы можете восстановить полную резервную копию в STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Вы можете восстановить Diffs по порядку STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

И в отличие от этих надоедливых лог-файлов, вы можете пропустить и при восстановлении Diffs:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Если вы хотите проверить читабельность, просто запустите ее между командами восстановления. Вы должны увидеть увеличение идентификаторов с каждым. Если вы этого не сделаете, вы сделали что-то ужасно неправильно.

Имейте в виду, что когда вы восстанавливаете файлы, он выгоняет всех конечных пользователей из базы данных и не будет ждать завершения их запросов.

Это также оставляет базу данных в состоянии только для чтения, здесь нельзя вносить изменения.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

И, наконец, уберитесь за собой.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

Надеюсь это поможет!!

Эрик Дарлинг
источник