1

このスクリプトを使用して、SQL Server データベースからバックアップを取得します

DECLARE @name VARCHAR(50) -- database name 
DECLARE @path VARCHAR(256) -- path for backup files 
DECLARE @fileName VARCHAR(256) -- filename for backup 
DECLARE @fileDate VARCHAR(20) -- used for file name

--Path to backups
SET @path = 'E:\DataBase Backups\' 

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB') 

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @name  

WHILE @@FETCH_STATUS = 0  
BEGIN  
       --Remove if you dont want a date stamp 
       SET @fileName = @path + @name + '_' + @fileDate + '.BAK' 

      -- SET @fileName = @path + @name + '.BAK' 
       BACKUP DATABASE @name TO DISK = @fileName with noinit

       FETCH NEXT FROM db_cursor INTO @name  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

このコードは 1 日ごとに新しいバックアップ ファイルを作成しますが、古いバックアップを今日のバックアップで置き換えるか、今日のバックアップを作成した後、すべての古いバックアップが削除されてしまいました! 手伝っていただけませんか?

4

1 に答える 1

1

文書化されていない拡張ストアド プロシージャ xp_delete_file を使用して、バックアップ ファイルを削除できます。Microsoft は、データベースとトランザクション ログのバックアップ ファイルのみを削除できるように、いくつかのセーフガードを内部的に追加しました。そのため、他のファイル タイプの削除には使用できません。テキストファイルでさえありません。

いくつかの追加の変数を宣言する必要があります。

DECLARE @DeleteDate datetime = DATEADD(wk, -1, GETDATE())
DECLARE @FileExtension nvarchar(3) = N'BAK'
DECLARE @DeletePath nvarchar(512)

次に、このコードをカーソル ループに追加します。

SET @DeletePath = @path + @name
EXEC master.sys.xp_delete_file 0,@DeletePath,@FileExtension,@DeleteDate,1;

@DeleteDate は、ストアド プロシージャに特定の日付より古いファイルを削除するように指示するために使用します。DATEADD 関数を使用して締切日を設定するだけです。

@DeletePath は @path + @name になるため、'E:\DataBase Backups\MyDatabaseName' のような出力が得られます。

@FileExtention は、削除するファイルの種類を伝えるために使用されます。たとえば、BAK' または 'TRN' です。

これと同じコードを使用して、カスタム TSQL バックアップ ジョブで古いバックアップ ファイルを消去してきましたが、うまく機能します。

于 2012-11-13T23:15:40.830 に答える