Simerjit1 Ответов: 1

Как создать новый файл резервной копии с уникальным именем


я пытаюсь сделать резервную копию, создав задание в Агенте sql server с помощью хранимой процедуры. я могу сделать резервную копию, но каждый раз она перезаписывает мой предыдущий файл резервной копии. я хочу, чтобы моя резервная копия создавала другой файл с уникальным именем файла с использованием даты. как я могу этого достичь? ниже приведен мой код, любая помощь будет оценена по достоинству

Что я уже пробовал:

use msdb;
go
EXEC msdb.dbo.sp_add_job  
   @job_name = 'BackupDatabaseLog',      
   @description = 'Procedure execution every 15min' ; 
   GO
  
DECLARE @backupfilename varchar(1000)
DECLARE @path varchar(1000)
set @backupfilename='C:\SqlBackups\AdventureWorks\Log\trans' + CONVERT (VarChar, GetDate(), 112) + '.bak with NOINIT, NOFORMAT'
set @path ='BACKUP Log AdventureWorks2012 TO  DISK ='''+ @backupfilename + ''''
EXEC msdb.dbo.sp_add_jobstep  
    @job_name = 'BackupDatabaseLog',   
    @step_name = 'Log Backup',   
    @subsystem = 'TSQL',   
   @command = @path;
GO

 EXEC msdb.dbo.sp_add_schedule  
    @schedule_name = 'Log schedule',   
    @freq_type = 4,  
    @freq_interval = 1,
	@freq_subday_type=4, 
    @freq_subday_interval=15,
	@active_start_date=20181007,
	--@freq_recurrence_factor=1,
    @active_start_time = 080000,
	@active_end_time=180000;   

 EXEC msdb.dbo.sp_attach_schedule  
   @job_name = 'BackupDatabaseLog',  
   @schedule_name = 'Log schedule' ;

    EXEC msdb.dbo.sp_add_jobserver  
   @job_name = 'BackupDatabaseLog',  
   @server_name = @@servername ;
   GO

1 Ответов

Рейтинг:
0

summiya1

Попробовать это

SET NOCOUNT ON;

DECLARE 
      @FileName NVARCHAR(1024)
    , @DBName NVARCHAR(256)
    , @PathName NVARCHAR(256)
    , @Message NVARCHAR(2048)
    , @IsCompressed BIT

SELECT 
      @PathName = 'D:\BACKUP\'
    , @IsCompressed = 1 

DECLARE db CURSOR LOCAL READ_ONLY FAST_FORWARD FOR  
    SELECT
          sd.name
        , file_path = @PathName + FileDate + '_' + name + '.bak'
    FROM sys.databases sd
    CROSS JOIN (
        SELECT FileDate = 'ABCD_' + REPLACE(CONVERT(VARCHAR(10), GETDATE(), 103), '/', '_')
    ) fd
    WHERE sd.state_desc != 'OFFLINE'
        AND sd.name NOT IN ('master', 'model', 'msdb', 'tempdb')
    ORDER BY sd.name 

OPEN db

FETCH NEXT FROM db INTO 
      @DBName
    , @FileName  

WHILE @@FETCH_STATUS = 0 BEGIN 

    DECLARE @SQL NVARCHAR(MAX)

    SELECT @Message = REPLICATE('-', 80) + CHAR(13) + CONVERT(VARCHAR(20), GETDATE(), 120) + N': ' + @DBName
    RAISERROR (@Message, 0, 1) WITH NOWAIT

    SELECT @SQL = 
    'BACKUP DATABASE [' + @DBName + ']
    TO DISK = N''' + @FileName + '''
    WITH FORMAT, ' + CASE WHEN @IsCompressed = 1 THEN N'COMPRESSION, ' ELSE '' END + N'INIT, STATS = 15;' 

    EXEC sys.sp_executesql @SQL

    FETCH NEXT FROM db INTO 
          @DBName
        , @FileName 

END   

CLOSE db   
DEALLOCATE db




Выход будет таким
BACKUP DATABASE [AdventureWorks2008R2]
    TO DISK = N'D:\BACKUP\ABCD_24_05_2013_AdventureWorks2008R2.bak'
    WITH FORMAT, COMPRESSION, INIT, STATS = 15;

BACKUP DATABASE [AdventureWorks2008R2_Live]
    TO DISK = N'D:\BACKUP\ABCD_24_05_2013_AdventureWorks2008R2_Live.bak'
    WITH FORMAT, COMPRESSION, INIT, STATS = 15;

BACKUP DATABASE [AdventureWorks2012]
    TO DISK = N'D:\BACKUP\ABCD_24_05_2013_AdventureWorks2012.bak'
    WITH FORMAT, COMPRESSION, INIT, STATS = 15;