Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поимогите доумать со скриптиком на резервирование  [new]
True_Roman
Member

Откуда:
Сообщений: 5
Здраствуйте камрады! Уперся в проблемку, не могу домозговать скрипт по резервированию наполеоновского масштаба ) Шучу конечно. Думаю для продвинутых в t-sql, чего не скаюжешь обо мне , новичке в том чудном языке, не составит труда помочь дописать данный сриптик. Какова идея скрипта - взвешивать место базы, сравнивать с размером логического диска, при удачном сравнений - бкап базы, при неудачном - сравнение размера на запасном ресурсе и повторная попытка бкапа, если же тут промах - репорт на лектронку. Репорт вообщето желательно в любом случае. Скрипт состоит из 2 процедур - первая собственно взвешивает размер базы необходимой для бкапа - вторая отлавливает выходной параметр и выполняет описаные выше действия.

Вот код первой хранимки:


SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

create proc [dbo].[usp_space_for_full_backup] @reserved dec(20) output

as

create table #spt_space
(reserved dec(20) null)

dbcc updateusage(0) with no_infomsgs

set nocount on

insert into #spt_space (reserved)
select sum(convert(bigint,reserved))
from sysindexes
where indid in (0, 1, 255)

begin

set @reserved = (select ltrim(str(reserved * d.low / 1048576.,15,0))
from #spt_space, master.dbo.spt_values d
where d.number = 1 and d.type = 'E')

end
return (0)


а т набросок второй:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

--exec [dbo].[usp_backup_with_check_space] 'serverP', 'Backup', 'D:', 'Info', 'serverS', 'Backup', 'D:'

alter procedure [dbo].[usp_backup_with_check_space]


@primary_backup_servername varchar(100),
@primary_backup_path varchar(100),
@backupdrive_on_primary CHAR(2),
@bd_name varchar(150),
@secondary_backup_servername varchar(100),
@secondary_backup_path varchar(150),
@backupdrive_on_secondary CHAR(2)

as

SET NOCOUNT ON

declare @reserved dec(20)

exec usp_space_for_full_backup @reserved output

IF OBJECT_ID(N'tempdb..#cmd_result', N'U') IS NOT NULL drop table #cmd_result
CREATE TABLE #cmd_result (freespace varchar(8000))

INSERT #cmd_result
EXEC master..xp_cmdshell 'WMIC /node:"@primary_backup_servername" logicaldisk get DeviceID, Size, FreeSpace'

declare @spaceD NVARCHAR(200),
@cast dec(20),
@calcfreespace dec(20)

set @spaceD = (select substring(freespace, 11, 12) from #cmd_result
where freespace like '%@backupdrive_on_primary%')

set @cast = cast(@spaceD as dec(20))
set @calcfreespace = @cast / 1048576

if @calcfreespace < @reserved
begin
print 'Недостаточно места на диске' + ' ' + @backupdrive_on_primary + ' '+ 'для бэкапа базы' + ' ' + @bd_name + ' ' + 'на серверe' + ' '
+ @primary_backup_servername + ' ' + 'по пути' + ' ' + @primary_backup_path + ' ' + 'переходим на резервный ресурс...'
end

IF OBJECT_ID(N'tempdb..#cmd_result2', N'U') IS NOT NULL drop table #cmd_result2
CREATE TABLE #cmd_result2 (freespace varchar(8000))

INSERT #cmd_result2
EXEC master..xp_cmdshell 'WMIC /node:"@secondary_backup_servername" logicaldisk get DeviceID, Size, FreeSpace'

declare @spaceD2 NVARCHAR(200),
@cast2 dec(20),
@calcfreespace2 dec(20)

set @spaceD2 = (select substring(freespace, 11, 12) from #cmd_result2
where freespace like '%@backupdrive_on_secondary%')

set @cast2 = cast(@spaceD as dec(20))
set @calcfreespace2 = @cast2 / 1048576

if @calcfreespace2 < @reserved
begin
print 'Внимание! На диске' + ' ' + @backupdrive_on_secondary + ' '+ 'для бэкапа базы' + ' ' + @bd_name + ' ' + 'на резервном серверe' + ' '
+ @secondary_backup_servername + ' ' + 'по пути' + ' ' + @secondary_backup_path + ' ' + 'операция резервирования базы'+ ' ' + @bd_name + ' ' +
'неудачна по причине отсутствия дискового пространства на обоих ресурсах'
end


а вот как ее закончить корректно, не знаю... не хватает опыта.
9 июн 09, 23:57    [7283519]     Ответить | Цитировать Сообщить модератору
 Re: Поимогите доумать со скриптиком на резервирование  [new]
Crimean
Member

Откуда:
Сообщений: 13148
понимаешь, камрад, подобные проблемы чаще всего решаются апапратно. просто на устройствах резервного копирования ВСЕГДА должно быть достаточно места. и никак не "в упор". и средства слежения за этим должны работать чуть более глобально, вообще контролировать динамику свободного места по всей серверной группе и когда тенденция появляется - маяковать кому попало
а если работодатель не хочет платить ни грамотному DBA ни за оборудование, то чему тут помогать? или интерес сугубо спортивный? тогда может проще на VBA все сделать? а из T-SQL ограничиться синтаксисом BACKUP DATABASE? благо сделать трастовый конект и выполнить BACKUP сгодится почти любой пример из MSDN с ExecuteNonQuery
10 июн 09, 10:49    [7284347]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить