sql server 批量備份數據庫及刪除N天前的備份數據


     很多時候,我們都需要將數據庫進行備份,當服務器上數據庫較多時,不可能一個數據庫創建一個定時任務進行備份,這時,就需要進行批量的數據庫備份操作,好了,廢話不多說,具體實現語句如下:

--開啟文件夾權限
GO
SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE
GO
SP_CONFIGURE 'XP_CMDSHELL',1
RECONFIGURE
GO

DECLARE
      @FileName VARCHAR(200),
      @CurrentTime VARCHAR(50),
      @DBName VARCHAR(100),
      @SQL VARCHAR(1000),
	  @FilePath VARCHAR(100)

--SET @CurrentTime = CONVERT(CHAR(8),GETDATE(),112) + CAST(DATEPART(hh, GETDATE()) AS VARCHAR) + CAST(DATEPART(mi, GETDATE()) AS VARCHAR)
--年月日
SET @CurrentTime = CONVERT(CHAR(8),GETDATE(),112)


SET @FilePath = 'F:\DB_Daily_backup\' + @CurrentTime + '\'
--select CONVERT(CHAR(8),GETDATE(),112)
--文件夾不存在,則創建
declare @TEMP TABLE(A INT,B INT,C INT)--建立虛擬表,用來判斷文件夾是否存在
INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @FilePath
IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1)
BEGIN
	--XP_CMDSHELL不允許使用變量拼接,所以使用exec方法
	declare @EX NVARCHAR(255)
	SET @EX = 'EXEC XP_CMDSHELL ''MKDIR ' + @FilePath + '''';
	EXEC(@EX)
END


--獲取所有非系統數據庫
DECLARE CurDBName CURSOR FOR 
    SELECT NAME FROM Master..SysDatabases where dbid>4

--循環備份數據庫
OPEN CurDBName
FETCH NEXT FROM CurDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
    --Execute Backup
    SET @FileName = @FilePath + @DBName + '_' + @CurrentTime
    SET @SQL = 'BACKUP DATABASE ['+ @DBName +'] TO DISK = ''' + @FileName + '.bak' +
     ''' WITH NOINIT, NOUNLOAD, NAME = N''' + @DBName + '_backup'', NOSKIP, STATS = 10, NOFORMAT'
    EXEC(@SQL)

    --Get Next DataBase
    FETCH NEXT FROM CurDBName INTO @DBName
END

CLOSE CurDBName
DEALLOCATE CurDBName

  在SQL代理中,建立定時作業,按指定時間定時執行該腳本即可。

更多時候,我們可能需要對備份的文件做一個定時清理,例如清理1年前的文件,以下示例,清楚30天前備份文件夾:(目錄:F:\DB_Daily_backup下30天前文件,-30代表30天前,/ s q表示無提示刪除,下面有參數說明)

這里我是刪除文件夾,所以使用的是rd命令:del用來刪除文件;rd用來刪除文件夾

--開啟文件夾權限
GO
SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE
GO
SP_CONFIGURE 'XP_CMDSHELL',1
RECONFIGURE
GO
EXEC xp_cmdshell 'forfiles /p F:\DB_Daily_backup\ /m * -d -30 /c "cmd /c rd /s /q @path"'
附:forfiles基本語法介紹
命令
FORFILES [/P pathname] [/M searchmask] [/S]
         [/C command] [/D [+ | -] {yyyy-MM-dd | dd}]
 
方法1:
描述:可以刪除7天以前的后綴名為log的日志文件。如今天是6.29,那么會刪除6.22
號以前創建的文件。不會刪除到回收站。
指定路徑為要刪除的文件夾路徑,該批處理可以放在任意文件夾下。
forfiles /p D:\aizzw\LOG /m *.log -d -7 /c "cmd /c del /f @path"
參數解釋:
這里的/p 指的是要刪除的備份文件路徑
        /m 指的是要匹配的字符,通配符為*號,后綴名可以根據實際情況修改。
如zzw*.log;*.bak;*.txt
-d 指的是日期,“-d -7”指的是從但前日期當前日期往前減7天。
/c 指的是執行命令
@path 返回文件完整路徑
方法2:
描述:可以刪除7天以前的后綴名為log的日志文件。
不需要指定路徑,必須放在要刪除日志的文件下。刪除當前文件夾下的匹配文件。
forfiles /m *.log -d -7 /c "cmd /c del /f @path"
引自:https://www.cnblogs.com/wcLT/p/4761236.html

附:del命令參數說明
/F            強制刪除只讀文件。 
/S            從所有子目錄刪除指定文件。 
/Q            安靜模式。刪除全局通配符時,不要求確認。 
/A            根據屬性選擇要刪除的文件。 

RMDIR [/S] [/Q] [drive:]path 
RD [/S] [/Q] [drive:]path 
/S 除目錄本身外,還將刪除指定目錄下的所有文件。用於刪除目錄樹。 
/Q 安靜模式,帶 /S 刪除目錄樹時不要求確認

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM