<译>通过PowerShell工具跨多台服务器执行SQL脚本

有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力、省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 。简单的几步搞定,下面介绍一个简单例子便于大家理解:

1,创建一个文件夹,如 D:\ExecScriptOnMultiServer

2,创建一个文本文件ServerList.txt,将所有需要管理的数据库实例名写到里面,格式如下:

    SQLInstanceName1

    SQLInstanceName2

    SQLInstanceName3

  ...

然后保存到可以访问到的目录,如D:\ExecScriptOnMultiServer\ServerList.txt

3,将下面的Powershell脚本保存到目录 D:\ExecScriptOnMultiServer\ExecuteQueryOnMultiServers.ps1

##Save the below powershell script in folder "D:\ExecScriptOnMultiServer\ExecuteQueryOnMultiServers.ps1"

$QueryPath= "D:\ExecScriptOnMultiServer\SQLQuery.sql"
$OutputFile = "D:\ExecScriptOnMultiServer\QueryOutput.txt"

$ExecuteQuery= Get-Content -path $QueryPath | out-string

"Results -- > `r`n`r`n" > $OutputFile

FOREACH($server in GC "D:\ExecScriptOnMultiServer\ServerList.txt")
 {
    $server 

    "---------------------------------------------------------------------------------------------------------" >> $OutputFile
    $server >> $OutputFile
    "---------------------------------------------------------------------------------------------------------" >> $OutputFile
    invoke-sqlcmd -ServerInstance $server -query $ExecuteQuery -querytimeout 65534 | ft -autosize | out-string -width 4096 >> $OutputFile
 }

4,将你要在上述ServerList文件中的服务器实例执行的SQL语句,可先写到目录文件D:\ExecScriptOnMultiServer\SQLQuery.sql

例如:我要对所有实例下所有数据的的版本、SP和群集节点等信息收集,如下代码:

declare @Nodes Varchar(100)
set @Nodes=‘‘
 if (SERVERPROPERTY(‘IsClustered‘) = 1)
begin
select @Nodes=@Nodes+ NodeName
+‘,‘ from sys.dm_os_cluster_nodes order by NodeName
set @Nodes=substring(@Nodes,0,LEN(@Nodes))
select
@Nodes as HostName,
SQLInstanceName = @@SERVERNAME,
‘Yes‘ as IsClustered,
CAST(SERVERPROPERTY(‘ComputerNamePhysicalNetBIOS‘) AS VARCHAR(50)) As ActiveNode,
SERVERPROPERTY(‘edition‘) As SQLEdition,
Case
  when cast(serverproperty(‘productversion‘) as varchar) like ‘8.%‘ then ‘SQL2000‘
       when cast(serverproperty(‘productversion‘) as varchar) like ‘9.%‘ then ‘SQL2005‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘10.0%‘ then ‘SQL2008‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘10.50.%‘ then ‘SQL2008R2‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘11.%‘ then ‘SQL2012‘
  when cast(serverproperty(‘productversion‘) as varchar)  like ‘12.%‘ then ‘SQL2014‘
       ELSE ‘SQL7.0‘ END +‘ ‘+
  cast(SERVERPROPERTY(‘productlevel‘) as varchar(50))+‘ (‘+ cast(SERVERPROPERTY(‘productversion‘) as varchar(50)) + ‘)‘ as SQLVersion
end
 else
begin
select @Nodes=CAST(SERVERPROPERTY(‘ComputerNamePhysicalNetBIOS‘) AS VARCHAR(50))
select
@Nodes as HostName,
SQLInstanceName = @@SERVERNAME,
‘No‘ as IsClustered,
SERVERPROPERTY(‘edition‘) As SQLEdition,
Case
  when cast(serverproperty(‘productversion‘) as varchar) like ‘8.%‘ then ‘SQL2000‘
       when cast(serverproperty(‘productversion‘) as varchar) like ‘9.%‘ then ‘SQL2005‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘10.0%‘ then ‘SQL2008‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘10.50.%‘ then ‘SQL2008R2‘
       when cast(serverproperty(‘productversion‘) as varchar)  like ‘11.%‘ then ‘SQL2012‘
  when cast(serverproperty(‘productversion‘) as varchar)  like ‘12.%‘ then ‘SQL2014‘
       ELSE ‘SQL7.0‘ END +‘ ‘+
  cast(SERVERPROPERTY(‘productlevel‘) as varchar(50))+‘ (‘+ cast(SERVERPROPERTY(‘productversion‘) as varchar(50)) + ‘)‘ as SQLVersion
end

