蛙蛙推荐:利用WMI脚本批量恢复sqlSERVER数据库
问题提出
蛙蛙求助:以编程的方式还原sqlserver数据库问题
我有一个目录下面都是sqlserver的数据库备份文件,比如a.bak,b.bak,c.bak等,有没有办法一下把他们都还原到本地sqlSERVER数据库里面呀,过程是自动建立a,b,c这样的数据库,然后把a.bak恢复到a,b.bak恢复到b,依次类推,因为备份文件的原路径和新库的路径不一样,所以要有一些额外处理,谁能解决一下,因为这个目录下有几十个库的备份文件呢,现在我的机器新安装了一个sqlSERVER,要把他们全部恢复,当时没有分离库,所以不能直接附加.
设计方案
可以利用WMI脚本扫描存放数据库备份文件的目录,然后按照一定的规则生成一个恢复数据库的T-sql脚本文件,然后用脚本执行osql程序来执行这个脚本完成数据库恢复,这里没有使用过多的错误处理和事务的代码,因此要人为的确定数据库恢复的T-sql语句尽量不要引发异常。
解决方案
一、我们先来看一下恢复数据库的T-sql命令,以便理解后面通过脚本来创建T-sql的原理
USE master
GO
-- 如果要创建的数据库已经存在,那么删除它
IF EXISTS ( SELECT name FROM master.dbo.sysdatabases WHERE name = N ' article ' )
DROP DATABASE [ article ]
GO
-- 创建一个新数据库,要指定新建数据库的数据文件和日志文件的名称和位置,初始化大小
-- 增长幅度,最大值等内容
CREATE DATABASE article
ON
( name = N ' article_dat ' ,
filename = N ' d:\sql2000\MSsql\data\article_Data.MDF ' ,
SIZE = 1 ,
MAXSIZE = 50 ,
fileGROWTH = 5 )
LOG ON
( name = N ' article_log ' ,
filename = N ' d:\sql2000\MSsql\data\article_Log.LDF ' ,
SIZE = 1MB,
MAXSIZE = 25MB,
fileGROWTH = 5MB )
GO
-- 把指定的数据库备份文件恢复到刚刚建立的数据库里,这里要指定数据库备份文件的位置
-- 以及要恢复到的数据库,因为备份文件来自未知的机器,备份的时候原数据库和新数据库
-- 的数据文件和日志文件的位置不匹配,所以要用with move指令来完成强制文件移动,如果
-- 是通过管理器备份的数据库文件,数据库文件和日志文件名分别是数据库名跟上"_Data"或
-- "_Log",这是一个假设哦,如果不是这样,脚本有可能会出错
RESTORE DATABASE [ article ]
FROM disK = ' E:\windowdatabase\article.bak '
WITH
MOVE ' article_Data ' TO ' d:\sql2000\MSsql\data\article_Data.MDF ' ,
MOVE ' article_Log ' TO ' d:\sql2000\MSsql\data\article_Log.LDF '
GO
从中可以看到
T-sql的强大。
二、利用WMI脚本生成t-sql脚本并且调用osql程序执行它
restore.vbs
Const ForAppending = 8 ' 指定新建的文件可以写入,因为不能使用枚举,所以用常量定义
Const baksqlfile = " c:\restore.sql " ' 指定要生成sql脚本文件的路径
' 利用FSO创建一个文本文件
Set objFSO = CreateObject ( " Scripting.fileSystemObject " )
Set objTextfile = objFSO.OpenTextfile _
(baksqlfile,ForAppending, True )
' 指定要创建新数据库的数据和日志保存的目录
Const NEWDATAPATH = " d:\sql2000\MSsql\data\"
' 创建一个WMI对象
strComputer = " ."
Set objWMIService = Getobject ( " winmgmts: " _
& " {impersonationLevel=impersonate}!\ " & strComputer & " \root\cimv2 " )
' 获取指定目录的文件列表,关于更多的WMI对象的 *** 作方说明请查看MSDN
' 这里没有检查文件是否是数据库备份文件的逻辑,请自行保证
Set fileList = objWMIService.Execquery _
( " ASSOCIATORS OF {Win32_Directory.name='E:\windowdatabase'} Where " _
& " ResultClass = CIM_Datafile " )
' 遍历文件列表,构建t-sql脚本的文本
For Each objfile In fileList
If objfile.Extension = " bak " Then
strbakname = objfile.Drive & objfile.Path & _
objfile.filename & " . " & objfile.Extension
Wscript.Echo strbakname
with objTextfile
.Writeline( " USE master " )
.Writeline( " GO " )
.Writeline( " IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N' " & objfile.filename & " ') " )
.Writeline(vbtab & " DROP DATABASE [ " & objfile.filename & " ] " )
.Writeline( " GO " )
.Writeline()
.Writeline( " CREATE DATABASE " & objfile.filename & "" )
.Writeline( " ON " )
.Writeline( " ( name = N' " & objfile.filename & " _dat', " )
.Writeline(vbtab & " filename = N' " & NEWDATAPATH & objfile.filename & " _Data.MDF', " )
.Writeline(vbtab & " SIZE = 1, " )
.Writeline(vbtab & " MAXSIZE = 50, " )
.Writeline(vbtab & " fileGROWTH = 5 ) " )
.Writeline( " LOG ON " )
.Writeline( " ( name = N' " & objfile.filename & " _log', " )
.Writeline(vbtab & " filename = N' " & NEWDATAPATH & objfile.filename & objfile.filename & " _Log.LDF', " )
.Writeline(vbtab & " SIZE = 1MB, " )
.Writeline(vbtab & " MAXSIZE = 25MB, " )
.Writeline(vbtab & " fileGROWTH = 5MB ) " )
.Writeline( " GO " )
.Writeline()
.Writeline( " RESTORE DATABASE [ " & objfile.filename & " ] " )
.Writeline(vbtab & " FROM disK = ' " & strbakname & " ' " )
.Writeline( " WITH " )
.Writeline(vbtab & " MOVE ' " & objfile.filename & " _Data' TO ' " & NEWDATAPATH & objfile.filename & objfile.filename & " _Data.MDF', " )
.Writeline(vbtab & " MOVE ' " & objfile.filename & " _Log' TO ' " & NEWDATAPATH & objfile.filename & objfile.filename & " _Log.LDF' " )
.Writeline( " GO " )
.Writeline()
End with
End If
Next
objTextfile.Close ' 关闭文本流
' 创建shell对象用来调用osql程序
Set obJshell = CreateObject ( " WScript.Shell " )
obJshell.Run " %COMSPEC% /k osql -E -i " & baksqlfile
关于wsh调用命令行程序请参考以下链接
http://www.microsoft.com/china/technet/columns/scripts/sg1002.asp
三、执行脚本
在CMD命令下输入Cscript restore.vbs回车后会看到下图
然后就会出现调用Osql的窗口,如图
小结:好多情况下,脚本还是很有用的,像这次遇到这个问题,完全没有必要用.NET写一个工具来完成,用脚本,方便快捷,用了就扔,开发也方便,而且能解决问题,像好多处理excel,导入远程HTML代码等都可以用脚本来做的。偶经常用的是VBS和Js,perl,python什么的都不会。
总结以上是内存溢出为你收集整理的蛙蛙推荐:利用WMI脚本批量恢复SQLSERVER数据库全部内容,希望文章能够帮你解决蛙蛙推荐:利用WMI脚本批量恢复SQLSERVER数据库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)