@dobromin

Как сделать разностное резервное копирование?

Меня интересует разностное резервное копирование.
У меня в день делаются три резервные копии одной и той же базы. утром в обед и вечером.
Так с какой базы будут сниматься последние изменения?
Какие то три плана делают по одной копии каждый день сами по себе затирая каждый день друг друга. и четвертый план, это полная копия раз в мес и от нее разностное.
Так можно средствами sql ?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
BACKUP DATABASE … TO … WITH INIT  
BACKUP DATABASE … TO … WITH DIFFERENTIAL

Руководство.

-- включение xp_cmdshell, запустить ОДИН раз
EXECUTE sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
EXECUTE sp_configure 'xp_cmdshell', 1;  
GO  
RECONFIGURE;  
GO


-- создание месячного резерва, запускать раз в месяц ДО ежедневного
DECLARE @BF VARCHAR(256), @BN VARCHAR (128)
SET @BF = 'MKDIR C:\Temp\' + SUBSTRING(CONVERT( VARCHAR, GETDATE(), 112), 1, 4)
                           + '\' + SUBSTRING(CONVERT( VARCHAR, GETDATE(), 112), 5, 2)
-- создание папки 2021\11
EXECUTE xp_cmdshell @BF 
SET @BF = 'C:\Temp\' + SUBSTRING(CONVERT( VARCHAR, GETDATE(), 112), 1, 4)
                     + '\' + SUBSTRING(CONVERT( VARCHAR, GETDATE(), 112), 5, 2)
                     + '\Testus.bak'
SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
BACKUP DATABASE Testus TO DISK = @BF WITH INIT, NAME = @BN


Ночью делаете полную резервную копию:
-- создание ежедневного полного резерва
DECLARE @BF VARCHAR(256), @BN VARCHAR (128)
SET @BF = 'forfiles /P C:\Temp /M Testus-* /C "cmd /c DEL @path" /D -5'
-- удаление резервов старше 5 дней
EXECUTE xp_cmdshell @BF 
SET @BF = 'C:\Temp\Testus-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
BACKUP DATABASE Testus TO DISK = @BF WITH INIT, NAME = @BN

Потом в рабочее время — разностную, например, каждый час:
-- создание разностного резерва
DECLARE @BF VARCHAR(256), @BN VARCHAR(128)
SET @BF = 'C:\Temp\Testus-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
BACKUP DATABASE Testus TO DISK = @BF WITH DIFFERENTIAL, NAME = @BN


Задание можно выполнять планировщиком ОС или SQL-сервера (руководство).
Обработку файлов (перемещение, удаление и пр.), также средствами ОС или SQL-сервера (xp_cmdshell).

бывают еще ручные резервные копии
Чтобы не нарушить порядок автоматический резервов, нужно делать резерв с параметром COPY_ONLY в специальный файл.
-- создание ручного полного резерва
DECLARE @BF VARCHAR(256), @BN VARCHAR (128)
SET @BF = 'C:\Temp\Testus-cp-' + CONVERT( VARCHAR, GETDATE(), 23) + '.bak'
SET @BN = 'Testus-' + CONVERT( VARCHAR, GETDATE(), 121)
BACKUP DATABASE Testus TO DISK = @BF WITH COPY_ONLY, NAME = @BN


Восстановление:
Выбирайте день (имя файла) и восстанавливаете до нужного состояния.
День и последнее
61826e5178641930962219.png

можно выбрать не последнюю
61826e75e1590439730463.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы