セールス: 1-800-867-1380

チュートリアル:ハイブリッド IT で災害復旧に備えるログ配布

更新日: 2014年4月

このチュートリアルでは、ハイブリッド IT 環境において SQL Server のログ配布をエンド ツー エンドで実装する方法について説明します。チュートリアルの最後には、次の要素で構成された SQL Server AlwaysOn ソリューションが完成します。

  • 複数のサブネットから成る仮想ネットワーク (フロントエンドのサブネットとバックエンドのサブネットを含む)

  • ドメイン コントローラーと SQL Server コンピューター (オンプレミス ネットワークにおいて VPN デバイスの内側で実行される)

  • サイト間 VPN 接続 (Azure の VPN デバイスとオンプレミスの VPN デバイス間)

  • SQL Server VM (Azure のバックエンド サブネットにデプロイされ、オンプレミスの AD ドメインに追加される)

  • プライマリ データベース サーバーとして構成されているオンプレミスの SQL Server コンピューター

  • セカンダリ データベース サーバーとして構成されている、Azure 内の SQL Server VM

このチュートリアルには、ソリューションをエンド ツー エンドでセットアップする手順が紹介されています。その中には、ダミー プライベート ネットワーク (10.0.0.0/24) とダミー Active Directory ドメイン (corp.contoso.com) をオンプレミスに設定する手順が含まれます。既存のオンプレミス ネットワークと Active Directory を使用する場合、関連するセクションをスキップして、「Create VPN Connection to Azure and SQL Server VM in Azure」に進んでください。ただし、その後の手順が、既存のオンプレミス構成のカスタム仕様で正しく動作する保証はありません。

このチュートリアルでは、冒頭に挙げたソリューションをセットアップするために必要な手順を紹介します。個々の手順について深く掘り下げて説明することはしません。したがって、GUI での構成手順は示さず、それぞれの手順を手早く実行できるように PowerShell スクリプトを使用しています。次のことを前提としています。

  1. ドメイン コントローラーおよび DHCP サーバーとして使用するオンプレミスのコンピューターに Windows Server 2008 R2 をインストールします。

  2. コンピューターをインターネットに接続し、すべての更新プログラムをインストールします。

  3. コンピューターをインターネットから切断し、VPN デバイスと同じサブネットに接続します。

  4. 管理者モードで Windows PowerShell ウィンドウを開きます。

  5. このコンピューターの構成に使用する PowerShell 変数を次のように定義します。

    $dcName = "DC1"
    $dcIP = "10.0.0.1"
    $subnetMask = "255.255.255.0"
    $gatewayIP = "10.0.0.2"
    $password = "Contoso!000"
    
    
  6. コンピューター上のドメイン コントローラーに使用する IP アドレスを「10.0.0.1」として構成します。サブネット マスクは「255.255.255.0」、ゲートウェイ IP アドレスは「10.0.0.2」としてください。

    netsh interface ip set address name="Local Area Connection" static $dcIP $subnetMask $gatewayIP 1
    
  7. コンピューターの名前を「DC1」に変更します。

    netdom renamecomputer $ENV:COMPUTERNAME /newname:$dcName /usero:Administrator /passwordo:$password /force /reboot
    
  8. コンピューターが再起動したら再度ログインし、次の PowerShell 変数を定義します。以後、これらの変数を使用して、このコンピューターをドメイン コントローラーとして構成していきます。

    $domainSuffix = "corp.contoso.com"
    $domainNetBIOS = "CORP"
    $password = "Contoso!000"
    
    
  9. DCPROMO.EXE を実行して、新しいドメイン フォレストに「corp.contoso.com」という名前の Active Directory ドメインを作成します。

    dcpromo.exe `
        /unattend `
        /ReplicaOrNewDomain:Domain `
        /NewDomain:Forest `
        /NewDomainDNSName:$domainSuffix `
        /ForestLevel:4 `
        /DomainNetbiosName:$domainNetBIOS `
        /DomainLevel:4 `
        /InstallDNS:Yes `
        /ConfirmGc:Yes `
        /CreateDNSDelegation:No `
        /SafeModeAdminPassword:"$password" 
    

    再起動後は、このコンピューターが、新しく作成した corp.contoso.com ドメインのドメイン コントローラーになります。

  10. ドメイン コントローラーに CORP\Administrator としてログインします。パスワードには「Contoso!000」を使用します。以降チュートリアルの最後まで、これと同じパスワードを使用します。

  11. 管理者モードで Windows PowerShell ウィンドウを開きます。

  12. ドメインの構成用に、次の PowerShell 変数を定義します。

    $dcName = "DC1"
    $dcIP = "10.0.0.1"
    $gatewayIP = "10.0.0.2"
    $scopeIP = "10.0.0.0"
    $scopeName = "Corpnet"
    $scopeStart = "10.0.0.100"
    $scopeEnd = "10.0.0.150"
    $domainSuffix = "corp.contoso.com"
    $pwd = ConvertTo-SecureString "Contoso!000" -AsPlainText -Force
    
  13. Active Directory PowerShell Module をインポートし、ユーザーを複数作成します。

    Import-Module ActiveDirectory
    
    New-ADUser -Name 'Install' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    New-ADUser -Name 'SQLAgent1' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    New-ADUser -Name 'SQLAgent2' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    

    CORP\SQLAgent1 および CORP\SQLAgent2 は、2 台の SQL Server インスタンス サーバーで実行されている SQL Server エージェント サービスのサービス アカウントとして使用されます。

  14. プライベート サブネットの新しいスコープで DHCP サービスを構成します。ゲートウェイ IP アドレスは 10.0.0.2 に設定されます。このアドレスは、後で構成するオンプレミスの VPN デバイスに使用します。

    Import-Module ServerManager
    Add-WindowsFeature DHCP
    Set-Service dhcpserver -StartupType automatic
    Start-service dhcpserver
    netsh dhcp server add scope $scopeIP 255.255.255.0 $scopeName $scopeName
    netsh dhcp server scope $scopeIP set state 0
    netsh dhcp server scope $scopeIP add iprange $scopeStart $scopeEnd
    netsh dhcp server scope $scopeIP set optionvalue 003 IPADDRESS $gatewayIP
    netsh dhcp server scope $scopeIP set optionvalue 006 IPADDRESS $dcIP
    netsh dhcp server scope $scopeIP set optionvalue 015 STRING $domainSuffix
    netsh dhcp server scope $scopeIP set state 1
    netsh dhcp add server $dcName.$domainSuffix $dcIP 
    

プライベート サブネットと Active Directory ドメインで正しく動作する TCP/IP ネットワークがこれで完成しました。オンプレミスの SQL Server システムを構成する準備が整いました。

  1. オンプレミスの SQL Server インスタンスとして使用する追加のオンプレミス コンピューターに Windows Server 2008 R2 をインストールします。

  2. コンピューターをインターネットに接続し、すべての更新プログラムをインストールします。

  3. コンピューターをインターネットから切断し、VPN デバイスと同じサブネットに接続します。

  4. 管理者モードで Windows PowerShell ウィンドウを開きます。

  5. 先ほど作成した CORP ドメインにコンピューターを参加させます。既存のオンプレミス ネットワークとドメインを使用している場合は、社内のそれぞれ対応するドメインにコンピューターを参加させてください。各コンピューターについて、$computerName 変数を SQLOnPrem に変更します。

    $domain = "CORP"
    $domainAdmin = "CORP\Administrator"
    $password = "Contoso!000"
    
    $computerName = SQLOnPrem
    netdom join $env:COMPUTERNAME /domain:$domain /userd:$domainAdmin /passwordd:$password 
    netdom renamecomputer $env:COMPUTERNAME /newname:$computerName /userd:$domainAdmin /passwordd:$password /force /reboot
    

    これらのコマンドを実行すると、コンピューターが自動的に再起動します。

  6. コンピューターの再起動が終了したら、再度ローカル管理者としてログインし、管理者モードで Windows PowerShell ウィンドウを開きます。

  7. インストール ディレクトリの変数を設定し、SQL Server 2012 を SQLOnPrem にインストールします。

    $installDir = "<Directory of SQL Server Setup.exe>"
    $agtsvcacct = "CORP\SQLAgent1"
    $sqlAdmin = "CORP\Install"
    $password = "Contoso!000"
    
    cd $installDir
    .\Setup.exe `
        /q `
        /ACTION=Install `
        /FEATURES=SQL,SSMS `
        /INSTANCENAME=MSSQLSERVER `
        /AGTSVCACCOUNT="$agtsvcacct" `
        /AGTSVCPASSWORD="$password" `
        /SQLSYSADMINACCOUNTS="$sqlAdmin" `
        /IACCEPTSQLSERVERLICENSETERMS
    
    
  8. ファイアウォールを開放し、SQL Server のリモート アクセスを許可します。

    netsh advfirewall firewall add rule `
        name='SQL Server (TCP-In)' `
        program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' `
        dir=in `
        action=allow `
        protocol=TCP
    
    
  9. 既定のインスタンスで TCP プロトコルを有効にし、SQL Server サービスを再起動します。

    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].IsEnabled = "True"
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].Alter()
    $svc = Get-Service -Name 'MSSQLSERVER'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout) 
    
  10. CORP\Install をローカル管理者として追加します。WSFC クラスターと可用性グループはこのユーザーを使用して構成します。

    net localgroup administrators "$sqlAdmin" /Add
    
  11. 両方のコンピューターからログアウトします。

    Logoff.exe
    

オンプレミス プライベート サブネットおよび SQL Server の構成はこれで終了です。この後は、オンプレミス プライベート サブネットと Azure ネットワークとの間に VPN 接続を構成し、ドメインに参加させる SQL Server VM を Azure に作成します。

  1. インターネットに接続されているコンピューターの PowerShell ウィンドウで、Azure モジュールをインポートし、発行設定ファイルをコンピューターにダウンロードします。ダウンロードした発行設定ファイルをインポートして、該当する Azure サブスクリプションに PowerShell セッションを接続してください。

    Import-Module `
        "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Azure\Azure.psd1"
    Get-AzurePublishSettingsFile
    Import-AzurePublishSettingsFile <publishsettingsfilepath> 
    

    Get-AzurePublishgSettingsFile コマンドを実行すると、管理証明書が自動的に生成され、Azure によってローカル コンピューターにダウンロードされます。ブラウザーが自動的に開き、Azure サブスクリプションに使用する Microsoft アカウントの資格情報を入力するように求められます。ダウンロードされた .publishsettings ファイルには、Azure サブスクリプションを管理するうえで必要になる情報がすべて含まれています。このファイルをローカル ディレクトリに保存した後、Import-AzurePublishSettingsFile コマンドを使用してインポートしてください。

    securityセキュリティ メモ
    publishsettings ファイルには、Azure のサブスクリプションおよびサービスを管理するために使用される (エンコードされていない) 資格情報が格納されています。このファイルに関するセキュリティのベスト プラクティスは、ソース ディレクトリの外部 (たとえば Libraries\Documents フォルダー) で一時的に格納しておき、インポートが完了した後で削除することです。悪意のあるユーザーが publishsettings ファイルにアクセスした場合、Azure サービスの編集、作成、および削除が実行されるおそれがあります。

  2. クラウド IT インフラストラクチャの作成に使用する一連の変数を定義します。

    $workingDir = "C:\workingDirectory\"
    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $virtualNetworkName = "ContosoNET" 
    $localNetworkName = "ContosoNETLocal"
    $networkConfigPath = $workingDir + "NetworkConfig.xml"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://$storageAccountName.blob.core.windows.net/vhds/"
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $serviceName = "<uniqueservicename>"
    $sqlServerName = "SQLInCloud"
    $vmAdminUser = "AzureAdmin" 
    $vmAdminPassword = "Contoso!000"
    $dnsSettings = New-AzureDns -Name "LocalDC" -IPAddress "10.0.0.1"
    $domainName= "corp"
    $domainSuffix = "corp.contoso.com"
    $subnetName = "CloudBack"
    $domainUser = "Administrator"
    $dataDiskSize = 100
    

    後でコマンドを正しく実行できるように、次の点に注意してください。

    • $storageAccountName 変数と $serviceName 変数はそれぞれ、インターネット上でクラウドのストレージ アカウントとクラウド サーバーを識別する際に使用します。重複しない値を使用してください。

    • $affinityGroupName$virtualNetworkName、および $localNetworkName の各変数に指定した名前は、後で使用する仮想ネットワークの構成ドキュメントに設定されます。

    • $sqlImageName には、SQL Server 2012 Service Pack 1 Enterprise Edition を格納した VM イメージの最新の名前を指定します。

    • 単純化するために、Contoso!000 というパスワードをチュートリアル全体で使用します。

  3. アフィニティ グループを作成します。

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. NetworkConfig.xml という名前の構成ファイルをインポートして仮想ネットワークを作成します。

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    この構成ファイルの内容は、以下の XML ドキュメントになっています。その内容を簡単に説明します。このファイルには、ContosoAG というアフィニティ グループの ContosoNET という仮想ネットワークが指定されています。仮想ネットワークには、10.10.0.0/16 というアドレス空間が割り当てられています。CloudBack サブネット、つまり 10.1.1.0/24 が、SQL Server VM の配置先になります。GatewaySubnet サブネット (10.1.254.0/24) は、仮想 VPN デバイスの配置先として Azure によって使用されます。サブネット名 GatewaySubnet を変更することはできません。$affinityGroupName$virtualNetworkName$localNetworkName のいずれかの変数を変更した場合は、以下の XML についても、対応する名前を変更する必要があります。また、このドキュメントでは、オンプレミスの DNS サーバーの IP アドレス (10.0.0.1) を構成し、DnsServersRef 要素の中でその DNS サーバーを参照しています。

    <NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns>
          <DnsServers>
            <DnsServer name="LocalDC" IPAddress="10.0.0.1" />
          </DnsServers>
        </Dns>
        <LocalNetworkSites>
          <LocalNetworkSite name="ContosoNETLocal">
            <AddressSpace>
              <AddressPrefix>10.0.0.0/24</AddressPrefix>
            </AddressSpace>
            <VPNGatewayAddress>24.12.228.169</VPNGatewayAddress>
          </LocalNetworkSite>
        </LocalNetworkSites>
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.1.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="CloudBack">
                <AddressPrefix>10.1.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="GatewaySubnet">
                <AddressPrefix>10.1.254.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
            <DnsServersRef>
              <DnsServerRef name="LocalDC" />
            </DnsServersRef>
            <Gateway profile="Small">
              <ConnectionsToLocalNetwork>
                <LocalNetworkSiteRef name="ContosoNETLocal" />
              </ConnectionsToLocalNetwork>
            </Gateway>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    
  5. 仮想ネットワークのゲートウェイを作成し、ゲートウェイのプロビジョニングが完了するまで待ちます。

    New-AzureVNetGateway -VNetName $virtualNetworkName
    
    $gateway = Get-AzureVNetGateway -VNetName $virtualNetworkName
    While ($gateway.State -ne "Provisioned")
    {
        write-host "Waiting...Current State = " $gateway.Status
        Start-Sleep -Seconds 15
        $gateway = Get-AzureVNetGateway -VNetName $virtualNetworkName
    }
    
    "IP Address   : " + $gateway.VIPAddress
    "Preshared Key: " + (Get-AzureVNetGatewayKey -VNetName $virtualNetworkName -LocalNetworkSiteName $localNetworkName).Value
    
    

    仮想ネットワークのゲートウェイがプロビジョニングされるまでには少々時間がかかります。プロビジョニングが完了すると、ゲートウェイのパブリック IP アドレスと事前共有キーが PowerShell ウィンドウに表示されます。

  6. 仮想ネットワーク ゲートウェイのパブリック IP アドレスと事前共有キーを使用してオンプレミスの VPN デバイスを構成します。ご使用の VPN デバイスに固有の構成スクリプトを使用する場合は、「仮想ネットワークに使用する VPN デバイスについて」を参照してください。

    この手順を終えると、VPN 接続が完全に確立されます。詳細については、「サイト間 VPN 接続の確立」を参照してください。

  7. 引き続きインターネットに接続されたコンピューターの PowerShell ウィンドウで、作成したアフィニティ グループに関連付けられたストレージ アカウントを作成します。

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  8. 新しいクラウド サービス内に SQL Server VM を作成します。

    New-AzureVMConfig `
        -Name $sqlServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sqlServerName.vhd" `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $domainSuffix `
            -DomainUserName $domainUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 | 
                    New-AzureVM `
                        -ServiceName $serviceName `
                        -AffinityGroup $affinityGroupName `
                        -VNetName $virtualNetworkName `
                        -DnsSettings $dnsSettings
    

    パイプで接続されたこの一連のコマンドは次のことを行います。

    • New-AzureVMConfig は、仮想マシン ギャラリー内の SQL Server 2012 Service Pack 1 Enterprise Edition イメージを使用して VM 構成を作成します。また、オペレーティング システム ディスクを読み取りキャッシュ専用 (書き込みキャッシュなし) に設定しています。データベース ファイルは、VM にアタッチする専用のデータ ディスクに移行し、読み取りキャッシュと書き込みキャッシュなしで構成することをお勧めします。ただし、オンプレミスのデータベース サーバーはどちらも C ドライブをデータベース ファイルに使用するため、データベース ファイルの移動は見合わせてください。これにより、Azure VM とオンプレミスのサーバーを後で WSFC クラスターに参加させたとき、それらすべてのサーバーの構成が完全に一致します。

    • Add-AzureProvisioningConfig は、作成したオンプレミスの Active Directory ドメインに VM を参加させます。

    • Add-AzureEndpoint は、クライアント アプリケーションからインターネット上の SQL Server サービス インスタンスにアクセスできるように、アクセスのエンドポイントを追加します。

    • New-AzureVM は、新しいクラウド サービスを作成し、そこに新しい Azure VM を作成します。

  9. 各 VM が完全にプロビジョニングされるのを待ち、リモート デスクトップ ファイルを自分の作業ディレクトリにダウンロードします。while ループは、新しい Azure VM を使用する準備が整うまで、Azure VM をポーリングし続けます。

    $VMStatus = Get-AzureVM -ServiceName $serviceName -Name $sqlServerName
    
    While ($VMStatus.Status -ne "ReadyRole")
    {
        write-host "Waiting...Current Status = " $VMStatus.InstanceStatus
        Start-Sleep -Seconds 15
        $VMStatus = Get-AzureVM -ServiceName $serviceName -Name $sqlServerName
    } 
    Get-AzureRemoteDesktopFile `
        -ServiceName $serviceName `
        -Name $sqlServerName `
        -LocalPath "$workingDir$sqlServerName.rdp"
    

次に、新しい SQL Server VM (SQLInCloud) に接続し、初期化します。

このセクションでは、先ほど作成した新しい SQL Server VM 上の SQL Server を可用性グループに参加させるための準備として、SQL Server の既定のインストール環境に変更を加える必要があります。具体的な内容は次のとおりです。

  • VM は、すべての SQL Server サービス (データベース エンジン、SSIS、SSAS、SSRS など) と共にインストールされます。必要な SQL サービス (既定の MSSQLSERVER インストールとフルテキスト検索デーモン) 以外は、すべて無効にする必要があります。

  • サービス アカウントの SQL Server エージェントを CORP\SQLAgent2 に変更する必要があります。

  • SQL Server VM では、TCP プロトコルがあらかじめ有効に設定されています。ただし、SQL Server にリモート アクセスするためには、ファイアウォールを開放する必要があります。

  1. リモート デスクトップ ファイルを起動して SQLInCloud に接続します。VM の作成時に指定した、コンピューター管理者のユーザー名 (AzureAdmin) とパスワード (Contoso!000) を使用します。

  2. コンピューターが正常に corp.contoso.com に参加していることを確認します。

  3. SQL Server のインストール中、自動化された初期化タスクが実行されます。このタスクの完了を待って先に進みます。

  4. 管理者モードで PowerShell ウィンドウを開きます。

  5. 次の変数を定義します。

    $desirableServices = @("SqlServer","SqlAgent","9")
    $svcaccount = "CORP\SQLAgent2"
    $password = "Contoso!000"
    

    変数 $desirableServicesSqlServer はデータベース エンジン サービスのサービスの種類、SqlAgent は SQL Server エージェント サービスのサービスの種類、9 はフルテキスト検索デーモンのサービスの種類です。

  6. SQL Server PowerShell プロバイダーをインポートします。

    Set-ExecutionPolicy -Execution RemoteSigned -Force
    Import-Module -Name "sqlps" -DisableNameChecking
    
  7. 不要な SQL サービス (SSIS、SSAS、SSRS など) をすべて停止し、これらの開始モードを Disabled に設定します。

    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.services | where {$desirableServices -notcontains $_.Type} | foreach{$_.StartMode = "Disabled"; $_.Alter(); $_.Stop();}
    
  8. 既定インスタンスの SQL Server エージェント サービス アカウントを CORP\SQLAgent2 に変更します。

    $wmi.services | where {$_.Type -eq 'SqlAgent'} | foreach{$_.SetServiceAccount($svcaccount,$password)}
    $svc = Get-Service -Name 'SQLSERVERAGENT'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    # Start the SQL Server service and wait for the service to be fully started
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  9. ファイアウォールを開放し、SQL Server のリモート アクセスを許可します。

    netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP
    

これでログ配布を構成する準備が整いました。

  1. リモート デスクトップ ファイルを起動して SQLOnPrem に再度接続します。ログインするには、あらかじめ登録された Administrator アカウントを使用します。

  2. 管理者モードで PowerShell ウィンドウを開きます。SQLOnPrem を前にログアウトしていない場合は、SQL Server パスが確実に PowerShell 環境変数に読み込まれるように、既存の PowerShell ウィンドウを閉じ、管理者モードで新しい PowerShell ウィンドウを開く必要があります。

  3. ログ配布ジョブに使用するネットワーク共有を作成します。

    $backup = "C:\LocalBackup"
    $acct1 = "CORP\SQLAgent1"
    $acct2 = "CORP\SQLAgent2"
    
    New-Item $backup -ItemType directory
    net share backup=$backup "/grant:$acct1,FULL" "/grant:$acct2,FULL"
    icacls.exe "$backup" /grant:r ("$acct1" + ":(OI)(CI)F") ("$acct2" + ":(OI)(CI)F")
    
  4. SQLOnPrem にログ配布を設定するには、次の Transact-SQL スクリプトを実行します。このスクリプトは、SQL Server Management Studio (SSMS) ユーザー インターフェイスで次の変数を使用して作成されます。

    1. データベース:MyDB1

    2. バックアップ ディレクトリ:C:\LocalBackup

    3. バックアップ ディレクトリの共有パス: \\SQLOnPrem\backup

    4. セカンダリ サーバー: SQLInCloud

    5. ログ バックアップの出力先ディレクトリ (SQLInCloud 上):C:\LocalBackup

    SSMS で生成されたスクリプトの後半部分は、後で SQLInCloud で実行します。

    SQLCMD -S SQLOnPrem
    
    DECLARE @LS_BackupJobIdAS uniqueidentifier 
    DECLARE @LS_PrimaryIdAS uniqueidentifier 
    DECLARE @SP_Add_RetCodeAs int 
    
    
    EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database 
    @database = N'MyDB1' 
    ,@backup_directory = N'C:\LocalBackup' 
    ,@backup_share = N'\\SQLOnPrem\backup' 
    ,@backup_job_name = N'LSBackup_MyDB1' 
    ,@backup_retention_period = 4320
    ,@backup_compression = 2
    ,@backup_threshold = 60 
    ,@threshold_alert_enabled = 1
    ,@history_retention_period = 5760 
    ,@backup_job_id = @LS_BackupJobId OUTPUT 
    ,@primary_id = @LS_PrimaryId OUTPUT 
    ,@overwrite = 1 
    
    
    IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) 
    BEGIN 
    
    DECLARE @LS_BackUpScheduleUIDAs uniqueidentifier 
    DECLARE @LS_BackUpScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'LSBackupSchedule_SQL11' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_BackUpScheduleUID OUTPUT 
    ,@schedule_id = @LS_BackUpScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_BackupJobId 
    ,@schedule_id = @LS_BackUpScheduleID  
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_BackupJobId 
    ,@enabled = 1 
    
    
    END 
    
    
    EXEC master.dbo.sp_add_log_shipping_alert_job 
    
    EXEC master.dbo.sp_add_log_shipping_primary_secondary 
    @primary_database = N'MyDB1' 
    ,@secondary_server = N'SQLInCloud' 
    ,@secondary_database = N'MyDB1' 
    ,@overwrite = 1 
    
    Exit
    
  5. リモート デスクトップ ファイルを起動して SQLInCloud に再度接続します。ログインするには、あらかじめ登録された Administrator アカウントを使用します。

  6. 管理者モードで PowerShell ウィンドウを開きます。

  7. ログ配布のコピー ジョブと復元ジョブで使用するローカル ディレクトリを作成します。

    $backup = "C:\LocalBackup"
    $acct2 = "CORP\SQLAgent2"
    
    New-Item $backup -ItemType directory
    icacls.exe "$backup" /grant:r ("$acct2" + ":(OI)(CI)F")
    
  8. 次の Transact-SQL スクリプトを実行して、SQLInCloud にログ配布を設定します。これは、SSMS で生成されたスクリプトの後半部分です。

    SQLCMD -S SQLInCloud
    
    DECLARE @LS_Secondary__CopyJobIdAS uniqueidentifier 
    DECLARE @LS_Secondary__RestoreJobIdAS uniqueidentifier 
    DECLARE @LS_Secondary__SecondaryIdAS uniqueidentifier 
    DECLARE @LS_Add_RetCodeAs int 
    
    
    EXEC @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary 
    @primary_server = N'SQLOnPrem' 
    ,@primary_database = N'MyDB1' 
    ,@backup_source_directory = N'\\SQLOnPrem\backup' 
    ,@backup_destination_directory = N'C:\LocalBackup' 
    ,@copy_job_name = N'LSCopy_SQLOnPrem_MyDB1' 
    ,@restore_job_name = N'LSRestore_SQLOnPrem_MyDB1' 
    ,@file_retention_period = 4320 
    ,@overwrite = 1 
    ,@copy_job_id = @LS_Secondary__CopyJobId OUTPUT 
    ,@restore_job_id = @LS_Secondary__RestoreJobId OUTPUT 
    ,@secondary_id = @LS_Secondary__SecondaryId OUTPUT 
    
    IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    DECLARE @LS_SecondaryCopyJobScheduleUIDAs uniqueidentifier 
    DECLARE @LS_SecondaryCopyJobScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'DefaultCopyJobSchedule' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT 
    ,@schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_Secondary__CopyJobId 
    ,@schedule_id = @LS_SecondaryCopyJobScheduleID  
    
    DECLARE @LS_SecondaryRestoreJobScheduleUIDAs uniqueidentifier 
    DECLARE @LS_SecondaryRestoreJobScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'DefaultRestoreJobSchedule' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT 
    ,@schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_Secondary__RestoreJobId 
    ,@schedule_id = @LS_SecondaryRestoreJobScheduleID  
    
    
    END 
    
    
    DECLARE @LS_Add_RetCode2As int 
    
    
    IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    EXEC @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database 
    @secondary_database = N'MyDB1' 
    ,@primary_server = N'SQLOnPrem' 
    ,@primary_database = N'MyDB1' 
    ,@restore_delay = 0 
    ,@restore_mode = 0 
    ,@disconnect_users= 0 
    ,@restore_threshold = 45   
    ,@threshold_alert_enabled = 1 
    ,@history_retention_period= 5760 
    ,@overwrite = 1 
    
    END 
    
    
    IF (@@error = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_Secondary__CopyJobId 
    ,@enabled = 1 
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_Secondary__RestoreJobId 
    ,@enabled = 1 
    
    END 
    
    Exit
    

これで終了です。プライマリ データベース サーバーがオンプレミスで実行されセカンダリ データベース サーバーが Azure で実行されているハイブリッド IT 環境で、ログ配布を正常に実装しました。SQL Server エージェントでログ配布ジョブを監視することにより、ログが SQLOnPrem で正常に作成され、SQLInCloud で正常にコピーおよび復元されることを確認できます。

この情報は役に立ちましたか。
(残り 1500 文字)
フィードバックをいただき、ありがとうございました
表示:
© 2014 Microsoft