среда, 31 января 2018 г.

Разностная архивация баз на MS SQL Server


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

USE TEMPDB

--Проверка на существование таблицы
   IF EXISTS(SELECT  [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_TYPE] = 'BASE TABLE' AND TABLE_NAME ='TEMPLASTBACKUPS' )
BEGIN
DROP TABLE TEMPLASTBACKUPS
END

USE MSDB

SELECT
IDENTITY(INT, 1, 1) AS ID
,BackupSets.backup_set_id -- Уникальный идентификационный номер резервного набора, который определяет резервный набор. Идентификатор, первичный ключ.
,BackupSets.backup_finish_date -- Дата и время окончания операции резервного копирования. Может принимать значение NULL.
,BackupSets.DBName -- Имя базы данных, участвовавшей в операции резервного копирования. Может принимать значение NULL.
,BackupSets.BackupType -- Тип резервного копирования.
,BackupSets.DescrType -- Человеческое отображение типа резервной копии
,backupset.media_set_id media_set_id -- Уникальный идентификационный номер набора носителей, который определяет набор носителей, содержащий резервный набор данных.
,backupset.backup_size backup_size --  Размер резервного набора данных в байтах. Может принимать значение NULL.
,backupmediafamily.physical_device_name -- Физическое имя устройства резервного копирования. Может принимать значение NULL.
INTO TEMPDB.dbo.TEMPLASTBACKUPS
FROM
(
select
MAX(backupset.backup_set_id) backup_set_id
,MAX(backupset.backup_finish_date) backup_finish_date
,backupset.database_name DBName
,backupset.type BackupType
,CASE backupset.type
WHEN 'D' THEN 'Копирование базы данных'
WHEN 'I' THEN 'Разностное копирование базы данных'
WHEN 'L' THEN 'Копирование журнала'
WHEN 'F' THEN 'Копирование файла или файловой группы'
WHEN 'G' THEN 'Разностное копирование файла'
WHEN 'P' THEN 'Частичное копирование'
WHEN 'Q' THEN 'Частичное разностное копирование'
ELSE NULL
END DescrType
from backupset AS backupset
WHERE backupset.database_name IN ('base1', 'base2', 'base3') AND backupset.type ='D'
GROUP BY
backupset.database_name
,backupset.type
,CASE backupset.type
WHEN 'D' THEN 'Копирование базы данных'
WHEN 'I' THEN 'Разностное копирование базы данных'
WHEN 'L' THEN 'Копирование журнала'
WHEN 'F' THEN 'Копирование файла или файловой группы'
WHEN 'G' THEN 'Разностное копирование файла'
WHEN 'P' THEN 'Частичное копирование'
WHEN 'Q' THEN 'Частичное разностное копирование'
ELSE NULL
END
) BackupSets
INNER JOIN backupset backupset ON backupset.backup_set_id = BackupSets.backup_set_id
LEFT JOIN backupmediafamily backupmediafamily ON backupmediafamily.media_set_id = backupset.media_set_id
order by
BackupSets.DBName
,BackupSets.backup_finish_date desc

USE TEMPDB
DECLARE @DBNAME NVARCHAR(100) -- Имя базы
DECLARE @BACKUPFILE NVARCHAR(1000) -- Полное имя файла бэкапа
DECLARE @DINSQL NVARCHAR(1000) -- динамически формируемая команда-строка для выполнения бэкапа
DECLARE @COUNTROWS INT -- Количество строк бэкапов
DECLARE @I INT = 1 -- счетчик цикла
SET @COUNTROWS = (SELECT COUNT(T.DBName) FROM TEMPLASTBACKUPS T)

WHILE @I<=@COUNTROWS
BEGIN
SET @DBNAME = (SELECT T.DBName FROM TEMPLASTBACKUPS T WHERE T.ID = @I)
SET @BACKUPFILE = (SELECT T.physical_device_name FROM TEMPLASTBACKUPS T WHERE T.ID = @I)
SET @DINSQL = '
BACKUP DATABASE ' + @DBNAME + '
TO  DISK = N''' + @BACKUPFILE  + '''
WITH  DIFFERENTIAL , NOFORMAT, NOINIT,
NAME = N''Разностная копия'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N''' + @DBNAME + ''' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N''' + @DBNAME + ''' )
if @backupSetId is null begin raiserror(N''Ошибка верификации. Сведения о резервном копировании для базы данных "' + @DBNAME + '" не найдены.'', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N''' + @BACKUPFILE + ''' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND'

PRINT @DINSQL
EXECUTE(@DINSQL)
SET @I = @I + 1
END


--DROP TABLE TEMBDB.DBO.TEMPLASTBACKUPS -- так выводит ошибку об отсутствии прав
 IF EXISTS(SELECT  [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_TYPE] = 'BASE TABLE' AND TABLE_NAME ='TEMPLASTBACKUPS' )
BEGIN
DROP TABLE TEMPLASTBACKUPS
END

Комментариев нет:

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