Випуск резервного резервного копіювання - чому? Це можливо?


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(і отримав це повідомлення про помилку), оскільки повне резервне копіювання було відновлено вже напередодні.

Для уточнення: Так, я хочу, щоб db на сервері 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

Сподіваюся, це допомагає !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.