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

Откуда:
Сообщений: 11
Всем доброго времени суток, есть большое количество БД которые периодически нужно перенести с одного сервера на другой. У всех БД всегда разное имя, каким образом реализовать, чтобы бекап делался в определенную папку, имя самого бекапа было как у базы. На другом сервере создавалась БД с именем файла бекапа, и туда восстанавливался бекап?
Сейчас делаю все ручками, подставляю в скрипт имя БД которую нужно забекапит, и на другом сервере подставляю в скрипт имя БД которую нужно востановить(( грустно, и муторно. Конкретно интересует как это можно зациклить? По порядку получая имена всех БД, также получать по порядку имена всех файлов из каталога и подсовывать в соответствующие скрипты.
28 дек 11, 05:25    [11836562]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
Sack
Member

Откуда:
Сообщений: 164
Asples,

А какая у вас версия сервера?
28 дек 11, 06:35    [11836580]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
Asples
Member

Откуда:
Сообщений: 11
Извиняюсь забыл написать, SQL Server 2008 R2 10.50.2769
28 дек 11, 06:47    [11836584]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
Sack
Member

Откуда:
Сообщений: 164
Для 2005 и выше имена баз данных можно получить из sys.databases
select name
from sys.databases
where database_id>4 --отбрасываем системные БД
28 дек 11, 06:47    [11836586]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Sack
Для 2005 и выше имена баз данных можно получить из sys.databases
select name
from sys.databases
where database_id>4 --отбрасываем системные БД
+ Работать с файлами (копировать, удалять и т.п.) можно черех xp_cmdshell, предварительно включив возможность её использования. А данные о содержимом резервной копии можно получить с помощью инструкции RESTORE HEADERONLY .
28 дек 11, 06:53    [11836591]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Asples
Всем доброго времени суток, есть большое количество БД которые периодически нужно перенести с одного сервера на другой. У всех БД всегда разное имя, каким образом реализовать, чтобы бекап делался в определенную папку, имя самого бекапа было как у базы. На другом сервере создавалась БД с именем файла бекапа, и туда восстанавливался бекап?
Сейчас делаю все ручками, подставляю в скрипт имя БД которую нужно забекапит, и на другом сервере подставляю в скрипт имя БД которую нужно востановить(( грустно, и муторно. Конкретно интересует как это можно зациклить? По порядку получая имена всех БД, также получать по порядку имена всех файлов из каталога и подсовывать в соответствующие скрипты.


Дарю

+
CREATE procedure [dbo].[sp_backup_user_database] (@DBName varchar(100),
                                                 @BackupType varchar(10),
                                                 @BackupFolder varchar(50),
                                                 @BackupPeriod int)
as

declare @dbbackfile varchar(200)
declare @device varchar(100)
declare @SQLString varchar(max)
declare @DBFolder varchar(300)
declare @CMDString varchar(300)
declare @dbstat varchar(20)
declare @status varchar(20)
declare @Getdate datetime
declare @fileext varchar(5)

declare @Folder table (FileExists int,
                       IsDirectory int,
                       ParentDirectory int)

set @DBFolder = @BackupFolder + '\' + @DBName+'\'

insert into @Folder
exec sys.xp_fileexist @DBFolder

if exists (select 1 from @Folder where IsDirectory = 0)
begin

exec sp_configure 'show advanced options', 1;
reconfigure;

exec sp_configure 'xp_cmdshell', 1;
reconfigure;

  set @CMDString = 'exec xp_cmdshell ' + char(39) + SUBSTRING(@BackupFolder,1,2) + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  set @CMDString = 'exec xp_cmdshell ' + char(39) + 'cd ' + @BackupFolder + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  set @CMDString = 'exec xp_cmdshell ' + char(39) + 'mkdir ' + @BackupFolder + '\' + @DBName + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  exec sp_configure 'xp_cmdshell', 0;
  reconfigure;
  
  exec sp_configure 'show advanced options', 0;
  reconfigure;
end

set @dbstat = 'Recovery'
set @status = CONVERT(NVARCHAR,DATABASEPROPERTYEX(@DBName, @dbstat))

set @Getdate = getdate()
set @dbbackfile = @DBFolder+@DBName+'_backup_'+convert(varchar,getdate(),112)+substring(convert(varchar,@Getdate,108),1,2)+substring(convert(varchar,@Getdate,108),4,2)+substring(convert(varchar,@Getdate,108),7,2)

if upper(@BackupType) = upper('Full') and (@status = 'FULL' or @status = 'SIMPLE')
begin
  set @dbbackfile = @dbbackfile +'.bak'
  set @device = lower(@DBName) + '_1'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup database '+@DBName+' to '+@device 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
  
  set @DBFolder = @BackupFolder + '\' + @DBName
  set @fileext = '*'
  exec dbo.sp_delete_old_backup_files @DBFolder, @DBName, @BackupPeriod, @fileext
end

if upper(@BackupType) = upper('Diff') and @status = 'FULL'
begin
  set @dbbackfile = @dbbackfile +'.dif'
  set @device = lower(@DBName) + '_2'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup database '+@DBName+' to '+@device + ' with differential' 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
  
  set @DBFolder = @BackupFolder + '\' + @DBName
  set @fileext = 'trn'
  set @BackupPeriod = 1
  exec dbo.sp_delete_old_backup_files @DBFolder, @DBName, @BackupPeriod, @fileext
end

if upper(@BackupType) = upper('Log') and @status = 'FULL'
begin
  set @dbbackfile = @dbbackfile +'.trn'
  set @device = lower(@DBName) + '_3'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup log '+@DBName+' to '+@device 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
end


GO

Удаление старых файлов

+
CREATE procedure [dbo].[sp_delete_old_backup_files] (@path varchar(150),
                                                    @dbname varchar(50),
                                                    @DiffPeriod int,
                                                    @fileext varchar(5))
                                                    
as

declare @dircmd varchar(1000)
declare @delcmd varchar(max)
declare @name varchar(100)
declare @MinRow int
declare @MaxRow int

declare @Filenames table (id int identity(1,1) ,[name] varchar(100))

exec sp_configure 'show advanced options', 1;
reconfigure;

exec sp_configure 'xp_cmdshell', 1;
reconfigure;

set @dircmd = 'exec master.dbo.xp_cmdshell '+char(39)+'dir '+ ltrim(rtrim(@path))+'\'+ltrim(rtrim(@dbname))+'*.'+@fileext+' /a/od'+char(39)
insert @Filenames([name])
exec (@dircmd)

delete from @Filenames 
where substring([name],3,1) <> '/' 
or [name] is null 
or substring([name],25,1) ='<'

set @delcmd = ''

select @delcmd = @delcmd + 'exec master.dbo.xp_cmdshell "del '+@path+'\'+ ltrim(rtrim(substring([name],40,59)))+'", NO_OUTPUT;'+char(10)
from @Filenames 
where datediff(hh, convert(datetime,left([name],20)), getdate()) >= @DiffPeriod

print (@delcmd)
exec (@delcmd)

exec sp_configure 'xp_cmdshell', 0;
reconfigure;

exec sp_configure 'show advanced options', 0;
reconfigure;

GO

Работает на SQL 2005/2008/2008 R2.

Сообщение было отредактировано: 28 дек 11, 11:53
28 дек 11, 11:30    [11837809]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
flexgen,

Восстановление баз

+
CREATE procedure [dbo].[sp_restore_user_database] (@BackupPath varchar(200),
                                                  @DefaultRestorePath varchar(200),
                                                  @DataPath varchar(200),
                                                  @LogPath varchar(200),    
                                                  @SearchEntry varchar(100),
                                                  @IsRoot bit,
                                                  @IfExecute bit)
as

set nocount on

declare @cmdstring varchar(1000)
declare @currdate datetime
declare @dbname varchar(30)
declare @sqlcmd varchar(max)
declare @MinRow int
declare @MaxRow int
declare @DataLogicalName varchar(200)
declare @DataFileName varchar(200)
declare @LogLogicalName varchar(200)
declare @LogFileName varchar(200)
declare @FullBackupPath varchar(300)

declare @Filenames table ([text] varchar(300)) 

declare @Backups table (RowID int identity(1,1) not null,
                        FullName varchar(100),
                        DBname varchar(100), 
                        BackupDate datetime, 
                        BackupTime datetime)

declare @FileList table (LogicalName varchar(128),
                         PhysicalName varchar(260),
                         [Type] char(1),
                         FileGroupName nvarchar(128),
                         size numeric(20,0),
                         MaxSize numeric(20,0),
                         FileID tinyint,
                         CreateLSN numeric(25,0),
                         DropLSN numeric(25,0),
                         UniqueID uniqueidentifier,
                         ReadOnlyLSN numeric(25,0),
                         ReadWriteLSN numeric(25,0),
                         BackupSizeInBytes bigint,
                         SourceBlockSize int,
                         FileGroupID int,
                         LogGroupGUID uniqueidentifier,
                         DifferentialBaseLSN numeric(25,0),
                         DifferentialBaseGUID uniqueidentifier,
                         IsReadOnly bit,
                         IsPresent bit,
                         TDEThumbprint int)

exec sp_configure 'show advanced options', 1;
reconfigure;

exec sp_configure 'xp_cmdshell', 1;
reconfigure;

set @cmdstring = 'exec master.dbo.xp_cmdshell '+char(39)+'dir '+ ltrim(rtrim(@BackupPath))+'\'+'*.bak /S/a/od'+char(39)
insert @Filenames([text])
exec (@cmdstring)

exec sp_configure 'xp_cmdshell', 0;
reconfigure;

exec sp_configure 'show advanced options', 0;
reconfigure;

delete from @Filenames 
where substring([text],3,1) <> '/' 
or [text] is null or
substring([text],25,1) ='<'
or [text] like '%master%'
or [text] like '%model%'
or [text] like '%msdb%'
or [text] like '%Report%'
or [text] like '%DBAService%'

insert into @Backups (FullName, BackupDate, BackupTime)
select substring([text],40,len([text])), convert(datetime, substring([text],1,10)), 
       convert(datetime, substring([text],13,5))
from @Filenames

update @Backups
set DBname = case 
               when charindex(@SearchEntry, FullName)-1 > 0 then substring(FullName,1,charindex(@SearchEntry, FullName)-1)
             end


delete from @Backups
where BackupDate not in (select max(BackupDate) from @Backups)

/*
delete from @Backups
where BackupTime not in (select MAX(BackupTime) from @Backups)
*/

select * from @Backups

select @MinRow = MIN(RowID), @MaxRow = MAX(RowID) from @Backups

while @MinRow <= @MaxRow
begin
  select @dbname = DBname
  from @Backups
  where RowID = @MinRow

  if @IsRoot = 0
    set @FullBackupPath = @BackupPath + '\'+ @dbname
  else     
    set @FullBackupPath = @BackupPath
    
  select @DataLogicalName = LogicalName, 
         @DataFileName = [FileName]  
  from fn_get_DB_Filename (@dbname, 1) 

  select @LogLogicalName = LogicalName,
         @LogFileName = [FileName]
  from fn_get_DB_Filename (@dbname, 2) 

  if @DataLogicalName is null or @LogLogicalName is null
  begin
    select @sqlcmd = 'restore filelistonly from disk =' + char(39) + @FullBackupPath + '\' + a.FullName + char(39) + ';'
    from @Backups a
    join (select DBname, max(BackupDate) as BackupDate, min(BackupTime) as BackupTime 
          from @Backups
          group by DBname) b
    on a.DBname = b.DBname
    and a.BackupDate = b.BackupDate
    and a.BackupTime = b.BackupTime
    where a.DBname = @dbname 
    
    print (@sqlcmd)
    
    insert into @FileList
    exec (@sqlcmd)
    
    select @DataLogicalName = LogicalName
    from @FileList
    where [Type] = 'D'

    select @LogLogicalName = LogicalName
    from @FileList
    where [Type] = 'L' 
    
    delete from @FileList
 end

  if @DataFileName is null
  begin
    if @DataPath is null
      set @DataFileName = @DefaultRestorePath + '\' + @dbname + '.mdf'
    else 
      set @DataFileName = @DefaultRestorePath + '\' + @DataPath + '\' + @dbname + '.mdf'
  end

  if @LogFileName is null 
  begin
    if @LogPath is null
      set @LogFileName = @DefaultRestorePath + '\' + @dbname + '.ldf' 
    else
      set @LogFileName = @DefaultRestorePath + '\' + @LogPath + '\' + @dbname + '.ldf' 
  end  
  select @sqlcmd = 'restore database [' + a.DBname + '] from disk =' + char(39) + @FullBackupPath + '\' 
                 + a.FullName + char(39) + ' with recovery , replace, move '+char(39) + @DataLogicalName + char(39)+
                 ' to ' + char(39) + @DataFileName + char(39) + ', move ' + 
                 char(39) + @LogLogicalName + char(39) + ' to '+ char(39) +  @LogFileName + char(39) + ';' + char(10)
  from @Backups a
  join (select DBname, max(BackupDate) as BackupDate, min(BackupTime) as BackupTime 
        from @Backups
        group by DBname) b
  on a.DBname = b.DBname
  and a.BackupDate = b.BackupDate
  and a.BackupTime = b.BackupTime
  where a.DBname = @dbname 

  if @IfExecute = 0
  begin
    print (@sqlcmd)
  end
  else
  begin  
    exec (@sqlcmd)
  end  

  set @DataLogicalName = null
  set @DataFileName = null
  set @LogLogicalName = null
  set @LogFileName = null

  set @sqlcmd = null
  set @MinRow = @MinRow + 1
end




GO


create function [dbo].[fn_get_DB_Filename] (@DBName varchar(100),
                                    @FileID int)
returns @DBFileName table (LogicalName varchar(200),
                           [FileName] varchar(200))
as

begin
  insert into @DBFileName
  select b.name, b.[filename]
  from sys.sysdatabases a
  join sys.sysaltfiles b
  on a.[dbid] = b.[dbid]
  where a.name = @DBName
  and b.fileid = @FileID
  
  return
end


GO


Сообщение было отредактировано: 28 дек 11, 11:53
28 дек 11, 11:32    [11837836]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
flexgen,

Критика приветствуется.
28 дек 11, 11:35    [11837871]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
flexgen,
Особой критики лично у меня нет, хотя все же, обычно в целях безопасности выполнение
процедуры xp_cmdshell отключено, поэтому ( и еще - для большей прозрачности кода и
удобства программирования) считаю, что файловые операции лучше выносить за пределы SQL - кода,
как это сделано здесь. (Кстати, может быть тоже - для опытов пригодится.)
Впрочем, кому как удобней.
28 дек 11, 12:35    [11838471]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
ART-CODE
обычно в целях безопасности выполнение
процедуры xp_cmdshell отключено


Не спорю, но xp_cmdshell у меня включается и отключается внутри процедур а не снаружи и не остается включенным. Твой пример утащу к себе, наверняка найду как использовать.
28 дек 11, 15:34    [11840222]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
alexey kirilenko
Member

Откуда: Saint Petesburg
Сообщений: 31
flexgen
Asples
Всем доброго времени суток, есть большое количество БД которые периодически нужно перенести с одного сервера на другой. У всех БД всегда разное имя, каким образом реализовать, чтобы бекап делался в определенную папку, имя самого бекапа было как у базы. На другом сервере создавалась БД с именем файла бекапа, и туда восстанавливался бекап?
Сейчас делаю все ручками, подставляю в скрипт имя БД которую нужно забекапит, и на другом сервере подставляю в скрипт имя БД которую нужно востановить(( грустно, и муторно. Конкретно интересует как это можно зациклить? По порядку получая имена всех БД, также получать по порядку имена всех файлов из каталога и подсовывать в соответствующие скрипты.


Дарю

+
+
CREATE procedure [dbo].[sp_backup_user_database] (@DBName varchar(100),
                                                 @BackupType varchar(10),
                                                 @BackupFolder varchar(50),
                                                 @BackupPeriod int)
as

declare @dbbackfile varchar(200)
declare @device varchar(100)
declare @SQLString varchar(max)
declare @DBFolder varchar(300)
declare @CMDString varchar(300)
declare @dbstat varchar(20)
declare @status varchar(20)
declare @Getdate datetime
declare @fileext varchar(5)

declare @Folder table (FileExists int,
                       IsDirectory int,
                       ParentDirectory int)

set @DBFolder = @BackupFolder + '\' + @DBName+'\'

insert into @Folder
exec sys.xp_fileexist @DBFolder

if exists (select 1 from @Folder where IsDirectory = 0)
begin

exec sp_configure 'show advanced options', 1;
reconfigure;

exec sp_configure 'xp_cmdshell', 1;
reconfigure;

  set @CMDString = 'exec xp_cmdshell ' + char(39) + SUBSTRING(@BackupFolder,1,2) + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  set @CMDString = 'exec xp_cmdshell ' + char(39) + 'cd ' + @BackupFolder + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  set @CMDString = 'exec xp_cmdshell ' + char(39) + 'mkdir ' + @BackupFolder + '\' + @DBName + CHAR(39) + ',NO_OUTPUT'
  exec (@CMDString)
  
  exec sp_configure 'xp_cmdshell', 0;
  reconfigure;
  
  exec sp_configure 'show advanced options', 0;
  reconfigure;
end

set @dbstat = 'Recovery'
set @status = CONVERT(NVARCHAR,DATABASEPROPERTYEX(@DBName, @dbstat))

set @Getdate = getdate()
set @dbbackfile = @DBFolder+@DBName+'_backup_'+convert(varchar,getdate(),112)+substring(convert(varchar,@Getdate,108),1,2)+substring(convert(varchar,@Getdate,108),4,2)+substring(convert(varchar,@Getdate,108),7,2)

if upper(@BackupType) = upper('Full') and (@status = 'FULL' or @status = 'SIMPLE')
begin
  set @dbbackfile = @dbbackfile +'.bak'
  set @device = lower(@DBName) + '_1'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup database '+@DBName+' to '+@device 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
  
  set @DBFolder = @BackupFolder + '\' + @DBName
  set @fileext = '*'
  exec dbo.sp_delete_old_backup_files @DBFolder, @DBName, @BackupPeriod, @fileext
end

if upper(@BackupType) = upper('Diff') and @status = 'FULL'
begin
  set @dbbackfile = @dbbackfile +'.dif'
  set @device = lower(@DBName) + '_2'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup database '+@DBName+' to '+@device + ' with differential' 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
  
  set @DBFolder = @BackupFolder + '\' + @DBName
  set @fileext = 'trn'
  set @BackupPeriod = 1
  exec dbo.sp_delete_old_backup_files @DBFolder, @DBName, @BackupPeriod, @fileext
end

if upper(@BackupType) = upper('Log') and @status = 'FULL'
begin
  set @dbbackfile = @dbbackfile +'.trn'
  set @device = lower(@DBName) + '_3'

  if exists (select 1 from sys.sysdevices where lower([name]) = @device)
  begin  
    set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
    exec (@SQLString)
  end

  set @SQLString = 'exec sp_addumpdevice' + CHAR(39) + 'disk' + char(39) + ',' + CHAR(39) + @device + CHAR(39) + ',' + CHAR(39) + @dbbackfile + CHAR(39)
  exec (@SQLString)
  set @SQLString = 'backup log '+@DBName+' to '+@device 
  exec (@SQLString)
  set @SQLString = 'exec sp_dropdevice ' + CHAR(39) + @device + CHAR(39)
  exec (@SQLString)
end


GO

Удаление старых файлов

+
+
CREATE procedure [dbo].[sp_delete_old_backup_files] (@path varchar(150),
                                                    @dbname varchar(50),
                                                    @DiffPeriod int,
                                                    @fileext varchar(5))
                                                    
as

declare @dircmd varchar(1000)
declare @delcmd varchar(max)
declare @name varchar(100)
declare @MinRow int
declare @MaxRow int

declare @Filenames table (id int identity(1,1) ,[name] varchar(100))

exec sp_configure 'show advanced options', 1;
reconfigure;

exec sp_configure 'xp_cmdshell', 1;
reconfigure;

set @dircmd = 'exec master.dbo.xp_cmdshell '+char(39)+'dir '+ ltrim(rtrim(@path))+'\'+ltrim(rtrim(@dbname))+'*.'+@fileext+' /a/od'+char(39)
insert @Filenames([name])
exec (@dircmd)

delete from @Filenames 
where substring([name],3,1) <> '/' 
or [name] is null 
or substring([name],25,1) ='<'

set @delcmd = ''

select @delcmd = @delcmd + 'exec master.dbo.xp_cmdshell "del '+@path+'\'+ ltrim(rtrim(substring([name],40,59)))+'", NO_OUTPUT;'+char(10)
from @Filenames 
where datediff(hh, convert(datetime,left([name],20)), getdate()) >= @DiffPeriod

print (@delcmd)
exec (@delcmd)

exec sp_configure 'xp_cmdshell', 0;
reconfigure;

exec sp_configure 'show advanced options', 0;
reconfigure;

GO

Работает на SQL 2005/2008/2008 R2.



Не подскажите как вызвать процедуру что бы она сделал бэкап всех данных?
exec [dbo].[sp_backup_user_database]
в качестве @DBname что указывать?
4 сен 12, 12:57    [13110850]     Ответить | Цитировать Сообщить модератору
 Re: Бекап/ восстановление большого количества БД с заранее неизвестным именем, из скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexey kirilenko
Не подскажите как вызвать процедуру что бы она сделал бэкап всех данных?
exec [dbo].[sp_backup_user_database]
в качестве @DBname что указывать?

Это процедура предназначена для бэкапа одной базы. Имя которой задается в параметре.
4 сен 12, 13:01    [13110887]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить