Sql server 使用PowerShell的按需SQL快照复制同步

Sql server 使用PowerShell的按需SQL快照复制同步,sql-server,powershell,replication,Sql Server,Powershell,Replication,我正在尝试创建一个PowerShell脚本,以便更轻松地执行从主数据服务器到测试服务器的按需同步。我们目前正在使用快照复制,并且只在项目之间同步数据,因此可能需要几天或几周才能更新数据。涉及到许多数据库,我希望能够运行PowerShell脚本,该脚本将更新快照,重新初始化订阅,然后启动同步过程。我一直在使用复制监视器执行此操作,但有许多步骤,我希望能够确保每次都以完全相同的方式进行,因此脚本就是这样 关于SQL复制和PowerShell主题,我所能找到的只是如何编写新发布和订阅的脚本,或者如何监

我正在尝试创建一个PowerShell脚本,以便更轻松地执行从主数据服务器到测试服务器的按需同步。我们目前正在使用快照复制,并且只在项目之间同步数据,因此可能需要几天或几周才能更新数据。涉及到许多数据库,我希望能够运行PowerShell脚本,该脚本将更新快照,重新初始化订阅,然后启动同步过程。我一直在使用复制监视器执行此操作,但有许多步骤,我希望能够确保每次都以完全相同的方式进行,因此脚本就是这样

关于SQL复制和PowerShell主题,我所能找到的只是如何编写新发布和订阅的脚本,或者如何监视当前正在运行的复制过程。似乎没有任何关于实际启动同步过程的内容。最后,我想封装这个功能,只需提供几个参数,如publisher、publication和subscriber

是否有人拥有用于启动MS SQL Server按需复制的东西


谢谢

这是我为同步事务性复制请求订阅而编写的一个旧脚本。这都是基于使用

RMO涵盖了所有复制类型,因此它应该适用于快照,但有一些小的更改:

$asm = [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
$asm = [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Replication")
$asm = [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.RMO")

function Do-Replication
{
<# 
   .SYNOPSIS Initiate Merge Replication Sync .DESCRIPTION This Function kicks of a Transactional Replication Synchronization 
   .EXAMPLE Give an example of how to use it .PARAMETER subscriber The SQL Instance Name name of the Publication, EG localhost 
   .PARAMETER spublisher The SQL Instance Name name of the Publisher, eg MyPublisher .PARAMETER publication The name of the publication 
   .PARAMETER subscriptionDatabase The name of the Subscriber Database .PARAMETER publicationDatabase The name of the publisher database 
   .PARAMETER forceReInit $true to force a ReInitialization of the subscription, $false otherwise .PARAMETER verboseLevel Logging verbosity level 
   .PARAMETER retries Number of times to retry the sync in case of a failure 
   
#>
  param(
    [string][Parameter(Mandatory = $true,position = 0)] $subscriber,
    [string][Parameter(Mandatory = $true,position = 1)] $publisher,
    [string][Parameter(Mandatory = $true,position = 2)] $publication,
    [string][Parameter(Mandatory = $true,position = 3)] $subscriptionDatabase,
    [string][Parameter(Mandatory = $true,position = 4)] $publicationDatabase,
    [Boolean][Parameter(Mandatory = $true,position = 5)] $forceReInit,
    [int32][Parameter(Mandatory = $true,position = 6)] $verboseLevel,
    [int32][Parameter(Mandatory = $true,position = 7)] $retries) 
    
    "Subscriber: $subscriber";
    "Publisher: $publisher";
    "Publication: $publication";
    "Publication Database: $publicationDatabase";
    "Subscription Database: $subscriptionDatabase";
    "ForceReInit: $forceReinit";
    "VerboseLevel: $verboseLevel";
    "Retries: $retries";

    for ($counter = 1; $counter -le $retries; $counter++) 
    { 
      "Subscriber $subscriber";
      $serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection $subscriber;
      try 
      { 
        $serverConnection.Connect();
        $transPullSubscription = New-Object Microsoft.SqlServer.Replication.TransPullSubscription;
        $transPullSubscription.ConnectionContext = $serverConnection;
        $transPullSubscription.DatabaseName = $subscriptionDatabase;
        $transPullSubscription.PublisherName = $publisher;
        $transPullSubscription.PublicationDBName = $publicationDatabase;
        $transPullSubscription.PublicationName = $publication;
        if ($true -ne $transPullSubscription.LoadProperties()) 
        { 
          throw New-Object System.ApplicationException "A subscription to [$publication] does not exist on [$subscriber]"  
        } 
        if ($null -eq $transPullSubscription.PublisherSecurity) 
        { 
          throw New-Object System.ApplicationException "There is insufficent metadata to synchronize the subscription. Recreate the subscription with the agent job or supply the required agent properties at run time.";
        } 

        $transPullSubscription.SynchronizationAgent.Output = "c:\temp\ReplicationLog.txt";
        $transPullSubscription.SynchronizationAgent.OutputVerboseLevel = $verboseLevel;

        if ($forceReInit -eq $true) 
        { 
          $transPullSubscription.Reinitialize();
        } 

        $transPullSubscription.SynchronizationAgent.Synchronize();
        "Sync Complete";
        return;
    }
    catch [Exception]
    {
      if ($counter -lt $retries) 
      { 
          $_.Exception.Message + ": " + $_.Exception.InnerException "Retry $counter"; 
          continue; 
      } 
      else 
      { 
          return $_.Exception.Message + ": " + $_.Exception.InnerException 
      } 
    }
  }

}


Do-Replication -subscriber "DBROWNE0" "DBROWNE0" "inventory" "subscriberTest" "replTest" $false 1 4;
$asm=[Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.ConnectionInfo”)
$asm=[Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Replication”)
$asm=[Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.RMO”)
函数做复制
{
param(
[字符串][参数(必需=$true,位置=0)]$subscriber,
[string][Parameter(必填项=$true,位置=1)]$publisher,
[string][Parameter(必填项=$true,位置=2)]$publication,
[字符串][参数(必需=$true,位置=3)]$subscriptionDatabase,
[string][Parameter(必需=$true,position=4)]$publicationDatabase,
[布尔值][参数(必需=$true,位置=5)]$forceReInit,
[int32][Parameter(必需=$true,position=6)]$verboseLevel,
[int32][参数(必需=$true,位置=7)]$retries)
“订户:$Subscriber”;
“出版商:$Publisher”;
“出版物:出版物”;
“出版物数据库:$publicationDatabase”;
“订阅数据库:$subscriptionDatabase”;
“ForceReInit:$ForceReInit”;
“VerboseLevel:$VerboseLevel”;
“重试次数:$Retries”;
对于($counter=1;$counter-le$retries;$counter++)
{ 
“订户$订户”;
$serverConnection=新对象Microsoft.SqlServer.Management.Common.serverConnection$subscriber;
尝试
{ 
$serverConnection.Connect();
$transPullSubscription=新对象Microsoft.SqlServer.Replication.transPullSubscription;
$transPullSubscription.ConnectionContext=$serverConnection;
$transPullSubscription.DatabaseName=$subscriptionDatabase;
$transPullSubscription.PublisherName=$publisher;
$transPullSubscription.PublicationDBName=$publicationDatabase;
$transPullSubscription.PublicationName=$publication;
if($true-ne$transPullSubscription.LoadProperties())
{ 
抛出新对象System.ApplicationException“对[$publication]的订阅在[$subscriber]上不存在”
} 
if($null-eq$transPullSubscription.PublisherSecurity)
{ 
抛出新对象System.ApplicationException“元数据不足,无法同步订阅。请使用代理作业重新创建订阅,或在运行时提供所需的代理属性。”;
} 
$transPullSubscription.SynchronizationAgent.Output=“c:\temp\ReplicationLog.txt”;
$transPullSubscription.SynchronizationAgent.OutputVerboseLevel=$verboseLevel;
如果($forceReinfonit-eq$true)
{ 
$transPullSubscription.Reinitialize();
} 
$transPullSubscription.SynchronizationAgent.Synchronization();
“同步完成”;
返回;
}
捕获[例外]
{
if($计数器-lt$重试次数)
{ 
$\.Exception.Message+“:”+$\.Exception.InnerException“重试$counter”;
继续;
} 
其他的
{ 
返回$$\.Exception.Message+”:“++$\.Exception.InnerException
} 
}
}
}
执行复制-订阅服务器“DBROWNE0”“DBROWNE0”“资源清册”“订阅测试”“replTest”$false 1 4;

谢谢!这很有帮助。我能够将其更改为使用推复制而不是拉复制。如果将来有人搜索如何执行此操作,您只需将TransPullSubscription更改为TransSubscription,并匹配相应的发布者/订阅者属性。另一件需要设置的事情是包括SynchronizationAgentProcessSecurity.Login和Password属性。现在我需要做的就是找出如何识别和运行快照代理。我找到了如何运行快照代理。使用[MySourceDatabase];转到sp_开始发布_快照“MyPublicationName”;我能够将该SQL语句合并到David提供的PowerShell脚本中,它正按照我的预期工作。谢谢