Skip to content

Instantly share code, notes, and snippets.

@Konctantin
Last active March 22, 2018 11:45
Show Gist options
  • Select an option

  • Save Konctantin/dc67dd92dfcdeb7f6695c38d45e51169 to your computer and use it in GitHub Desktop.

Select an option

Save Konctantin/dc67dd92dfcdeb7f6695c38d45e51169 to your computer and use it in GitHub Desktop.
ALTER PROCEDURE [dbo].[pTHP_BackupKCMOD]
@isFullBackup tinyint = 0 -- признак полного выполнения
AS
BEGIN
SET NOCOUNT ON;
declare @arxTdl table(dbName nvarchar(7), isFull tinyint not null default 0, prioritet tinyint);
-- Основная база данных
insert into @arxTdl (dbName, prioritet) values ('kcmod', 1);
-- 3 последних месяца
insert into @arxTdl (dbName, prioritet)
select top 3 name, 2 from sys.databases
where patindex('arx[0-9][0-9][0-1][0-9]', name) > 0
order by name desc;
-- Для остальных делаем бекапы, если они старше 2 месяцев
insert into @arxTdl (dbName, prioritet)
select top 2 dbName, 3
from sys.databases
left join kcmod.dbo.nvTHP_DBBackup on dbName = name
where patindex('arx[0-9][0-9][0-1][0-9]', name) > 0
and name not in (select dbName from @arxTdl)
and DATEDIFF(month, DataLastBackup, GetDate()) > 2
order by isnull(DataLastBackup, '19010101') desc;
-- полные бекапы делаем только по субботам или принудительно,
-- но для архивов с высшим приоритетом
update @arxTdl set isFull = 1 where prioritet < 3
and (datepart(dw, getdate()) = 6 or @isFullBackup = 1);
-- Обрабатываем список баз
declare @db nvarchar(7), @fullname nvarchar(250), @fullBackName nvarchar(250), @fname nvarchar(250),
@isFull tinyint, @fexists int, @pth nvarchar(250);
select @pth = KodStr from dbo.nvVagPrivatDob where KodPos = 50 and mnkd = 'BPATH';
while (select count(*) from @arxTdl) > 0 begin
select top 1
@db = dbName,
@isFull = isFull,
@fullBackName = @pth+@db+N'.bak'
from @arxTdl
order by prioritet, dbName desc;
-- Проверяем наличие полного бекапа, если его нет, то никакой речи не может быть о разностном
EXEC master.dbo.xp_fileexist @fullBackName, @fexists OUTPUT;
if cast(@fexists as bit) <> 1
set @isFull = 1
-- Формируем имя и полный путь к файлу, в который будем делать копию
set @fname = @db + case when @isFull = 1 then N'.bak'
else N'_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(30),GETDATE(),20),'-',''),':',''),' ','') + N'.diff' end
set @fullname = @pth + @fname;
-- select * from kcmod..nvTHP_DBBackup
if not EXISTS (SELECT DBName from dbo.nvTHP_DBBackup WHERE DBName = @db)
INSERT INTO dbo.nvTHP_DBBackup (DBName, FileBaseName, ZaprosBackup,DataLastBackup) VALUES (@db,@fname,0,NULL)
BEGIN TRY
print(@fullname);
IF @isFull = 1 BEGIN
BACKUP DATABASE @db TO DISK = @fullname WITH COMPRESSION, INIT, STATS = 10;
-- запись в таблицу журнала успешного выполнения
UPDATE dbo.nvTHP_DBBackup SET FileBaseName = @fname,ZaprosBackup = 2,DataLastBackup = GETDATE(),
DataLastFullBackup = GETDATE(), LastResult = 'успешно' WHERE DBName = @db;
END ELSE BEGIN
BACKUP DATABASE @db TO DISK = @fullname WITH DIFFERENTIAL, NOFORMAT, NOINIT, SKIP, COMPRESSION, STATS = 10;
-- запись в таблицу журнала успешного выполнения
UPDATE dbo.nvTHP_DBBackup SET FileBaseName = @fname,ZaprosBackup = 2,DataLastBackup = GETDATE(),
LastResult = 'успешно' WHERE DBName = @db;
END
END TRY
BEGIN CATCH
-- запись в таблицу ошибки выполнения
UPDATE dbo.nvTHP_DBBackup SET FileBaseName = @fname,ZaprosBackup = 0,DataLastBackup = NULL,
DataLastFullBackup = NULL,LastResult = ERROR_MESSAGE() WHERE DBName = @db;
END CATCH
delete from @arxTdl where dbName = @db;
end;
-- чистка старых файлов разностных копий (удаляем старше 2х дней)
declare @delDate varchar(19);
set @delDate = convert(varchar(19), dateadd(dd, -2, getdate()), 126);
EXECUTE master.dbo.xp_delete_file 0, @pth, N'diff', @delDate, 0 -- удаление backup
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment