快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

PowerShell事件和SQL Server还原

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

当您管理大量服务器时,一次只运行一个维护任务是没有意义的。PowerShell能够使用事件,因此非常适合例如一次在不同服务器上还原五十个数据库,并在每个数据库完成时得到通知。Laerte向您展示了如何在他的朋友的帮助下。

这一切始于一个灿烂的早晨,当时我的好朋友和PowerShell Jedi Ravikanth Chaganti(博客 | twitter)问我是否有PowerShell脚本来还原数据库。这听起来像一个非常简单的过程,所以我告诉他,他需要的内容可以通过SQLPSX的形式在CodePlex上找到。但是,事实证明,他面临的挑战并非如此简单,他详细阐述了自己的实际问题:

实际上,他实际上需要以异步模式还原50个数据库,并且发现Restore类具有事件后,想要使用这些事件在还原过程完成时触发消息。

现在,听起来很有趣!但是该怎么做呢?Helloooo PowerShell事件…

PowerShell事件

事件是PowerShell V2内置的功能,它使您能够响应许多对象支持的异步通知(如Windows PowerShell Blog所示)。但是,我的目标不是解释PowerShell Eventing功能是什么。我在这里演示如何使用该功能实现有效的现实世界解决方案。

当然,如果您想进一步了解PowerShell Eventing是什么,那么建议您阅读本文结尾处的链接。

在我们开始之前,我要解释一下,我修改乍得米勒(博客 | 叽叽喳喳)原调用-Sqlrestore函数中使用我们的目的完全还原事件(与乍得的慷慨授权,自然)。在本文的过程中,我将逐步向您展示如何获得最终的解决方案,您可以从本文底部下载完成的脚本。更改后的函数在PoshTest.Psm1模块内称为Invoke-SqlrestoreEventing,并带有其他SMO程序集,可将其直接导入PowerShell用户配置文件。

问题

我需要一种自动化且合理可扩展的方法来异步还原50个数据库,并在每个数据库完成时得到通知。

步骤1 –仅显示一条消息

我迈向Eldorado的第一步是在还原操作完成后仅显示“ Restore Completed”消息。如果我们查看还原类的MSDN信息,则会找到可用的事件,包括完成

1319-clip_image002.jpg

图1 – Restore类上的可用事件(单击放大)

所以我写了一些PowerShell来使用它:

并对其进行了测试以确保其有效:

1319-clip_image004.jpg

图2 –我们的初始脚本运行正常。(点击放大)

一切看起来都很好。因此,当我再次尝试还原并看到以下内容时,请想象一下我的惊讶:

1319-clip_image006.jpg

图3 –相同的简单消息脚本,但是出了点问题。(点击放大)

我意识到我已经在Register-ObjectEvent cmdlet 的SourceIdentifier参数中创建了CompleteRestore订阅服务器,因此我需要先注销它,然后才能再次运行该cmdlet:

第二步–在异步PowerShell作业中运行

在我的消息脚本运行平稳的情况下,我的第二个想法是“ 整洁,但如果不异步,那就没什么用了 ”。如果必须还原50个数据库,则不能以序列化的方式进行!所以我尝试了:

Aaand…那没用。为什么不?因为后台作业在不同的运行空间中运行,所以我们发送到控制台中输出的任何内容都不会显示。要解决此问题,我需要使用Receive-Job

奥斯卡奖颁给了……PowerShell!现在一切正常。

第三步-显示消息和数据库名称

我之前写的“ Restore Completed”消息很方便,但实际上在不知道已还原哪个数据库的情况下并没有那么有用。为了改善这一点,我添加了$ dbname元素:

1319-clip_image008.jpg

图4 –“ Restore Complete”消息,其中包含数据库名称。(点击放大)

现在,您应该像我以前一样认为,因为后台作业在不同的运行空间中运行,所以当我们将这两个脚本放在一起时,不会显示$ dbname。我们该如何解决?

从不畏惧!在这种情况下,我在Register-ObjectEvent上使用了-messagedata参数,并使用$ event.Messagedata获得了我们需要的值:

