by Alexey Knyazev
1. октября 2010 01:44
Сжатие резервных копий было впервые представлено в выпуске SQL Server 2008 Enterprise. Начиная с версии SQL Server 2008 R2, сжатие резервных копий поддерживается в выпуске SQL Server 2008 R2 Standard Edition и всех выпусках с более широкими возможностями. Сжатую резервную копию можно восстановить в любом выпуске SQL Server 2008 и более поздней версии. ( http://technet.microsoft.com/ru-ru/library/bb964719.aspx )
Для сжатия резервных копий в более ранних версиях использовались утилиты 3-их фирм (как правило платные). Но можно найти и бесплатные аналоги, например небольшая утилита от старого участника сообщества Russian SQL Server Club locky ( http://mcp.itcommunity.ru/blogs/rsug/archive/2010/06/28/110674.aspx ).
Можно сказать на коленке накидал небольшую процедуру на T-SQL, которая с помощью хранимой процедуры xp_cmdshell и бесплатного архиватора 7-zip сжимает резервную копию.
Собственно сама процедура
dbo.BackupWithArchive
-- Создадим процедуру в контексте БД master
use master
go
-- Удаляем процедуру, еслиона существует
if object_id ( 'dbo.BackupWithArchive', 'P' ) is not null
drop procedure dbo.BackupWithArchive
go
create procedure dbo.BackupWithArchive
(
@BackupCommand nvarchar (4000) = 'help' -- стандартные команды бэкапирования
, @BackupFile nvarchar (1024) -- имя Backup-файла
, @ArchCommand nvarchar (128) = ' a -r -mx ' -- параметры архивирования
, @ArchFile nvarchar (1024) -- имя архива
, @DeleteAfterArchive bit = 0 -- удаление бэкапа после архивирования
)
as
set nocount on
declare @archiver nvarchar (256)
, @cmd nvarchar (512)
, @file_exists int
, @error int
set @error = 0
-- Архиватор 7-zip ( http://www.7-zip.org/ )
set @archiver = N'"C:\Program Files\7-Zip\7z.exe"'
-- Список параметров архивирования
if ( @BackupCommand = 'help' ) or ( @BackupCommand = '?' )
begin
set @cmd = @archiver + ' -?'
exec @error = master..xp_cmdshell @cmd
select @error = @@error where @@error != 0
return @error
end
-- Само Бэкапирование в динамике
exec @error = master..sp_executesql @BackupCommand
select @error = @@error where @@error != 0
if ( @error != 0 )
return @error
-- Проверяем существование Backup-файла
set @file_exists = 0
exec @error = master..xp_fileexist @BackupFile, @file_exists out
select @error = @@error where @@error != 0
if ( @file_exists = 0 ) or ( @error != 0 )
begin
select 'Backup-файл не найден!'
return @error
end
-- Само архивирование
set @cmd = @archiver + ' ' + @ArchCommand + ' ' + @ArchFile + ' ' + @BackupFile
exec @error = master.dbo.xp_cmdshell @cmd
select @error = @@error where @@error != 0
if ( @error != 0 )
return @error
--Удаляем сам Бэкап
if ( @DeleteAfterArchive = 1 )
begin
set @cmd = 'del ' + @BackupFile
exec @error = master.dbo.xp_cmdshell @cmd
select @error = @@error where @@error != 0
return @error
end
return @error
go
Вызов процедуры более чем простой:
exec dbo.BackupWithArchive
@BackupCommand = 'backup database Northwind to disk = ''c:\Northwind.bak'''
, @BackupFile ='c:\Northwind.bak'
, @ArchCommand = ' a -r -mx '
, @ArchFile = 'c:\Northwind.7z'
, @DeleteAfterArchive = 1
Теперь эту процедуру можно запускать по расписанию и на выходе иметь сжатые резерные копии