今年看了看我维护的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