今年看了看我维护的SQLServer系统,发现还有存在一些风险。
目前两块硬盘,一块是数据库盘,一块是操作系统盘。
问题是,每日全备份也在操作系统所在的硬盘上。
看明白后,着实吓我了一跳。
这样的风险在于,不论是数据库所在的盘还是数据库备份文件所在的盘,都是在运行中的硬盘。
硬盘运行,和不运行,使用和不使用,安全性相差是非常大的。
所以,我立即行动,着手写一个脚本,把备份目录下的.bak文件,拷到别的机器上去。
需求:
1。 每天自动运行:用任务调度器就OK了。
2。 只需要最新的一个备份文件拷走。
3。 不要使用Sqlserver的备份任务,因为每天它已经做了一个.bak文件。目录我没有找到,sqlserver可以自己备份后,把.bak文件也放到其它地方一个拷贝的功能。
所以,只能自己写个脚本如下:
1。 作业脚本:
dir %1\%2 /b /o-d > File1.txt type file1.txt find /n /v "" File1.txt > File2.txt type file2.txt set newset="set Latest="%1\ change File2.txt "[1]" %newset% > nul type File2.txt | find "set" > Latest.bat type latest.bat call Latest.bat echo Latest=%Latest% set Latest1="%Latest%" NET USE Y: /DELETE /Y NET USE Y: \\desc_host\DBbak echo will copy %Latest1% to %3 copy %Latest1% %3 del File?.txt del Latest.bat
cpbak <目录> <过滤条件> <目标目录>
例如:
cpbak ee *.zip E:\Temp\target
讲解:
dir %1\%2 /b /o-d > File1.txt ;; 把当前目录下的所有的文件输出到file1.txt中
type file1.txt ;;把file1.的内容打印出来,目的是将来写入日志。
find /n /v "" File1.txt > File2.txt ;;给所有的行打上序号。
type file2.txt ;;列出file的内容
set newset="set Latest="%1\ 设置变量,注意要把目录加上
change File2.txt "[1]" %newset% > nul
type File2.txt | find "set" > Latest.bat
type latest.bat
call Latest.bat
echo Latest=%Latest%
set Latest1="%Latest%" ;;文件名加上双引号
echo will copy %Latest1% to %3 ;;
copy %Latest1% %3 ;;拷贝
del File?.txt
del Latest.bat
=======================================================
差点忘记,上面脚本中,用到一个命令:
change.
这个命令,最后我自己写了一个,因为网上没有change.com,现在变成卖女性的胸罩和丁字库。
只能自己写一个:
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace change { class Program { static void Main(string[] args) { if (args.Length < 3) { Console.Out.WriteLine("args.Length < 3"); return; } String strFileName = args[0]; if (!File.Exists(strFileName)) { Console.Out.WriteLine("does not find:{0}" , strFileName); return; } string findStr= args[1]; string ReplaceStr= args[2]; string strWrite; //定义文件信息对象 FileInfo finfo = new FileInfo(strFileName); using (System.IO.StreamReader rd = finfo.OpenText()) { //根据上面创建的文件流创建写数据流 string allstr = rd.ReadToEnd(); strWrite=allstr.Replace(findStr,ReplaceStr); } finfo.Delete(); using (FileStream fs = finfo.OpenWrite()) { //根据上面创建的文件流创建写数据流 StreamWriter w = new StreamWriter(fs); //设置写数据流的起始位置为文件流的末尾 w.BaseStream.Seek(0, SeekOrigin.Begin); //写入“Log Entry : ” w.Write(strWrite); w.Flush(); w.Close(); } } } }
在win2008 server 中,任务所在位置:
change 的代码在这里:里面有代码和编译好的exe
change