5,开启Window PowerShellISE程序,注意要用管理员身份启动,打开Powershell脚本ExecuteQueryOnMultiServers.ps1,点击执行。

执行后结果保存如代码中标注,位置在D:\ExecScriptOnMultiServer\QueryOutput.txt 

6,或者直接在PowerShell命令行执行,

PS C:\>D:\ExecScriptOnMultiServer\ExecuteQueryOnMultiServers.ps1

小结:

PowerShell工具是非常强大的工具,特别在跨多服务器的维护中,更能体现高效。本文只是一个影子,有兴趣的朋友可以参考下面的资料学习:

PowerShell Tips

本文转自: http://www.sqlservercentral.com/scripts/powershell/129948/

时间: 2024-12-28 22:26:18

<译>通过PowerShell工具跨多台服务器执行SQL脚本的相关文章

Powershell连接多服务器执行SQL脚本

$query = " select @@servername" $csvFilePath = "c:\Scripts\queryresults.csv"   $instanceNameList = get-content c:\Scripts\serverlist.txt [email protected]()    foreach($instanceName in $instanceNameList) {         write-host "Exec

通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEclipse中的window->show View->other 调出.DB浏览器. 步骤2: 步骤3:输入db,然后选择DB Brower. 步骤4:单击空白处右键. 步骤5:选择相应的数据库类型. 步骤6: Driver name :填上自己需要的名字 Connection name :jdbc:

SQLServer用powershell实现多台服务器批量执行SQL脚本

在运维工作中,会遇到很多重复性的操作.对于单台服务器重复性的工作,可以用job实现定期的处理:而对于多台服务器相同的需求,我们就可以利用powershell来进行批量的操作,对多台服务器进行批量相同的操作.本文重点分析这种方案的实现过程,而不纠结于对每台服务器具体执行的SQL脚本,所以在例子中以简单的SQL脚本为例:在中心服务器上执行一个powershell脚本,即可以收集所有服务器的信息.对类似于定期出report的任务,还可以将该powershell脚本设置成计划任务. 首先将需要执行批量操

【转】Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息

pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency> 代码: package com.spring.bean.annotation; import java.io.BufferedReader; import

PLSQL执行SQL脚本文件「适用批量」- 工具使用篇

前言 开局一条狗,装备全靠打 这篇文章应该是 2019 年最后一文章了,分享一下 PLSQL 是如何执行 SQL 脚本文件的. 关于执行 SQL 文件,下方是自己经常使用的一种方式,同样适用于批量文件. 好了.废话少说,看正文吧. 正文 File > New > Command Windows 创建一个窗口后,输入 @ 符号,然后敲回车. 然后会弹出一个文件选择窗口,选择需要执行的 SQL 文件即可运行. 不是说好了适用批量吗,你这只能选择一个啊! 咳咳,别慌嘛- 扩展批量文件执行 假设在这我

使用PowerShell收集多台服务器的性能计数器

写在前面     当管理多台Windows Server服务器时(无论是DB.AD.WEB以及其他的应用服务器),当出现性能或其他问题后,参阅性能计数器都是一个非常好的维度从而推测出问题可能出现的原因,再不济也能缩小需要考虑的问题范围,因此定期收集每一台服务器的计数器就会使得问题有据可循.并且收集到的数据也可以作为BaseLine,即使没有出现问题也可以预先判断一些问题.     之前看到网上的大多数收集性能计数器的文章都比较局限,一般是只收集单台服务器,因此我分享一个多服务器的写法.    

PHP多台服务器跨域SESSION共享

网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上:或通过负载均衡技术 (如:DNS轮询.Radware.F5.LVS等)让多个频道共享一组服务器. OK,头脑中我们已经构思了这样的解决方案,不过进入深入开发后新的技术问题又随之而来: 我们把网站程序分布部署到多台服务器上,而且独立为几个二级域名,由于Session受实现原理的局限(PHP中S

CS2: Server 2003 enter-pssession 连接到另外一台服务器报错

客户问题概括:用户反馈在域中一台Win 2003 SP2 服务器使用 Powershell ,"enter-pssession" 链接到另外一台服务器无法工作,该服务器无其他问题. 报错内容: WSManFaultMessage = WinRM cannot process the request. The following error occured while using Negotiate authentication: An unknown security error oc

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器 2018-07-01 Windows 约 2202 字 预计阅读 5 分钟 文章目录 Windows 世界的远程管理 基于 WinRM 的 PowerShell Remoting 配置无密码 的 PowerShell Remoting 体验 在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Secure Shell 的缩写,用它可以很容易连接到指定的服务器,并执行特定命令