企業內部系統使用 SQL Server 2000,需每日下班後自動備份數據庫,並通過郵件發送備份狀態(文件名、大小、耗時)給 DBA。
| 方案 | 原理 | 依賴 | 優缺點 |
|---|---|---|---|
| SQL Mail | 調用服務器 MAPI 子系統 | Outlook 完整版(非 Express),需保持打開 | 配置複雜、穩定性差、微軟已棄用 |
| CDONTS | 調用本機 IIS SMTP 服務 | IIS + SMTP 服務 | 僅支持本機 SMTP,Windows 2000/XP/2003 已棄用 |
| CDOSYS (推薦) | 調用 CDO.Message COM 組件,支持遠程 SMTP 認證 | Windows 2000+ 內置,無需額外安裝 | 支持遠程 SMTP(如 163、Gmail)、SSL/TLS、HTML 正文、附件,現代首選 |
CREATE PROCEDURE sys_sendmail
@To varchar(100),
@Bcc varchar(500),
@Subject varchar(400) = '',
@Body varchar(4000) = ''
AS
BEGIN
DECLARE @smtpserver varchar(50) = 'smtp.163.com'
DECLARE @smtpusername varchar(50) = 'yourname@163.com'
DECLARE @smtpuserpassword varchar(50) = 'yourpassword'
DECLARE @obj int, @hr int
EXEC @hr = sp_OACreate 'CDO.Message', @obj OUT
EXEC @hr = sp_OASetProperty @obj, 'Configuration.fields("https://schemas.microsoft.com/cdo/configuration/sendusing").Value', '2'
EXEC @hr = sp_OASetProperty @obj, 'Configuration.fields("https://schemas.microsoft.com/cdo/configuration/smtpserver").Value', @smtpserver
-- SMTP 認證
EXEC @hr = sp_OASetProperty @obj, 'Configuration.fields("https://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value', '1'
EXEC @hr = sp_OASetProperty @obj, 'Configuration.fields("https://schemas.microsoft.com/cdo/configuration/sendusername").Value', @smtpusername
EXEC @hr = sp_OASetProperty @obj, 'Configuration.fields("https://schemas.microsoft.com/cdo/configuration/sendpassword").Value', @smtpuserpassword
EXEC @hr = sp_OAMethod @obj, 'Configuration.Fields.Update', NULL
EXEC @hr = sp_OASetProperty @obj, 'To', @To
EXEC @hr = sp_OASetProperty @obj, 'Bcc', @Bcc
EXEC @hr = sp_OASetProperty @obj, 'From', @smtpusername
EXEC @hr = sp_OASetProperty @obj, 'Subject', @Subject
EXEC @hr = sp_OASetProperty @obj, 'TextBody', @Body
EXEC @hr = sp_OAMethod @obj, 'Send', NULL
IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @obj; PRINT 'failed'; RETURN @obj END
PRINT 'success'
EXEC @hr = sp_OADestroy @obj
END
DECLARE @dbname varchar(50) = 'dbtest'
DECLARE @filename nvarchar(100), @time datetime = GETDATE()
SET @filename = 'D:\DB_Backup\' + @dbname + REPLACE(REPLACE(REPLACE(CONVERT(varchar, @time, 120), '-', ''), ' ', ''), ':', '') + '.bak'
BACKUP DATABASE @dbname TO DISK = @filename WITH NOINIT, NOUNLOAD, NAME = N'Daily_Backup', NOSKIP, STATS = 10, NOFORMAT
-- 獲取最新備份文件大小(MB)
DECLARE @size int, @sizeM decimal(5,2)
SELECT TOP 1 @size = backup_size FROM msdb.dbo.backupset WHERE database_name = @dbname ORDER BY backup_start_date DESC
SET @sizeM = CAST(@size AS float) / 1024 / 1024
-- 構建郵件內容
DECLARE @content varchar(2000) = '數據庫自動備份成功。' + CHAR(13) + CHAR(10) +
'數據庫名:' + @dbname + CHAR(13) + CHAR(10) +
'備份文件:' + @filename + CHAR(13) + CHAR(10) +
'文件大小:' + CAST(@sizeM AS varchar) + ' MB' + CHAR(13) + CHAR(10) +
'備份時間:' + CONVERT(varchar, @time, 120) + CHAR(13) + CHAR(10) +
'此為系統自動發送,請勿直接回覆。'
-- 發送郵件
EXEC sys_sendmail 'dba@company.com', 'backup-log@company.com', '【每日】數據庫備份報告', @content
sys_sendmail 存儲過程。自動啟動類型)。sp_OA* 存儲過程需啟用 Ole Automation Procedures:EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;