Как я должен сделать, чтобы правильно использовать sp_msforeachDB для создания и удаления резервных копий - PullRequest
0 голосов
/ 23 мая 2019

Я настраиваю новый способ создания и удаления резервных копий в наших внутренних средах. Пространство на серверах является большой проблемой, поэтому мне действительно нужно найти способ сделать резервную копию и удалить старый для каждой базы данных, процедурно.

Мне пришла в голову идея использовать sp_MSforeachdb и просто сделать резервную копию. В случае успеха он удалит более старую резервную копию, которая была сделана накануне. (мы делаем 1 резервное копирование за ночь).

DECLARE @DBOPurpose Varchar(15)
DECLARE @Drive      Varchar(1)
Set @DBOPurpose = 'Omnilabs'

DECLARE @command varchar(Max) 

Select @command = '

If Exists (Select * 
            from sys.databases 
            where name like ''%?'' 
            and name like ''%'+@DBOPurpose+'%'')

BEGIN
EXECUTE master.dbo.xp_create_Subdir '+@Drive+':\SQLBACKUP\'+@DBOPurpose+'
GO

BACKUP DATABASE [?] TO DISK = '+@Drive+':\SQLBackup\'+@DBOPurpose+'_Select Cast(Cast(Year(Getdate())As Varchar(150))+''_''+Cast(month(Getdate())As Varchar(150))+''_''+Cast (Day(Getdate()) As Varchar(150))+''_''+ cast(DATEPART(hour, GETDATE()) as varchar) + '''' + cast(DATEPART(minute, GETDATE()) as varchar)+ '''' + cast(DATEPART(Second, GETDATE()) as varchar)+ ''.bak'' As varchar(150))


END

Print N''TEST''
'
--Select @Command
EXEC sp_MSforeachdb @command 

Я ожидал, что выполнение Select @Command действительно покажет мне что-то, но это ноль. Когда я запускаю это, он просто пишет: «Команды выполнены успешно». через секунду, что не имеет никакого смысла.

1 Ответ

0 голосов
/ 23 мая 2019

Только что увидел мою ошибку, которая была вызвана только дефисами, которые были размещены неправильно.Вот код:

If exists(Select * from #TempDBName where DBNAME = @DBOPurpose)
BEGIN
    DECLARE @ERROR bit
    DECLARE @command nvarchar(Max)
    SET @Error = 0
    SET @command = '



    DECLARE @DBO VARCHAR(15)
    Set @DBO = ''%'+@DBOPURPOSE+'%''

    If Exists (Select * 
                    from sys.databases 
                    where name like ''%?'' 
                    and name like ''%''+@DBO+''%'')
            BEGIN TRY

                    PRINT ''?''

                    EXECUTE master.dbo.xp_create_Subdir '''+@Drive+':\SQLBACKUP\TEST\?''
                    BACKUP DATABASE [?] TO DISK = '''+@Drive+':\SQLBackup\'+@DBOPurpose+'_' +(Cast(Cast(Year(Getdate())As Varchar(150))+'_'+Cast(month(Getdate())As Varchar(150))+'_'+Cast (Day(Getdate()) As Varchar(150))+'_'+ cast(DATEPART(hour, GETDATE()) as varchar) + cast(DATEPART(minute, GETDATE()) as varchar)+ cast(DATEPART(Second, GETDATE()) as varchar)+ '.bak''' As varchar(150)))+'

            END TRY

            BEGIN CATCH
            Insert into BackupExecLog(ErrorDate, ErrorNumber, ErrorMessage)
                Select Getdate(),
                    ERROR_NUMBER() as ErrorNumber,
                    ERROR_MESSAGE() as ErrorMessage

                    Set @Error = 1
            END CATCH'


        Select @Command
    --EXEC sys.sp_MSforeachdb @command 
...