用at命令和WSH脚本实现MSSQL Server数据库的智能异机备份

类别:编程语言 点击:0 评论:0 推荐:

 

随着烟草行业信息化建设的不断推进和深入,数据逐渐成为仅次于卷烟的行业第二大核心价值资源。但病毒入侵、黑客攻击、硬件损坏、恶意操作、自然灾害等各种不可预料的灾难性事件都有可能造成重要数据的丢失和损坏,从而导致历史资料无法检索,业务流程瘫痪,企业将因此而蒙受巨大的损失。因此,保护好数据资源是信息化建设的一项重要内容,它对充分发挥信息的支撑和带动作用有着较高的现实意义。数据的安全性保护涉及病毒防御、入侵检测与网络审计、数据备份、核心设备的定期安全性检测等等多方面内容,根据著名的“木桶”理论,其中某一个环节存在漏洞,将直接威胁数据的安全,本文就结合本单位的应用实际,仅从数据备份的角度对数据安全加以探讨,希望能达到抛砖引玉的效果。

数据备份可以说是防止数据丢失的第一道防线,它所要达到的目标很明确,就是在数据丢失或损坏的时候实现数据库的及时恢复,并尽可能保持数据恢复前后的最小化差异。当前数据备份的方法很多,但代价各不相同,效果各不相同,如利用磁盘柜的双机热备份、磁带库备份等等,仅管这些备份方法效果较好,但均是建立在较高代价的基础上,对数据日渐趋于地区集中的信息化发展背景下,这些方法对于县级公司而言,逐渐失去其本身的应用价值。本文介绍的备份方法是:利用MSSQL Server本身具有的自动和定期异机在线备份数据,通过一定的软件和备份策略实现在备份前使备份机自动启用网络,备份完成后备份机自动与网络逻辑隔离,既实现备份数据的安全性保护,又可以实现数据备份的较高实时性

一、该备份方法所具有的特点

l         备份策略灵活,人工干预少,可以实现备份数据与工作数据的较小化差异,体现了较高的实时性。

l         具有智能网络管理功能,执行备份作业前备份机与网络连接,保证作业的顺利完成,备份作业完成后备份机与网络自动隔离,对备份机起到了较高的防病毒、防入侵等效果,有效实现备份数据的保护。

l         备份机与机房物理位置分开,一定程度上实现异机、异地备份功能。

l         投资代价低,仅需准备一台高档PC机。

l         占用系统和网络资源少,不影响其它应用。

从备份特点分析,该方法比较适用于县(市)级公司。

二、备份的实现过程

下面将从环境要求、备份策略、备份机计划和测试四个方面介绍该方法的实现过程,在开始介绍之前,先介绍一下其中的两个主角:at命令和WSH脚本。在Windows 2000和XP中,可以使用at命令在指定的日期和时间运行命令、脚本或程序,具体的语法是:at  时间/日期  “执行程序”。如命令:at 5:59 /EVERY:M,T,W,Th,F,S,Su "g:\enlan.vbs",即在每周的星期一至星期日的5:59分系统自动调用执行g盘上的enlan.vbs脚本。需要注意的是在使用 at 命令时,要求系统的登录账号必须是本地 Administrators 组的成员,且计划任务服务也必须是开启的,可以通过控制面板->管理工具->服务-> Task Scheduler来查看该服务的运行与否。

另外一个主角是WSH脚本,WSH(Windows Scripting Host)是Windows 脚本宿主的缩写,是内嵌于 Windows 操作系统中的脚本语言工作环境,WSH支持的脚本程序和早期的Ms-Dos下的批处理命令有点相类似。WSH支持用VBScript或JScript编写的脚本,相关文件的后缀名也就是.vbs和.js。下文中用到的enlan.vbs和dislan.vbs两个脚本文件就是用Vbscript编写的,它们分别实现了对网卡的启用和禁用控制功能。

介绍完两个主角后,还有一个角色也是不能不提到的:xp_cmdshell,它是MSSQL Server里面一个非常有用的扩展存储过程,它以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出(关于xp_cmdshell的详细用法请参考MSSQL Server联机丛书)。

最后开始之前,再说一下实现的基本过程,以便您先有一个整体印象。首先,根据相应的备份策略在MSSQL Server数据库服务器上建立若干备份作业,同时安排和记录每个作业的执行时间,然后对备份作业作相应的修改,以达到备份作业完成后能使备份机自动断开网络。最后是根据数据库服务器的备份作业开始时间,用at命令制订备份机的网络启用计划,以保证备份作业运行前备份机网络的连通。

1、环境要求

首先要求一台性能较高、存储空间较大的PC机(所谓的备份机),可以根据备份的数据量来考虑。备份机要求Windows 2000和MSSQL Server 2000的系统环境,并安装完整的系统补丁包,加入有备份作业服务器的所在域,这样可以在权限和时间上减少一点麻烦,同时要在该备份机上专门建立一个共享目录并且将访问权限给予有备份作业的服务器。以上是一些主要的环境要求,另外机器的位置也可以考虑放置在机房以外较完全且方便管理的地方。

2、备份策略和计划修改

在作备份计划之前,通常都要考虑备份策略的问题,个人认为备份策略就是为了尽可能地减少意外情况导致的数据损失和被破坏,即使在数据被破坏的情况下也能将数据尽可能地还原到数据被破坏之前的状态,而制定的比较完善的应对策略。备份策略的制定应该与该企业的具体特点和数据库的活动状态相联系,比如说企业的数据库比较小,而且数据更新也不是很多,那么可以采用完全备份的方式来备份数据。如果是比较大的数据库,而且数据更新比较频繁的话,建议采用完全备份加日志备份的方式,即每天在一次完全备份的基础上,再根据业务或者数据的更新要求,按照一定的频率来备份日志,这样在一定程度上提高了备份数据的实时性和安全性。关于备份和还原模型这里不再赘述。

在确定了备份策略后,将通过具体的备份作业计划来体现。作为实例,下面我将在MSSQL Server里通过企业管理器建立一个备份作业,采用每天完整备份数据的方式,将epo数据库备份到备份机的共享目录(具体操作略)。建立后的备份作业如下图1所示:

下面我们将对该作业进行一定的修改,即在原作业的SQL命令行后添加一条语句,以达到数据的安全备份要求。这里将用到MSSQL Server里面的一个实用工具命令isql和上文介绍的扩展存储过程xp_cmdshell。先说明一下isql的作用,isql是用在命令行下输入 SQL 语句、存储过程或者脚本文件,并且使用 DB-Library 与MSSQL Server 2000 进行通讯的实用工具(具体语法请参考MSSQL Server 联机丛书)。添加的语句将通过isql以sa的身份登录到备份机上,然后通过xp_cmdshell在备份机上执行禁用网卡的脚本文件dislan.vbs(文章最后附有它的源代码),从而实现备份完成后使备份机断开网络连接的目的。

添加语句的内容语法如下所示:

exec master..xp_cmdshell 'isql /S"要登录的另一服务器名" /U"sa" /P"密码" /d"要登录的数据库名" /Q"要执行的SQL语句""'

继续前面的实例,先右键点击要修改的备份作业,属性菜单 -> 步骤选项卡 -> 修改按钮,将如下的内容加到原有的sql语句后面:

go

exec master..xp_cmdshell 'isql /S "10.46.48.49" /U "sa" /P "811027" /d "master" /Q "exec master..xp_cmdshell ''d:\bakup\dislan.vbs''"'

10.46.48.49是备份机的IP地址,dislan.vbs是一个放在10.46.48.49机器D盘bakup共享目录下可以禁用网卡的脚本文件。

修改后的作业内容如图2所示,图中蓝色选中的区域即是添加的语句内容。

最后一点要说明的是,如果有多个备份作业的话,备份作业的执行时间最好错开,以避免因为一个作业执行完成后,又没有作相应的网卡启用计划,从而导致其他备份作业无法完成的情况。

3、备份机At计划

在数据库服务器方面的工作已经基本完成了,下面是在备份机上的计划了。从上文可以知道,在服务器备份作业完成后,备份机的网卡即被禁用了,这时候也就不可能再从其他机器上对备份机进行任何的操作了。如果一个备份作业执行完后,后面还有备份作业要执行的话,这时我们该怎么作呢?当然不会让你手动去启用网卡,有at命令和wsh脚本会帮你搞定的。继续前面的例子来完成后面的工作,备份作业是在每天上午的9点开始的,第一天的作业执行完后,备份机的网卡就被禁用了,那么第二天这个备份作业该如何完成呢?可以这样考虑,即在备份作业开始前,如何能让网卡自动启用呢?如果你能想到计划任务的话,这个问题也就可以解决了。前面说了at命令可以设定一定的频率在某个时间运行特定的命令,这样的话正好可以和数据库备份作业的开始执行时间和频率对上号的,至于启用网卡的任务就交给enlan.vbs脚本程序了(文章最后附有它的源代码)。

在备份机的命令行状态下,输入一个在每周的每一天里,在8:59分的时候调用enlan.vbs文件,at命令的运行结果如下图3所示:

上图中有一点要说明一下,即启用网卡时有一分钟左右的延迟,所以要在作业开始执行的前一分钟左右启用网卡(或者同时启用交换机端口的portfast),同时要保证备份机和服务器上的时间是同步的。到这里,基本上实现了所有的过程,当然还要测试通过才行的。

4、运行和恢复测试

测试是为了验证以上所作的内容的正确性和可用性,测试的内容包括作业运行测试和数据库恢复测试。运行测试的内容为在服务器上启动备份作业,在启动作业之前要确认备份机的网络是连通的。作业完成之后要查看一下服务器上的日志记录和作业的运行记录,在确认作业顺利完成后再通过ping命令查看备份机的网络是否处于断开状态了。如果备份作业失败,可以根据日志提示的内容去查找原因,如果是禁用网卡没有起作用,也可以根据备份机的日志的去找出原因。这一步测试通过后,则可以通过修改备份机的时间来确认at计划任务能否在预定的时间使备份机的网路处于连通状态。上述测试都通过的话,可以确定你已经成功的实现了MSSQL Server数据库的安全备份了。后面的数据库恢复测试,和备份策略有一定的关系,它涉及到了备份和还原模型的问题。如果是完整备份,则在需要的时候直接还原就行了。如果是完全备份加定期日志备份,还可以有很大的灵活性,即可以根据日志的频率和需要将数据库还原到某个时间点上,如下图所示:

 

该方法在Windows 2000 和MSSQL Server 2000下测试通过并已经在应用中,由于水平有限,其中还有难免有不太完善的地方,希望大家多多指正,同时也希望在数据备份方面能给大家带来一点启示,以期有更多好的想法能应用到实际的工作中去。

附enlan.vbs和dislan.vbs的源代码:

1、enlan.vbs

'enable.vbs---enable network interface card

'usage: cscript /nologo enable.vbs

 

Const ssfCONTROLS = 3

 

sConnectionName = "本地连接"

 

sEnableVerb = "启用(&A)"

sDisableVerb = "禁用(&B)"

 

set shellApp = createobject("shell.application")

set oControlPanel = shellApp.Namespace(ssfCONTROLS)

 

set oNetConnections = nothing

for each folderitem in oControlPanel.items

    if folderitem.name  = "网络和拨号连接" then

        set oNetConnections = folderitem.getfolder: exit for

    end if

next

 

if oNetConnections is nothing then

    wscript.quit

end if

 

set oLanConnection = nothing

for each folderitem in oNetConnections.items

    if lcase(folderitem.name)  = lcase(sConnectionName) then

        set oLanConnection = folderitem: exit for

    end if

next

 

if oLanConnection is nothing then

    wscript.quit

end if

 

bEnabled = true

set oEnableVerb = nothing

set oDisableVerb = nothing

s = "Verbs: " & vbcrlf

for each verb in oLanConnection.verbs

    s = s & vbcrlf & verb.name

    if verb.name = sEnableVerb then

        set oEnableVerb = verb 

        bEnabled = false

    end if

    if verb.name = sDisableVerb then

        set oDisableVerb = verb 

    end if

next

 

if oEnableVerb is nothing then

    wscript.quit

end if

 

oEnableVerb.DoIt

 

wscript.sleep 1000

 

 

2、dislan.vbs

'disable.vbs---disable network interface card

'usage: cscript /nologo disable.vbs

 

Const ssfCONTROLS = 3

 

sConnectionName = "本地连接"

 

sEnableVerb = "启用(&A)"

sDisableVerb = "禁用(&B)"

 

set shellApp = createobject("shell.application")

set oControlPanel = shellApp.Namespace(ssfCONTROLS)

 

set oNetConnections = nothing

for each folderitem in oControlPanel.items

    if folderitem.name  = "网络和拨号连接" then

        set oNetConnections = folderitem.getfolder: exit for

    end if

next

 

if oNetConnections is nothing then

    wscript.quit

end if

 

set oLanConnection = nothing

for each folderitem in oNetConnections.items

    if lcase(folderitem.name)  = lcase(sConnectionName) then

        set oLanConnection = folderitem: exit for

    end if

next

 

if oLanConnection is nothing then

    wscript.quit

end if

 

bEnabled = true

set oEnableVerb = nothing

set oDisableVerb = nothing

s = "Verbs: " & vbcrlf

for each verb in oLanConnection.verbs

    s = s & vbcrlf & verb.name

    if verb.name = sEnableVerb then

        set oEnableVerb = verb 

        bEnabled = false

    end if

    if verb.name = sDisableVerb then

        set oDisableVerb = verb 

    end if

next

 

if oDisableVerb is nothing then

    wscript.quit

end if

 

oDisableVerb.DoIt

 

wscript.sleep 1000


_________________________________________________________

在此十分感谢CSDN论坛上的热心朋友提供的脚本代码和语法说明!

本文地址:http://com.8s8s.com/it/it25276.htm