现在让我们运行函数:

…并观看魔术的发生:

  1319-clip_image010.jpg

图5 –异步数据库还原,其中每个数据库均带有“还原完成”消息。(点击放大)

扩展代码

我使用PowerShell的主要原因之一是因为它具有仅用几行脚本即可管理多个服务器的固有能力。也就是说,扩展我的代码相对容易。这样做也很好,因为尽管解决方案适合于一个测试用例,但它还没有准备好有效地处理50个数据库。

我要做的第一件事是将服务器名称添加到消息中,以便我确切知道每个阶段都在管理哪个数据库。为此,我再次使用了-messagedata,但是有一点不同:我将参数作为属性传递给PSObject并使用了$ Event.MessageData。<ProPertyName>

有了这些,让我们看看这段代码如何处理还原2个数据库的操作:

1319-clip_image012.jpg

图6 –管理2毫无问题地还原作业。(点击放大)

 多么酷啊?!

但是现在您在想,“ 好吧,Laerte,这很干净,但是我是否必须对要还原的所有服务器和数据库进行硬编码?”我的答案是,“ 否……我们为此使用XML文件。首先,我创建了一个具有以下结构的XML文件(restore.xml),并在其中填充了要还原的所有服务器和数据库:

现在,通过添加以下代码,我可以扩展最终脚本以运行Invoke-SQLRestoringEventing

只是为了证明它可行…

1319-clip_image014.jpg

图7 – PowerShell事件,这是多服务器管理的魔力。(点击放大)

一切都很好,但是后来我发现了一种更为优雅的方式来控制队列。第一步是将XML中的realocatefile标记更改为哈希表语法:

..然后将此代码添加到我的函数参数中:

在这种简单情况下,代码仅使用一个参数,但是我需要tp为我的函数使用更多参数。幸运的是,再次使用PSObject(自定义对象)可以轻松解决此问题:

正如你所看到的,我改变了XML使用调用,表达和转换的字符串realocatefiles标签到PowerShell的哈希表。接下来,我将-messagedata参数添加到  Register-ObjectEvent中(有关如何显示“ Restore Completed”消息的提示,这归功于Ravikanth。)

所以最后,使用方便的MSDN代码进行一些更改,脚本现在看起来像这样:

现在,我们可以完全控制作业队列,并且代码的缩放更加优雅:

1319-clip_image016.jpg

图8 –更优雅的PowerShell事件,仍然可以发挥多服务器管理的魔力。(点击放大)

更好的是,您仍然可以在同一会话中工作!

现在我只是炫耀

因此,现在该解决方案可以了,但是如果我们也想要Windows任务栏气球通知,而不只是控制台消息怎么办?好吧,首先,我们必须从Robertro Belo的博客(Sly PowerShell –气球提示通知)下载适当的模块(不建议使用链接),并将该模块也加载到您的PowerShell用户配置文件中。完成此操作后,在Invoke-SQLrestoring中需要进行一些更改:

完成此操作后,陶醉在Power(Shell)中……

你看到了吗?你能感觉到力量吗?如果您想查看完整的解决方案,请随时下载并查看。

收盘时

好的,我的朋友们,这是我第一次使用PowerShell Eventing做任何事情,现在我正为下一步的工作提出很多想法,希望您也是如此。我将通过解释PowerShell MVP和朋友Max Trinidad(博客 | twitter)来结束我的文章,后者还致力于一个非常酷的CodePlex项目:SQLDevTools – PowerShell SQL Server开发人员Toos)

快乐的PowerShelling!

学分

感谢所有帮助我的PowerShell Jedis,Jeffery Hicks(博客 | twitter),Marco Shaw(博客),Sean Kearney(博客 | twitter),尤其是Ravikanth(有助于完成此脚本),他们都为我指明了正确的方向。创建此过程。

特别感谢我的朋友和指导者Chad Miller(博客 | twitter),他在我的测试中允许使用他的invoke-sqlrestore函数。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638