<譯>經過PowerShell工具跨多臺服務器執行SQL腳本

有時候,咱們並無合適的第三方工具(大部分須要付費)去管理多臺數據庫服務器,那麼如何作最省力、省心呢?!Powershell一個強大的工具,能夠很方便幫到咱們處理平常的數據庫維護工做 。簡單的幾步搞定,下面介紹一個簡單例子便於你們理解:node

1,建立一個文件夾,如 D:\ExecScriptOnMultiServersql

2,建立一個文本文件ServerList.txt,將全部須要管理的數據庫實例名寫到裏面,格式以下:shell

    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 sqlserver

6,或者直接在PowerShell命令行執行,學習

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

小結:spa

PowerShell工具是很是強大的工具,特別在跨多服務器的維護中,更能體現高效。本文只是一個影子,有興趣的朋友能夠參考下面的資料學習:命令行

PowerShell Tips

 

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

相關文章
相關標籤/搜索