原文:
備份數據庫存儲過程
建了表之后,在msdb或者AuditDB中創建這個存儲過程。一般不要在客戶數據中創建。
由于使用SSMS創建的維護計劃中,完整備份的話,會打斷別的備份的順序鏈,而由于管理原因,往往需要有幾套備份計劃,所以經過時間,本人編寫了一個存儲過程實現我的想法。不管你用不用,反正我用了。
首先,創建一個表,用于記錄備份信息。因為用DMV和系統視圖的話往往要編寫很多東西,對于一般人很難記住那么多表。所以使用一個表來記錄更加方便。以前之前已經創建了一個庫 AuditDB,用于監控數據庫的DDL操作,所以這里沒有再編寫建庫腳本。只是在這個庫里面創建一個表。
USE AuditDB GO IF OBJECT_ID('BackupHistory') IS NOT NULL DROP TABLE BackupHistory GO CREATE TABLE BackupHistory ( DatabaseName NVARCHAR(128),--數據庫名 CreateDate DATETIME,--創建時間 Compatibilitylevel TINYINT,--數據庫兼容級別 RecoveryModel CHAR(10),--恢復模式 BackupStartData DATETIME, --備份開始時間 BackupEndData DATETIME, --備份結束時間 BackupSpace NVARCHAR(128), --備份文件大小 Operator NVARCHAR(128),--執行操作者 Servername NVARCHAR(128), --服務器名稱 [FILENAME] NVARCHAR(256) --備份文件名 );
建了表之后,在msdb或者AuditDB中創建這個存儲過程。一般不要在客戶數據中創建。
/*
注意:由于用GUI備份會導致備份鏈中斷,而作業無法實現“僅復制備份”,所以使用腳本備份
create by huangzj 20120510
EXEC Backup_By_DBA 'auditdb','e:\新建文件夾\'
*/
ALTER PROC Backup_By_DBA
(
@dbname NVARCHAR(128),
@bakpath NVARCHAR(128)='E:\'
)
AS
--不備份系統表
IF @dbname IN ( 'master', 'msdb', 'model', 'tempdb' )
BEGIN
RETURN
END
ELSE
BEGIN
--定義備份時間,精確到秒
DECLARE @date NVARCHAR(64)
SELECT @date = SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 1, 4)
+ '_' + SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 6, 2)
+ '_' + SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 9, 2)
+ '_' + CONVERT(CHAR(2), DATEPART(hh, GETDATE()))
+ CONVERT(CHAR(2), DATEPART(mi, GETDATE()))
+ CONVERT(CHAR(2), DATEPART(ss, GETDATE()))
--定義要備份的數據庫名
DECLARE @db NVARCHAR(20)
SET @db = '' + '' +
@dbname + '' + ''
--定義備份文件的全名
DECLARE @bakname NVARCHAR(128)
SELECT @bakname = @db + '_' + @date
--定義備份存放路徑
DECLARE @disk NVARCHAR(256)
SELECT @disk = @bakpath + @bakname + '.bak'
--定義備份描述
DECLARE @name NVARCHAR(128)
SELECT @name = @db + '-完整 數據庫 備份'
--定義錯誤信息
DECLARE @error NVARCHAR(128)
SELECT @error = '驗證失敗。找不到數據庫“' + @db + '”的備份信息。'
BACKUP DATABASE @db TO DISK = @disk WITH COPY_ONLY, NOFORMAT, NOINIT,
NAME =@name, SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM ;
DECLARE @backupSetId AS INT
SELECT @backupSetId = position
FROM msdb..backupset
WHERE database_name = @db
AND backup_set_id = ( SELECT MAX(backup_set_id)
FROM msdb..backupset
WHERE database_name = @db
)
IF @backupSetId IS NULL
BEGIN
RAISERROR(@error, 16, 1)
END
RESTORE VERIFYONLY FROM DISK = @disk WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
INSERT INTO AuditDB.dbo.BackupHistory(DatabaseName,CreateDate,Compatibilitylevel,RecoveryModel,BackupStartData,BackupEndData,BackupSpace,Operator,Servername,[FILENAME])
SELECT a.[name] ,create_date,a.[compatibility_level] ,recovery_model_desc,S.backup_start_date,S.backup_finish_date,CONVERT(VARCHAR(20),CONVERT(DECIMAL(10,2),S.compressed_backup_size/(1024*1024)))+'MB',
S.[user_name],S.[server_name],physical_device_name
FROM sys.databases a INNER JOIN msdb.dbo.backupset S ON a.name=S.database_name Inner Join
msdb.dbo.backupmediafamily M ON S.media_set_id =M.media_set_id
WHERE a.name=db_name() AND physical_device_name=@disk
END
?備注:此處只是完整備份的例子,如果需要別的備份,那么要修改腳本。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
