@dobromin

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

Меня интересует разностное резервное копирование.
У меня в день делаются три резервные копии одной и той же базы. утром в обед и вечером.
Так с какой базы будут сниматься последние изменения?
Какие то три плана делают по одной копии каждый день сами по себе затирая каждый день друг друга. и четвертый план, это полная копия раз в мес и от нее разностное.
Так можно средствами sql ?
  • Вопрос задан
  • 269 просмотров
Решения вопроса 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) 
DECLARE @DT VARCHAR(8) = CONVERT( VARCHAR, GETDATE(), 112)
SET @BF = 'MKDIR C:\Temp\' + SUBSTRING(@DT, 1, 4)
                           + '\' + SUBSTRING(@DT, 5, 2)
-- создание папки 2021\11
EXECUTE xp_cmdshell @BF 
SET @BF = 'C:\Temp\' + SUBSTRING(@DT, 1, 4)
                     + '\' + SUBSTRING(@DT, 5, 2)
                     + '\Testus.bak'
SET @BN = 'Testus' + CONVERT( VARCHAR, GETDATE(), 121)
BACKUP DATABASE Testus TO DISK = @BF WITH COPY_ONLY, NAME = @BN
-- сжатие
-- BACKUP DATABASE Testus TO DISK = @BF WITH COMPRESSION, COPY_ONLY, 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 21:17
5000 руб./за проект
28 мар. 2024, в 20:46
150000 руб./за проект
28 мар. 2024, в 20:37
50000 руб./за проект