by Alexey Knyazev
3. октября 2010 15:48
В прошлый раз я писал, как можно организовать автоматическое сжатие резервной копии БД в SQL Server 2000 с помощью бесплатного архиватора 7-Zip, сейчас я покажу процедуру dbo.RestoreArchiveBackup, которая востанавливает из сжатой копии вашу базу данных.
В процедуре 5 параметров:
- @RestoreCommand - Стандартная команда востановления БД на T-SQL, либо команда Help, которая выводит список параметров архиватора 7-zip
- @BackupFile Полный путь и имя файла резервной копии, туда мы будем извлекать бэкап из архива
- @ArchCommand Параметры архиватора, с которыми мы запускаем нашу процедуру
- @ArchFile Имя файла резервной копии БД в сжатом виде (как сжимать описано в предыдушем посте)
- @DeleteAfterRestore Флаг - удалять или нет распакованную копию БД после востановления
Сама процедура:
-- Создадим процедуру в контексте БД master
use master
go
-- Удаляем процедуру, еслиона существует
if object_id ( 'dbo.RestoreArchiveBackup', 'P' ) is not null
drop procedure dbo.RestoreArchiveBackup
go
create procedure dbo.RestoreArchiveBackup
(
@RestoreCommand nvarchar (4000) = 'help' -- стандартные команды востановления
, @BackupFile nvarchar (1024) -- имя Backup-файла
, @ArchCommand nvarchar (128) = ' e -y ' -- параметры архиватора
, @ArchFile nvarchar (1024) -- имя архива
, @DeleteAfterRestore bit = 0 -- удаление бэкапа после востановления
)
as
set nocount on
declare @archiver nvarchar (256)
, @cmd nvarchar (512)
, @file_exists int
, @error int
, @BackupFilePach nvarchar (1024)
set @error = 0
-- Архиватор 7-zip ( http://www.7-zip.org/ )
set @archiver = N'"C:\Program Files\7-Zip\7z.exe"'
-- Список параметров архивирования
if ( @RestoreCommand = 'help' ) or ( @RestoreCommand = '?' )
begin
set @cmd = @archiver + ' -?'
exec @error = master..xp_cmdshell @cmd
select @error = @@error where @@error != 0
return @error
end
-- Проверяем существование сжатой копии Backup-файла
set @file_exists = 0
exec @error = master..xp_fileexist @ArchFile, @file_exists out
select @error = @@error where @@error != 0
if ( @file_exists = 0 ) or ( @error != 0 )
begin
select 'Backup-файл не найден!'
return @error
end
--Получаем относительный путь из входного параметра @BackupFile
set @BackupFilePach = left( @BackupFile, len(@BackupFile) - charindex( '\', reverse (@BackupFile) ) )
-- Распаковываем архив
set @cmd = @archiver + ' ' + @ArchCommand + ' ' + @ArchFile + ' -o' + @BackupFilePach
exec @error = master.dbo.xp_cmdshell @cmd
select @error = @@error where @@error != 0
if ( @error != 0 )
return @error
-- Само востановление из резевной копии в динамике
exec @error = master..sp_executesql @RestoreCommand
select @error = @@error where @@error != 0
if ( @error != 0 )
return @error
--Удаляем сам Бэкап после востановления, чтоб осталась только сжатая копия
if ( @DeleteAfterRestore = 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.RestoreArchiveBackup
@RestoreCommand = 'restore database Northwind2 from disk = ''c:\Northwind.bak'' with replace'
, @BackupFile ='c:\Northwind.bak'
, @ArchCommand = ' e -y '
, @ArchFile = 'c:\Northwind.7z'
, @DeleteAfterRestore = 1