日期:2014-05-18  浏览次数:21072 次

【分享】利用Powershell来管理服务器

自己使用Powershell的目的是为了更方便的管理与SQL Server相关,所以就顺便发到SQL Server版本,希望对大家有所启发。

Powershell 是微软开发的windows平台上的新脚本语言,目的在于实现类似于bash 等方便管理windows 系统的功能,为系统管理员带来更大的方便。在实际应用中自己也尝试着去学习和应用powershell,经过一段时间的摸索,发现其功能确实强大,能够在windows平台上灵活的管理文件系统、注册表、进程、服务、SQL Server、exchange等,而且容易上手,简化了很多管理的方式。

一、Powershell的资源

网上有很多Powershll的优秀资源,顺便跟大家分享下
1,微软的Powershll官方网站
http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx
要想了解一项新技术,最好的资源莫过于官方网站了,有一些非常好的入门资料,值得一看。

2,powershell.com
http://powershell.com/cs/
这是idera公司维护的一个关于powershell的学习网站,里面有很多非常好的实践和问题解决方案,能够提供很好的启发。

3,simple-talk 网站
http://www.simple-talk.com/search/default.aspx?search=powershell
simple- talk是redgate维护的一个知识网站,里面网罗了很多数据库和其他技术的大师(如Joe Celko),是一个非常好的知识库。最早引起自己对Powershell兴趣的就是看了上面地址的一系列利用powershell管理SQL Server的文章。

4,电子书
首推下述两本
1, 《Manning.Power.Shell.in.Practice.Jun.2010》 从书名也可以看出具有很强的实践性
2, 《OReilly.Windows.PowerShell.Cookbook.Oct.2007》OReilly出这种语言书也很具含金量

不过都是英文版。

二、注意事项

Powershell目前已经发展到了V2 版本,在安装SQL Server 2008时,会自动安装V1,但有很大的功能限制,为了获得更好的功能,尽量考虑使用V2。下载地址为:
http://support.microsoft.com/kb/968929

三、Powershell 和SQL Server

在使用SQL Server 2008时,我们会发现自动安装了POWERSHELL。说明POWERSHELL已经和SQL Server进行了很好的融合,要通过powershell来管理SQL Server主要是通过直接操作SMO(SQL Server Mnagement Object)来实现。但平时应用的不多,所以未对其过多深入,有兴趣的朋友可以参考下联机丛书


四、自己的Powershell实践

像我在管理SQL Server时,最经常遇到的需求是:
1,如何获得windows的事件查看器里的警告和错误信息,并发送警告,
2,如何获得SQL Server相关服务的运行状态,并发送警告;
3,如何获得SQL Server服务器的空间信息,并发送警告;
4,如何移动历史备份文件到新的目录,防止做磁带备份时产生冗余。

当然,上述内容,通过SQL Server 编写T-SQL应该也能实现,但相对而言会复杂很多,而通过POWERSHELL的话,有些甚至只需要几行语句就可以了。

1,如何获得windows的事件查看器里的警告和错误信息,并发送警告,

Python code
# Created at 2010-08-23
# Created by obuntu
#
# 创建获取服务器错误和警告信息的函数
# 在POWERSHELL里,Get-EventLog还可以管理远程服务器,如果有多台服务器的话,会更方便管理
function get-sqlEventLog{
   #参数为服务器名,后续调用函数时,输入服务器名就可以 
Param(
        [String] $serverName
        )   

 # EntryType用来筛选错误和警告信息
 # APPLICATION指的是应用程序的信息,其他的还有 SYSTEM,SECURITY
 #利用get-date获取最近1个小时的错误和警告信息
 Get-EventLog Application -ComputerName $serverName  -EntryType 'Error','Warning' -After ((get-date).addhours(-1))  |Format-List  
 
}

$headline=(Get-Date).toString() 列' FOR 列名 /*将你要设置为默认值对象的列*/


--用命令创建CHECK约束定义某字段. 
USE 销售管理系统    --引入数据库
ALTER TABLE 销售表    --修改表
ADD CONSTRAINT ck_sl    --创建检查约束
CHECK (数量 >= 1 and 数量 <= 10000)    --添加约束条件


--用命令创建规则对象,并与表中字段绑定.
--创建规则使用CREATE RULE语句创建
CREATE RULE RULE_AGE    --创建规则
AS 
@AGE !> 40    --规则条件不能大于40

CREATE RULE list_rule     --创建规则
AS
@list IN ('1001', '1002', '1003')    --规则条件只能输入1001、1002、1003

CREATE RULE pattern_rule     --创建规则
AS
@value LIKE '_ _-%[0-9]'    --规则条件在任意两个字符的后面跟一个连字符和任意多个字符,并以 0 到 9 之间的整数结尾
--创建好一个规则后,必须使用绑定才能够使用规则,一般情况下,规则可以绑定在用户自定义数据类型或是数据列中。下面可以使用SQL Server中的系统存储过程sp_bindrule将规则绑定在数据表中。
EXEC sp_bindrule 'RULE_AGE','操作员信息表.操作员年龄'


--用命令创建用户自定义数据类型,并用该数据类型定义表中字段.
--在“student”数据库中,创建用来存储邮政编码信息的“postalcode”用户定义数据类型。
--SQL语句如下:
USE student
EXEC sp_addtype postalcode,'char(8) ','not null' 


2,如何获得SQL Server相关服务的运行状态,并发送警告;

Python code
# Created at 2010-08-23
# Created by obuntu
# 在-match后面可以利用正则表达式来筛选自己想关注的服务状态
# 在-computername后面指定多台服务器
$message=Get-Service -computername 192.168.2.1,192.168.3.1,192.168.4.1 | Where-Object {$_.Name -match "\bmsdtc\b|\bmssqlserver\b|\bsqlwriter\b|\bmsdtsserver100\b|\bsqlserveragent\b"} `
|sort machinename|format-table -Property machinename,name,status,displayname -auto |Out-String
#如果有服务停止,立即发送邮件