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就可以得到所有节点服务器的信息,非常方便!

原文地址:https://www.cnblogs.com/LC0507/p/11209327.html

时间: 2024-11-08 04:45:32

SQLServer用powershell实现多台服务器批量执行SQL脚本的相关文章

SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)

需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监控脚本 <#批量执行SQL脚本文件#> <#===========================================#> $serverInstance="WUXUEL1" $Database="111" #$userName=&q

批量执行SQL文件

原文:批量执行SQL文件 摘要:很多时候我们在做系统升级时需要将大量的.sql文件挨个执行,十分不方便.而且考虑到执行顺序和客服的操作方便性,能不能找到一种简单的方法来批量执行这些sql文件呢? 主要内容: 准备工作 利用osql/ocmd命令批量执行sql文件 使用master..xp_cmdshell存储过程调用osql/ocmd命令 总结 一.准备工作 既然是要批量执行sql文件,首先我们建立两个sql文件:1.sql和2.sql. 1.sql的内容: INSERT INTO dbo.Pr

SQL*PLUS中批量执行SQL语句

SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书),最后将所有的SQL语句一次性的执行完成. 首先,将要执行的所有的SQL语句,全部写入某个sql文件当中.例如f:\test.sql; 然后,通过通过sqlplus连接到数据库:如: SQL> sqlplus test/[email protected]; 再执行如下命令: SQL> @f:\te

mysqli扩展库应用---批量执行sql语句

1, mysqli批量执行sql语句.基本语法: $sqls=”sql1;sql2;………” mysqli::multi_query($sqls); 同一个$sqls要么是增删改语句集合,要么是查询语句的集合,查询语句和增删改最好不要混合.应用示例如下: ① 操作数据库的代码: <?php class mysqliMutiTool{ private $mysqli = null; private static $host = "10.252.158.217"; private s

批量执行sql语句

基本使用 $sqls="sql语句1;sql语句2;sql语句n"; 或 $sqls="insert into xx;";  $sqls.="insert into xx;"; $res=mysqli::multi_query($sqls); 如果$sqls 是dml 语句,则$res 返回布尔值: 如果$sqls 是dql 语句,则$res 返回多个结果集,需要使用mysqli::store_result() 和 mysqli::more_re

JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("truncate QB_ShowCount_Asite_copy"); ps.executeBatch(); String SrcSql = "select convert(unhex(hex(convert(Community using latin1))) using utf8) as Commu

jdbc批量执行SQL insert 操作

package com.file; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; public class ResolvFile { public static String readFileContent(String filepath) { //1.读取每一行记录,保存到List中 ArrayList<String> records = new ArrayList&

批量查询sql脚本

远程批量查询sql脚本 for i in {1..50} do sql_ip=172.168.0.${i} information=`mysql -h ${sql_ip} -uroot -ppassword dbname -e 'select name,value from setting where name = "name" UNION select name,value from setting where name = "code" ' |grep -v v

JDBC 复习4 批量执行SQL

1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbex.mysql; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLExce