SQL Server下利用vbscript 實現數據庫月備份自動清理併發郵件提醒
---Summary---
這份文檔其實主要是講vbscript的文件處理和在vbscript 下如何發郵件。大至分爲三個部分。
一.Sql Server 數據庫備份
二.Sql Server 調用vbs對數據庫備份文件夾進行掃描,清理以前舊的數據庫備份,只保留當前月的數據庫備份。
三.將清除的數據庫備份文件以附件的形式通知數據庫管理員。
---Detailes---
1. Sql Server 數據庫備份,以Job 的方式來實現,數據庫備份文件名以日期的格式命名。
Step Name: Bakup Training DB
Type: Transact-SQL Script(T-SQL)
Database: ASATTraining
Command:
declare @filename nvarchar(100)
set @filename='D:/TRSYS_DB_BAK/'+convert(char(10),getdate(),112)
print @filename
BACKUP DATABASE [ASATTraining] TO DISK = @filename WITH NOINIT , NOUNLOAD , NAME = N'ASATTraining', NOSKIP , STATS = 10, NOFORMAT
2. Sql Server 調用vbs實現清理上個月的備份文件,寫清理日誌,發郵件。
1).數據庫文件和清理日誌文件夾
2).清理數據庫日誌的程序文件夾,下面就分別講講這個文件夾內每個文件的具體用途。
i)Email 裏有一個Email_List.txt 的文件,它是記錄郵件接受者的用件地址。
每行顯示一個郵件地址,具體如下:
Email_List.txt
ii)Log 內是清除數據庫備文件時記錄的日誌文件,文件以 系統日期.log 形式命名。
iii) Backup_Clear.bat 文件是供Sql Server 在job 是調用的。
Step Name: Run Clear Last Month Backup Database Data
Type: Operation System (CmdExec)
Run as: SQL Agent Service Account
Command: D:/TRSYS_DB_BAK_CLEAR/Backup_Clear.bat
Backup_Clear.bat
d:
cd d:/TRSYS_DB_BAK_CLEAR
Backup_Clear.vbs D:/TRSYS_DB_BAK
iv) Backup_Clear.vbs 是實現在清除非本月數據庫備份文件,寫清除日誌,發送郵件的具體腳本程序,內容如下:
Backup_Clear.vbs
'------------------------------------------------------------
'DataBase Backup Data Clear
'Auto Clear Last Month Database Backup Data
'
'Create Date: 2009-09-29
'Author: Wei_Zhu
'Chage Log:
'Last Chage Date:
'-------------------------------------------------------------
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Dim ObjArgs
Set ObjArgs = Wscript.Arguments
set ws=createobject("wscript.shell")
If ObjArgs.Count > 0 then
'WSH.Echo "The Folder Name is: "& ObjArgs(0)
ShowFolderList(ObjArgs(0))
else
Wscript.Echo "Please Input The Full Folder Path..."
end if
Function ShowFolderList(ByVal lstg_folder_name)
Dim fso, f, f1, fc, s, folder
Dim l_count
l_count = 1
fso = CreateObject("Scripting.FileSystemObject")
folder = fso.getfolder(ws.currentdirectory)
f = fso.GetFolder(lstg_folder_name)
fc = f.files
For Each f1 In fc
Dim ldt, lf
ldt = int(mid(f1.name, 5, 2))
'msgbox Month(Now) &" || " & Month(ldt)
If Month(Now) > ldt Then
If right(lstg_folder_name, 1) <> "/" Then
lf=lstg_folder_name& "/" & f1.name
End If
DeleteFile(lf)
l_count = l_count + 1
End If
Next
If l_count > 0 Then
l_email_address = folder & "/Email/Email_List.txt"
SendEmail(l_email_address)
End If
End Function
Function DeleteFile(ByVal lstg_file_name)
Dim lstg_msg
fso = CreateObject("Scripting.FileSystemObject")
f = fso.GetFile(lstg_file_name)
f.Delete()
'msgbox(lstg_file_name & " delete file success !")
lstg_msg = Now & " Last Month Database Backup File: " & lstg_file_name & " Delete Success !"
WriteLog(lstg_msg)
End Function
Function WriteLog(ByVal lstg_log_msg)
Dim fso, f, LogFile, l_file_name, folder, l_email_address
dt=replace(date,"/","-")
fso = CreateObject("Scripting.FileSystemObject")
folder = fso.getfolder(ws.currentdirectory)
'---Check Log Folder Exists---
'If (Not fso.FolderExists(lstg_log_folder)) Then
' fso.CreateFolder(lstg_log_folder)
'End If
'if right(lstg_log_folder,1)<>"/" then
' lstg_log_folder=lstg_log_folder& "/"
'end if
l_file_name=folder& "/Log/" & dt & ".log"
'---Check Log File Exists---
If (fso.FileExists(l_file_name)) Then
f = fso.GetFile(l_file_name)
LogFile = f.OpenAsTextStream(ForAppending, TristateUseDefault)
LogFile.WriteLine(lstg_log_msg)
LogFile.Close()
Else
LogFile = fso.CreateTextFile(l_file_name, True)
LogFile.WriteLine(lstg_log_msg)
LogFile.Close()
End If
End Function
Function SendEmail(ByVal lstg_email_list)
dt=replace(date,"/","-")
Dim fso, Email_File, folder, str_mail_address, Attached_File
fso = CreateObject("Scripting.FileSystemObject")
'msgbox lstg_email_list
Email_File = fso.OpenTextFile(lstg_email_list, ForReading, False)
Do While Email_File.AtEndOfStream <> True
str_mail_address = str_mail_address & Email_File.ReadLine & ";"
Loop
Email_File.Close()
'msgbox str_mail_address
folder = fso.getfolder(ws.currentdirectory)
if fso.FileExists(folder& "/Log/" & dt & ".log") then
Attached_File=folder& "/Log/" & dt & ".log"
End If
'msgbox Attached_File
'---Send Emial---
NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
Set Email = CreateObject("CDO.Message")
Email.From = "[email protected]"
Email.To = str_mail_address
Email.Subject = "DataBase Bakup Data Clear Message"
Email.HTMLBody = "Hi DBA: <br> Clear Last Month Database Backup Data Complete,Please See Teh Attached File..."
if Attached_File <> "" then
Email.AddAttachment Attached_File
end if
With Email.Configuration.Fields
.Item(NameSpace&"sendusing") = 2
.Item(NameSpace&"smtpserver") = "smtp.mail.yahoo.com"
.Item(NameSpace&"smtpserverport") = 25
.Item(NameSpace&"smtpauthenticate") = 1
.Item(NameSpace&"sendusername") = "[email protected]"
.Item(NameSpace&"sendpassword") = "123456"
.Update
End With
Email.Send
End Function
---Remark---
1. vbs 中發郵件是使用CDO.Message 這個對象。
2. Sql Server 調用帶參數的bat 批處理容易出問題,最好將參數都寫在bat 文件內,Sql Server 只需調用這個bat 批處理文件就行了。