Востановление БД из сжатой копии в SQL Server 2000

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

Tags: , ,

SQL Server

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading