您好,欢迎访问一九零五行业门户网

SQL Server下利用vbscript 实现数据库月备份自动清理并发邮件提

sql server下利用vbscript 实现数据库月备份自动清理并发邮件提醒 ---summary--- 这份文档其实主要是讲vbscript的文件处理和在vbscript 下如何发邮件。大至分为三个部分。 一.sql server 数据库备份 二.sql server 调用vbs对数据库备份文件夹进行扫描,清
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
lilo.zhu@gmail.com
lilo.zhu@ymail.com
lilo.zhu@qq.com
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 = lilo.zhu@ymail.com
     email.to = str_mail_address
     email.subject = database bakup data clear message
     email.htmlbody = hi dba:
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) = lilo.zhu@ymail.com
     .item(namespace&sendpassword) = 123456
     .update
     end with
     email.send
end function
---remark---
1.       vbs 中发邮件是使用cdo.message 这个对象。
2.       sql server 调用带参数的bat 批处理容易出问题,最好将参数都写在bat 文件内,sql server 只需调用这个bat 批处理文件就行了。
其它类似信息

推荐信息