先说说背景吧。
目前我们公司的数据库是租用了云服务器去,但是基于并发用户数较多,会影响数据库性能的原因,不太允许我们从云端(假定为:Cloud Server)来查询数据。也就是说,我们需要从云端把数据库复制到本地来使用。
于是,公司设置了定时备份的功能。bak文件当然只是存在Cloud Server的。所以我还需要将bak数据复制到备份服务器(假定为Backup Sever),由于bak是完整备份,往往是19G左右,为此不得不进行压缩处理(压缩后约2.3G左右,压缩率为12%)。压缩为一个2G的文件,在两个服务器之间传输,仍然可能存在通讯中断的问题,所以,使用分卷压缩会好一些。于是问题来了:
那么什么时候压缩呢?上班时当然不能压缩了,因为一旦压缩,Cloud Sever的CPU会立马飙到95%以上,通常是100%,客户端严重受影响,虽然只有十来分钟。所以只能等到下班了。下班后,大多数人(包括我在内)应该不太喜欢再去捣鼓工作相关的事情。
所以,写一个脚本,开启任务计划是最佳的选择。于是就有了以下内容:
Dim fso, fl,y,m,d,ymd,ws
Set fso = CreateObject("scripting.filesystemobject")
y=Year(Date())
m=month(date())
d=day(date())
'获取日期格式
ymd= y&"_"&m&"_"&d
'分卷压缩,每卷100M。
on error resume next
Set ws=CreateObject("wscript.shell")
For Each fl In fso.GetFolder("D:\db_backup\").Files
If instr(1,fl.Name,ymd)>0 Then
ws.run """C:\Program Files (x86)\WinRAR\WinRAR.exe"" a -
v1000000[k] -df""D:\db_backup\" & Left(fl.Name, Len(fl.Name) - 4) & ".rar"
& """ """ & fl.path & """"
End If
Next
'退出脚本
Wscript.Quit
当然,这还没完的。最后的步骤是用LeapFTP将Backup Server的数据的数据Download到本地服务器(Local Sever),然后解压,还原数据库,这才算是完成数据库更新的操作。
现在再来看看VBA跟VBScript的区别。
- VBScript可以说是没有变量类型,所以Dim xx As Long之类就会出错,正确的写法是:Dim xx。
- VBScript没有Format函数,转换类型时除了C开头的那部分【例如CDate、Clng等】,几乎没有别的写法了。所以像上面的本来用Format很容易解决的问题,只能定义三个变量才能把年月日合并在一起。
- 估计你可能已经留意到了,VBScript没有Like函数。关于通配符怎么办呢?——目前我是用Instr来处理的。当然正则表达式也是可以的,不过如果不熟悉的话,估计调试也要花那么一点点时间。
- 还记得VBA里的全能打手Shell函数么?似乎只要有那个应用程序,Shell就能激活并使用它。VBScript呢?对不起,不能直接Shell。里面不是有WSHShell吗?是的。你很细心……我开始也是这么以为的,用:WSHShell "应用程序 参数……"来完成操作的。但是,我错了……所以正确的做法是,先创建一个WSHShell,然后再用这个WSHShell去run应用程序。详细请参考上面的代码。