很久没更新博客了,估计再不来看看的话可能就会长满野草了。^ _ ^ 使用Linux的人都知道如果要备份一个目录和文件在Linux下实现是一件很简单的事,一两个语句组成的shell文件就能实现强大的备份功能(当然包括数据库的备份)。但在Windows下要实现这样的功能可不是一件容易的事。我所说的备份功能当然是指不借助收费软件的基础下实现全自动的备份。包括备份文件保存的天数;备份成功的状态通知等;如果安全等级比较高还需要实现将状态写入日志文件。
在开始前先交待一下要求:共有三台服务器上的数据需要备份;备份成功与否需通过邮件的方式通知用户,备份的数据要求除了在本机保存一份外还需保存一份到网络硬盘上,本例中的网络硬盘为192.168.42.6。
一台机器是win2003中文企业版+MS SQL2000企业版的数据库;其中只需要备份由SQL任务备份下来的文件,要求保存最近7天的备份数据。
第二台机器是win2000中文企业版+MSDE数据库;需备份数据库。要求保存最近7天的数据。(如果你有所了解MS的产品,就会明白MSDE是微软的一款免费的面向桌面的数据库,功能有限,本身不提供数据库的备份功能)所以这些功能需要我们以命令的方式来完成,估计难点的地方也是在这里。
第三台机器是win2000中文企业版;需备份一个文件夹。也是要求备分最近7天的数据。这里使用windows系统自带的ntbackup.exe来进行备份操作。
以上是要求,但是俗话说“巧妇难为无米之炊”,仅靠微软的这些工具是很难实现这样的功能的,所以需要借助一些外来的工具。它们是:
1:blat.exe(主要用来发送邮件提醒)
2:forfiles.exe(winxp/win2003版,系统自带)
3:forfiles.exe (win2000版,需下载)
要实现的效果图如下:
这一张是第一台机器要实现的结果图。
这一张则是第二台机器的结果图。
下面以第二台机的备份为蓝本来介绍怎样实现功能。我只是说明一下我认为比较重要的地方,如果你对这里的语句有疑问请补习一下windows下的命令的用法。当然,如果你的环境中是用磁带来备份,可以参考以下的文章。
1. How do I perform an NTBackup in Windows 2000, without having to manually manage the media? (Tip # 2265)
[url]http://www.jsiinc.com/sube/tip2200/rh2265.htm[/url]
2. How can my scheduled Ntbackup react to my failure to insert a tape in the tape drive? (Tip # 5955)
[url]http://www.jsiinc.com/SUBL/tip5900/rh5955.htm[/url]
3. Freeware command-line SMTP mailer (Tip# 4721 )
[url]http://www.jsiinc.com/subj/tip4700/rh4721.htm[/url]
4. Windows 2000 NTBackup command line switches (Tip# 2148 )
[url]http://www.jsiinc.com/sube/tip2100/rh2148.htm[/url]
5. What media do I have in my tape library? (Tip# 4540)
[url]http://www.jsiinc.com/SUBJ/tip4500/rh4540.htm[/url]
@echo off
if exist z: net use z: /delete
#如果存在已映射的网络盘则删除它
net use z: \\192.168.42.6\exbak pass83 /user:xon\administrator
#映射网络盘,其中\\192.168.42.6\exbak是网络路径;pass83是密码,xon\administrator是用户名(如果是域环境需要带域名,工作组则需加主机名)
if exist backup.log del backup.log
ipconfig backup.log
C:\BackupScript\blat.exe -install 192.168.42.15 [email][email protected][/email]
#初始化邮件提醒服务,其中192.168.42.15是内部邮件服务器,也可以使用外部,方法类似
if not exist z: (goto Fail) else (goto ok)
:Fail
echo %date%:%time%Backup of UF DataBase of Day Fail backup.log
#将备份时间记入日志文件
echo Network services is not unaccess backup.log
C:\BackupScript\blat.exe C:\BackupScript\backup.log -to [email][email protected][/email] -s "Day Backup Fail" -u [email][email protected][/email] -pw password
#将backup.log文件发给[email][email protected][/email]用户,主题是"Day Backup Fail",如果邮件服务器SMTP需要验证则加-u 用户名 -pw 密码 这些参数做验证,否则无需这两个参数。
goto end
:OK
if exist C:\BackupScript\BackupUF_Day.sql del C:\BackupScript\BackupUf_Day.sql
#建立SQL备份文件,因为MSDE不能自动备份
echo use master; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo Backup database UFDATA_002_2008 C:\BackupScript\BackupUf_Day.sql
#备份数据库UFDATA_002_2008
echo to disk='d:\backup\UFDATA_002_2008_%date:~4,4%%date:~9,2%%date:~12,2%.bak' C:\BackupScript\BackupUf_Day.sql
#设定数据库备份路径的保存路径。其中%date:~4,4%%date:~9,2%%date:~12,2%这个参数是取当天的日期,win2000和winxp两者格式不完全相同。它的意思是从data命令显示出来的数据中从第四位取起连续取四位数据做为第一部份,后面的意思相同。
echo with init,nounload; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo use master; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo Backup database UFDATA_105_2008 C:\BackupScript\BackupUf_Day.sql
echo to disk='d:\backup\UFDATA_105_2008_%date:~4,4%%date:~9,2%%date:~12,2%.bak' C:\BackupScript\BackupUf_Day.sql
echo with init,nounload; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo use master; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo Backup database UFDATA_110_2008 C:\BackupScript\BackupUf_Day.sql
echo to disk='d:\backup\UFDATA_110_2008_%date:~4,4%%date:~9,2%%date:~12,2%.bak' C:\BackupScript\BackupUf_Day.sql
echo with init,nounload; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo use master; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
echo Backup database UFDATA_306_2008 C:\BackupScript\BackupUf_Day.sql
echo to disk='d:\backup\UFDATA_306_2008_%date:~4,4%%date:~9,2%%date:~12,2%.bak' C:\BackupScript\BackupUf_Day.sql
echo with init,nounload; C:\BackupScript\BackupUf_Day.sql
echo go C:\BackupScript\BackupUf_Day.sql
#有关SQL的备份语句的使用方法可以参考:
[url]http://msdn.microsoft.com/en-us/library/ms186865.aspx[/url]
echo Backup DataBase backup.log
echo Waitting..... backup.log
"C:\PROGRA~1\Microsoft SQL Server\80\Tools\Binn\OSQL.exe" -S localhost -U sa -P -i C:\BackupScript\BackupUf_Day.sql -o C:\BackupScript\UF_%date:~4,4%%date:~9,2%%date:~12,2%.log
#调用MSDE安装路径下的命令来实现备份操作,注意参数的大小写。输出备份的状态到log文件中。
if not exist z:\UF mkdir z:\UF
echo %date%:%time%Backup of UFserver DataBase backup.log
echo Waiting...... backup.log
set /a Days=%date:~4,4%%date:~9,2%%date:~12,2%
#使用/a参数可以实现对日期数据的运算
C:\BackupScript\forfiles_20.exe -pd:\backup\ -d-0 -mUF*_2008_%days%.bak -c"cmd /c copy @FILE z:\UF\"
#forfiles_20.exe表示是win2000下版本,它使用的要求比在winxp/win2003下严格,而且两个版本的文件不能通用;还需注意参数的大小写及间隔。该语句的意思是如果d:\backup\下有今天的UF*_2008_%days%.bak文件则copy到z:\UF\。
C:\BackupScript\forfiles_20.exe -pd:\backup\ -d-7 -mUF*_2008_*.bak -c"cmd /c del @FILE"
#删除d:\backup\下超过7天的文件
C:\BackupScript\forfiles_20.exe -pz:\UF\ -d-7 -mUF*_2008_*.bak -c"cmd /c del @FILE"
#删除网络上超过7天的文件
if not exist z:\uf\UF*%days%.bak goto Fail
echo %date%:%time%Day Backup of UF DataBase Sucess backup.log
C:\BackupScript\blat.exe C:\BackupScript\backup.log -to [email][email protected][/email] -s "Day Backup UF Sucess" -u [email][email protected][/email] -pw P@$$w0rd -attacht C:\BackupScript\UF_%date:~4,4%%date:~9,2%%date:~12,2%.log
#发送状态文件,并将C:\BackupScript\UF_%date:~4,4%%date:~9,2%%date:~12,2%.log作为附件发送。
:end
del backup.log
net use z: /delete
del C:\BackupScript\BackupUf_Day.sql
del C:\BackupScript\UF_%date:~4,4%%date:~9,2%%date:~12,2%.log
上述的文件说明了自动备份数据库的方法,当然没有考虑到更复杂的应用,但是基本上可以使用并完成操作了。如果不需要备份数据库则只需把其中有关数据库SQL语句部份去掉就可以了。还有一点没有说到的就是在命令方式下利用ntbackup.exe进行自动备份。其实参考微软的说明文件就可以写出备份语句了。下面这我第三台机器使用的备份语句:
ntbackup backup C:\Teleph~1 \ /j "Backup of PhoneCost DataBase" /f "d:\backup\Phone%days%.bkf" /m normal
如果看不懂的话去读下这篇文章:
[url]http://support.microsoft.com/kb/300439/zh-cn[/url]。
其实熟悉了windows下的命令,也可以用它来完成一些比较复杂的应用。不是吗?