SQLServer用powershell實現多台服務器批量執行SQL腳本


  在運維工作中,會遇到很多重復性的操作。對於單台服務器重復性的工作,可以用job實現定期的處理;而對於多台服務器相同的需求,我們就可以利用powershell來進行批量的操作,對多台服務器進行批量相同的操作。本文重點分析這種方案的實現過程,而不糾結於對每台服務器具體執行的SQL腳本,所以在例子中以簡單的SQL腳本為例:在中心服務器上執行一個powershell腳本,即可以收集所有服務器的信息。對類似於定期出report的任務,還可以將該powershell腳本設置成計划任務。

  首先將需要執行批量操作的服務器放在文本文件Serverlist.txt中:

  中心服務器:10.120.100.101

  10.120.100.1

  10.120.100.2

  10.120.100.3

  以下所有創建的文件應該和Serverlist.txt放在一個文件夾中!

 

  一.編寫SQL腳本實現需求,並保存.SQL文件:

  腳本1-(腳本文件名1.Create_DB&Table.sql):在每台服務器創建收集數據的數據庫和表

  --默認設置創建用於收集信息的專用數據庫

  CREATE DATABASE [Info_stats]
   CONTAINMENT = NONE
   ON  PRIMARY
  ( NAME = N'Info_stats', FILENAME = N'D:\SQLServer\Data\Info_stats.mdf' , SIZE = 4096KB , FILEGROWTH = 1024KB )
   LOG ON
  ( NAME = N'Info_stats_log', FILENAME = N'D:\SQLServer\Data\Info_stats_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
  GO

  --在該數據庫中創建本例子中需要用到的表

  Use [Info_stats];

  Create table DBName
  (Servername nvarchar(100),
  DBName nvarchar(100))

  腳本2-(腳本文件名2.Select_DBName.sql):查詢所有用戶數據庫名字並存放在該服務器上的[Info_stats]-DBName表中

  select name from sysdatabases where name not in(N'master', N'model', N'msdb', N'tempdb', N'distribution', N'DWDiagnostics', N'DWConfiguration',N'DWQueue',   N'resource',N'ReportServer',N'ReportServerTempDB')

  腳本3-(腳本文件名3.Copy Info to Centre.sql):將查詢出的該服務器的信息同步到中心服務器:

  Set nocount on;
  use [Info_stats];
  truncate table [Info_stats].[dbo].[DBName];
  insert into [Info_stats].[dbo].[DBName]
  select * from  
  (
  select top 1* from
  OPENDATASOURCE(
           'SQLOLEDB',
           'Data Source=10.120.100.1;Integrated Security=SSPI'
           ).[Info_stats].[dbo].[DBName] order by Check_Date desc) c
  union
  select * from  
  (
  select top 1* from
  OPENDATASOURCE(
           'SQLOLEDB',
           'Data Source=10.120.100.2;Integrated Security=SSPI'
           ).[Info_stats].[dbo].[DBName] order by Check_Date desc) c
  union
  (
  select * from (
  select top 1* from
  OPENDATASOURCE(
           'SQLOLEDB',
           'Data Source=10.120.100.3;Integrated Security=SSPI'
           ).[Info_stats].[dbo].[DBName]  order by Check_Date desc)z)


  Set nocount off;
  

  注意:在中心服務器上需要打開‘Ad Hoc Distributed Queries’的選項,才可以使用OPENDATASOURCE來同步查詢結果到中心服務器

  

  二.開始powershell腳本的准備:

  1.創建調用(1.Create_DB&Table.sql)的powershell腳本,用於第一次執行時使用:

  腳本名:Create_DB&Table.ps1

  $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
  $Serverlist="$PSScriptRoot\Serverlist.txt"
  $Create_table="$PSScriptRoot\1.Create_DB&Table.sql"
  Foreach ($server in GC $Serverlist) {
  Invoke-Sqlcmd -ServerInstance $server -InputFile $Create_table
  }
  2.創建調用(2.Select_DBName.sql)的powershell腳本,用於收集數據:

  腳本名:QueryData.ps1

  $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
  $Serverlist="$PSScriptRoot\Serverlist.txt"
  $ITSPCheck="$PSScriptRoot\2.Select_DBName.sql"
  Foreach ($server in GC $Serverlist) {
  Invoke-Sqlcmd -ServerInstance $server -InputFile $ITSPCheck
  }
  3.創建調用(3.Copy Info to Centre.sql)的powershell腳本,用於整合數據到中心服務器:

  腳本名:IntegrateResult.ps1

  $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
  $IntegrateResult="$PSScriptRoot\3.Copy Info to Centre.sql"
  $Selfcheck="$PSScriptRoot\2.Select_DBName.sql"
  Invoke-Sqlcmd -ServerInstance $env:COMPUTERNAME -InputFile $IntegrateResult
  Invoke-Sqlcmd -ServerInstance $env:COMPUTERNAME -InputFile $Selfcheck
  4.創建統籌powershell腳本,來按步驟調用以上powershell腳本:

  腳本名:ExecPs.ps1

  $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
  powershell.exe "$PSScriptRoot\QueryData.ps1"
  powershell.exe "$PSScriptRoot\IntegrateResult.ps1"

  第一次執行時,會多一個創建數據庫和表的步驟:

  腳本名:ExecPs_FirstTime.ps1

  $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
  powershell.exe "$PSScriptRoot\Create_DB&Table.ps1"
  powershell.exe "$PSScriptRoot\QueryData.ps1"
  powershell.exe "$PSScriptRoot\IntegrateResult.ps1"

  

  第一次執行ExecPs_FirstTime.ps1,之后執行ExecPs.ps1便可收集信息到中心服務器,並且舊數據會保留在每個節點服務器上,中心服務器通過判斷對最新的數據進行收集:

  

  

  對於其他類似的需求,也可以根據本例進行擴展。在中心服務器上右鍵運行ExecPs.ps1就可以得到所有節點服務器的信息,非常方便!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM