追过笔者前面系列的文章都知道,越到后面,越是高潮,本篇给大家带来PowerShell和微软系产品的交互,自动化日常工作的必备神器,尽在PowerShell上。
在DOS命令和CMD命令中,都是一条命令执行一个过程,是面向过程的调用方式,而PowerShell之所以敢称作Power,就是其比一般地Shell不同之处是,其可以调用整个dotNET的类型库,可以用面向对象的方式去访问和执行复杂的对象模型如Sqlserver的SMO、AMO模型和各种COM模型如OFFICE对象模型等。
所以PowerShell之所以Power,真是没夸大成份,实在是很Power。
在之前推荐过的两本书中,有一本就是专门讲使用PowerShell做Sqlserver的自动化运维操作。里面全书都是很实用的实例,很有现实的使用场景。
在实现自动化过程的前提,需要对本身Sqlserver的功能有足够熟悉才能发挥其作用,就如使用OFFICE软件一样,如果对OFFICE软件的自身的功能、界面的操作都不熟悉,其实使用VBA来自动化,也产生不了多少价值。
无论是系统开发人员还是数据分析工作者,其实对数据库的知识都是比较有限的,没法像专业数据库运维人员那样熟悉各种数据库的运维、防灾等操作。
不专业时,虽说一般不会出现什么灾难性的问题,但日常一些失误引起的小范围的损失是在所难免的。
例如笔者之前经常吃亏在写Sql视图、存储过程时,当某些时候需要修正一下逻辑,就容易没太在意,在原来基础上直接通过Alter语句来改写,有时不小心,逻辑改错了,又已经执行了Alter命令,最终之前写过的逻辑就被覆盖了。
然后就只能自己擦干眼泪重新来一遍,有时几天的活就这样没有了,甚至修改太久远的逻辑时,都不记得怎样还原回以前的逻辑。
日常做的一些备份,一般来说是指备份整个数据库,如果为了一个小步骤的错误,而动用大运作去还原数据库,这个过程也是不少的工作量,也不确定生产环境是否允许我们动不动就停机来还原数据库(说实话,自己也没在生产环境下还原过数据库,只是一些测试库自己练习玩玩而已,真心不是专业DBA)。
从上面的场景来说,其实我们想要的一个效果更多地是还原元数据即可,如果有备份好元数据,我们重新从元数据里找过去写过的视图、存储过程,然后拿过来重新还原,成本更低。
关键点在于:如何方便地备份元数据,更精确地说自动化备份元数据?
这个问题一直想做,一直耽搁着,直到写这系列的文章,终于鼓起勇气去探索一翻,算是找到了不错的方式,在此也给广大读者无偿分享,相信大家太多机会可以用得上。
上面说过,起码我们是懂得用界面、原生功能实现,才比较好理解如何用自动化实现,在SSMS上,我们可以通过【生成脚本】任务,实现数据库的元数据备份,具体操作见下图:
来到下一个界面,要以选择我们特定的对象,或整个数据库对象,具体哪些对象见下图:
再下一步就是保存方式而已,非常好理解,可见微软系的产品的体验非常棒,不止是操作步骤少,而且完全是界面化操作。
自动化备份数据元数据的方式,就是调用这个生成脚本的任务,让它每天都给我们备份出一个文件来即可。每天备份的频率,已经可以把我们的损失减少到一天内的工作。
想要自动化实现,就需要写代码,具体用什么语言来写,就看哪种语言可以调用Sqlserer的SMO对象了,笔者对微软系以外的语言是否支持不太知识,微软系内,dotNET语言是可以完成支持的,当然像VB这种古老语言就没份了,所以我们使用VB.NET、C#、PowerShell,都可以完成对SMO对象的访问实现自动化操作Sqlserver。
在此篇文章的代码中,分别分享C#和PowerShell的代码,笔者的书写顺序是先写了C#代码,再写PowerShell代码,在调用dotNET类库上,PowerShell因为没有命名空间的概念,书写代码没有C#那么方便,但因总体代码量较少,写完C#再写PowerShell时,可以很方便地将C#智能提示出来的代码,直接复制到PowerShell上小改即可。
C#代码如下:顺带写了自动删除过去60天外的脚本文件,防止备份数量过多。
关键的SMO对象是Transfer对象,同时如果远程访问其他服务器时,不能简单localhost用Windows认证登录那么省事,用Sqlserver认证体系时,需要构造ServerConnection对象。
使用PowerShell的脚本如下:基本上按C#写出来的代码,按PowerShell语法改写一下即可,PowerShell直接写,很多没有智能提示,比较蛋痛。
一个小坑,不知道什么原因,使用PowerShell备份Azure SQL时报错,最终项目真实环境是用了C#生成的控制台程序,没有使用PowerShell脚本。有可能某些真实环境控制台程序访问权限问题受限,不得不使用PowerShell脚本,所以还是很有必要学习使用PowerShell的方式实现一下。
和VSTO开发类似,只要拿到OFFICE程序的Application对象后,就可以轻松例用VBA的对象模型,进行OFFICE的自动化操作。
同样道理,最佳的方式是先写好了VBA再转换为PowerShell代码,在PowerShell上直接写,没有智能提示,非常糟糕。
调用其他dotNET类库,使用Add-Type方法,具体可参考帮助文档,这些的应用场景暂时没想到太经典的,毕竟在dotNET体系里,可能并非使用PowerShell完成一切工作最佳,相反,可能更多时候是C#代码里调用PowerShell为主,毕竟PowerShell的定位也只是一些自动化脚本,小型的需求使用。
本篇带给大家一些PowerShell能够做什么的视野性扩展,当然它能够做什么时如果有更佳的方式来完成,也并非完全需要硬套PowerShell来完成。
对于非专业程序员来说,更多地是入门一门语言,然后尽可能将其精华部分发挥出来即可。例如本篇提及的对Sqlserver运维的自动化,就是一个不错的场景。
笔者未来聚焦在数据领域的分享,不限于Excel,会分享更多Sqlserver、dotNET、Azure、PowerBI等话题,升级数据分析的能力,欢迎继续关注。*
1-在VisualStudio上使用PowerShell https://www.jianshu.com/p/b270611bb9ea 2-有哪些可用的场景及方式?https://www.jianshu.com/p/52fbbdc4f46b 3-会使用Excel简单函数就能上手PowerShell https://www.jianshu.com/p/f22cf85afb85