共用方式為


使用 PowerShell 在 Azure VM 上設定 Always On 可用性群組

開始之前,請考慮您現在可以在 Azure Resource Manager 模型中完成這項工作。 建議針對新的部署使用 Azure Resource Manager 模型。 請參閱 Azure 虛擬機上的 SQL Server Always On 可用性群組

這很重要

我們建議大部分的新部署都使用 Resource Manager 模型。 Azure 針對建立和使用資源方面,有二種不同的的部署模型:Resource Manager 和傳統。 本文涵蓋之內容包括使用傳統部署模型。

Azure 虛擬機 (VM) 可協助資料庫管理員降低高可用性 SQL Server 系統的成本。 本教學課程說明如何在 Azure 環境中使用 SQL Server Always On 端對端實作可用性群組。 在本教學課程結束時,Azure 中的 SQL Server Always On 解決方案將包含下列元素:

  • 包含多個子網的虛擬網路,包括前端和後端子網。
  • 具有 Active Directory 網域的域控制器。
  • 部署至後端子網並加入Active Directory網域的兩部SQL Server VM。
  • 具有節點多數仲裁模型的三節點 Windows 故障轉移叢集。
  • 具有可用性資料庫兩個同步認可複本的可用性群組。

此情境因其在 Azure 上的簡單性而是不錯的選擇,而非其成本效益或其他因素。 例如,您可以使用域控制器作為雙節點故障轉移叢集中仲裁檔案共享見證,將兩個復本可用性群組的 VM 數目降到最低,以節省在 Azure 中的計算時數。 此方法會將上述組態中的 VM 計數減少一個。

本教學課程旨在說明設定上述解決方案所需的步驟,而不需要詳細說明每個步驟的詳細數據。 因此,它使用PowerShell腳本快速完成每個步驟,而不是提供GUI設定步驟。 本教程假設以下事項:

線上到您的 Azure 訂用帳戶並建立虛擬網路

  1. 在本機電腦的 PowerShell 視窗介面中,先匯入 Azure 模組,然後將發佈設定檔案下載到您的電腦,接著再匯入下載的發佈設定檔案,連接您的 PowerShell 工作階段到您的 Azure 訂閱帳戶。

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

    Get-AzurePublishSettingsFile 命令會自動使用 Azure 產生管理憑證,並將其下載到您的電腦。 系統會自動開啟瀏覽器,系統會提示您輸入 Azure 訂用帳戶的Microsoft帳戶認證。 下載的 .publishsettings 檔案包含管理 Azure 訂用帳戶所需的所有資訊。 將此檔案儲存到本機目錄之後,請使用 Import-AzurePublishSettingsFile 命令加以匯入。

    備註

    .publishsettings 檔案包含您用來管理 Azure 訂用帳戶和服務的認證(未編碼)。 此檔案的安全性最佳做法是暫時將它儲存在來源目錄之外(例如,在 Library\Documents 資料夾中),然後在匯入完成後刪除它。 取得 .publishsettings 檔案存取權的惡意使用者,可以編輯、建立和刪除您的 Azure 服務。

  2. 定義您將用來建立雲端 IT 基礎結構的一系列變數。

    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $networkConfigPath = "C:\scripts\Network.netcfg"
    $virtualNetworkName = "ContosoNET"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://" + $storageAccountName + ".blob.core.windows.net/vhds/"
    $winImageName = (Get-AzureVMImage | where {$_.Label -like "Windows Server 2008 R2 SP1*"} | sort PublishedDate -Descending)[0].ImageName
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $dcServerName = "ContosoDC"
    $dcServiceName = "<uniqueservicename>"
    $availabilitySetName = "SQLHADR"
    $vmAdminUser = "AzureAdmin"
    $vmAdminPassword = "Contoso!000"
    $workingDir = "c:\scripts\"
    

    請注意下列事項,以確保您的命令稍後會成功:

    • 變數 $storageAccountName$dcServiceName 必須是唯一的,因為它們分別用來識別因特網上的雲端記憶體帳戶和雲端伺服器。
    • 您為變數指定的名稱 $affinityGroupName$virtualNetworkName 會在稍後使用的虛擬網路組態檔中進行設定。
    • $sqlImageName 指定包含 SQL Server 2012 Service Pack 1 Enterprise Edition 的 VM 映射更新名稱。
    • 為了簡單起見, Contoso!000 是在整個教學課程中使用的相同密碼。
  3. 建立同質群組。

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. 匯入組態檔來建立虛擬網路。

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    組態檔包含下列 XML 檔。 簡單來說,它會在名為 ContosoAG 的同質群組中指定名為 ContosoNET 的虛擬網路。 其地址空間 為 10.10.0.0/16 ,且有兩個子網: 10.10.1.0/2410.10.2.0/24,分別是前子網和後端子網。 前端子網是您可以放置用戶端應用程式的位置,例如 Microsoft SharePoint。 後端子網是您將放置 SQL Server VM 的位置。 如果您稍早變更 $affinityGroupName$virtualNetworkName 變數,您也必須變更下方的對應名稱。

    <NetworkConfiguration xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns="https://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns />
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.10.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Front">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="Back">
                <AddressPrefix>10.10.2.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    ```xml
    
    
  5. 建立與您建立之同質群組相關聯的記憶體帳戶,並將它設定為您訂用帳戶中的目前儲存體帳戶。

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  6. 在新雲端服務和可用性設定組中建立域控制器伺服器。

    New-AzureVMConfig `
        -Name $dcServerName `
        -InstanceSize Medium `
        -ImageName $winImageName `
        -MediaLocation "$storageAccountContainer$dcServerName.vhd" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            New-AzureVM `
                -ServiceName $dcServiceName `
                –AffinityGroup $affinityGroupName `
                -VNetName $virtualNetworkName
    

    這些管道命令會執行下列動作:

    • New-AzureVMConfig 會建立 VM 組態。
    • Add-AzureProvisioningConfig 提供獨立 Windows 伺服器的組態參數。
    • Add-AzureDataDisk 會新增您將用來儲存 Active Directory 數據的數據磁碟,並將快取選項設定為 [無]。
    • New-AzureVM 會建立新的雲端服務,並在新的雲端服務中建立新的 Azure VM。
  7. 等候新的 VM 完全佈建,並將遠端桌面檔案下載到您的工作目錄。 因為新的 Azure VM 需要很長的時間才能布建,所以 while 循環會繼續輪詢新的 VM,直到它準備好使用為止。

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

域控制器伺服器現在已成功布建。 接下來,您將在此域控制器伺服器上設定 Active Directory 網域。 請保持 PowerShell 視窗在本機電腦上開啟。 您稍後會再次使用它來建立兩個 SQL Server VM。

設定域控制器

  1. 啟動遠端桌面檔案,以連線到域控制器伺服器。 使用計算機管理員的用戶名稱 AzureAdmin 和密碼 Contoso!000,您在建立新的 VM 時指定。

  2. 在系統管理員模式下開啟 [Azure PowerShell] 視窗。

  3. 執行下列 DCPROMO.EXE 命令來設定 corp.contoso.com 網域,並在磁碟驅動器 M 上使用資料目錄。

    dcpromo.exe `
        /unattend `
        /ReplicaOrNewDomain:Domain `
        /NewDomain:Forest `
        /NewDomainDNSName:corp.contoso.com `
        /ForestLevel:4 `
        /DomainNetbiosName:CORP `
        /DomainLevel:4 `
        /InstallDNS:Yes `
        /ConfirmGc:Yes `
        /CreateDNSDelegation:No `
        /DatabasePath:"C:\Windows\NTDS" `
        /LogPath:"C:\Windows\NTDS" `
        /SYSVOLPath:"C:\Windows\SYSVOL" `
        /SafeModeAdminPassword:"Contoso!000"
    

    命令完成之後,VM 會自動重新啟動。

  4. 啟動遠端桌面檔案,再次連線到域控制器伺服器。 這次,以 CORP\Administrator 身分登入。

  5. 以系統管理員模式開啟 PowerShell 視窗,並使用下列命令匯入 Active Directory PowerShell 模組:

    Import-Module ActiveDirectory
    
  6. 執行下列命令,將三個使用者新增至網域。

    $pwd = ConvertTo-SecureString "Contoso!000" -AsPlainText -Force
    New-ADUser `
        -Name 'Install' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    New-ADUser `
        -Name 'SQLSvc1' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    New-ADUser `
        -Name 'SQLSvc2' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    

    CORP\Install 可用來設定與 SQL Server 服務實例、故障轉移叢集和可用性群組相關的一切。 CORP\SQLSvc1CORP\SQLSvc2 會作為兩部 SQL Server VM 的 SQL Server 服務帳戶。

  7. 接下來,執行下列命令,讓 CORP\Install 許可權在網域中建立計算機物件。

    Cd ad:
    $sid = new-object System.Security.Principal.SecurityIdentifier (Get-ADUser "Install").SID
    $guid = new-object Guid bf967a86-0de6-11d0-a285-00aa003049e2
    $ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"CreateChild","Allow",$guid,"All"
    $corp = Get-ADObject -Identity "DC=corp,DC=contoso,DC=com"
    $acl = Get-Acl $corp
    $acl.AddAccessRule($ace1)
    Set-Acl -Path "DC=corp,DC=contoso,DC=com" -AclObject $acl
    

    上面指定的 GUID 是計算機物件類型的 GUID。 CORP\Install 帳戶需要 [讀取所有屬性] 和 [建立計算機物件] 許可權,才能建立故障轉移叢集的 Active Direct 物件。 默認已將 讀取所有屬性 許可權授予 CORP\Install,因此您不需要明確授予它。 如需建立故障轉移叢集所需許可權的詳細資訊,請參閱 故障轉移叢集逐步指南:在 Active Directory 中設定帳戶

    既然您已完成 Active Directory 和使用者對象的設定,您將建立兩個 SQL Server VM,並將加入此網域。

建立 SQL Server VM

  1. 繼續使用本機計算機上開啟的PowerShell視窗。 定義下列其他變數:

    $domainName= "corp"
    $FQDN = "corp.contoso.com"
    $subnetName = "Back"
    $sqlServiceName = "<uniqueservicename>"
    $quorumServerName = "ContosoQuorum"
    $sql1ServerName = "ContosoSQL1"
    $sql2ServerName = "ContosoSQL2"
    $availabilitySetName = "SQLHADR"
    $dataDiskSize = 100
    $dnsSettings = New-AzureDns -Name "ContosoBackDNS" -IPAddress "10.10.0.4"
    

    IP 位址 10.10.0.4 通常會指派給您在 Azure 虛擬網路 的 10.10.0.0/16 子網中建立的第一個 VM。 您應該執行 IPCONFIG 來確認這是網域控制器伺服器的位址。

  2. 執行下列管道命令,在故障轉移叢集中建立第一個 VM,名為 ContosoQuorum

    New-AzureVMConfig `
        -Name $quorumServerName `
        -InstanceSize Medium `
        -ImageName $winImageName `
        -MediaLocation "$storageAccountContainer$quorumServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                New-AzureVM `
                    -ServiceName $sqlServiceName `
                    –AffinityGroup $affinityGroupName `
                    -VNetName $virtualNetworkName `
                    -DnsSettings $dnsSettings
    

    請注意下列有關上述命令的事項:

    • New-AzureVMConfig 會建立具有所需可用性設定組名稱的 VM 組態。 後續的 VM 會以相同的可用性設定組名稱建立,以便聯結至相同的可用性設定組。
    • Add-AzureProvisioningConfig 會將 VM 加入您建立的 Active Directory 網域。
    • Set-AzureSubnet 會將 VM 放在後端子網中。
    • New-AzureVM 會建立新的雲端服務,並在新的雲端服務中建立新的 Azure VM。 DnsSettings 參數會指定新雲端服務中伺服器的 DNS 伺服器具有 IP 位址 10.10.0.4。 這是域控制器伺服器的IP位址。 需要此參數,才能讓雲端服務中的新 VM 成功加入 Active Directory 網域。 如果沒有此參數,您必須在 VM 中手動設定 IPv4 設定,以在布建 VM 之後使用域控制器伺服器作為主要 DNS 伺服器,然後將 VM 加入 Active Directory 網域。
  3. 執行下列管線命令來建立名為 ContosoSQL1ContosoSQL2 的 SQL Server VM。

    # Create ContosoSQL1...
    New-AzureVMConfig `
        -Name $sql1ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql1ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $sqlServiceName
    
    # Create ContosoSQL2...
    New-AzureVMConfig `
        -Name $sql2ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql2ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 2 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $sqlServiceName
    

    請注意下列有關上述命令的事項:

    • New-AzureVMConfig 使用與域控制器伺服器相同的可用性設定組名稱,並在虛擬機資源庫中使用 SQL Server 2012 Service Pack 1 Enterprise Edition 映射。 它也會將作業系統磁碟設定為只使用讀取快取(沒有寫入快取)。 我們建議您將資料庫檔案移轉至附加到 VM 的單獨數據磁碟上,並設定為不啟用讀取或寫入快取。 不過,次佳的選擇是移除作業系統磁碟上的寫快取,因為您無法移除作業系統磁碟上的讀快取。
    • Add-AzureProvisioningConfig 會將 VM 加入您建立的 Active Directory 網域。
    • Set-AzureSubnet 會將 VM 放在後端子網中。
    • Add-AzureEndpoint 新增存取端點,讓用戶端應用程式可以在因特網上存取這些 SQL Server 服務實例。 ContosoSQL1 和 ContosoSQL2 被分配了不同的埠。
    • New-AzureVM 會在與 ContosoQuorum 相同的雲端服務中建立新的 SQL Server VM。 如果您想要將 VM 放在相同的可用性設定組中,則必須將 VM 放在相同的雲端服務中。
  4. 等候每個 VM 完全佈建,並讓每個 VM 將其遠端桌面檔案下載到您的工作目錄。 迴圈 for 會迴圈執行三個新的 VM,並針對每個 VM 執行最上層大括弧內的命令。

    Foreach ($VM in $VMs = Get-AzureVM -ServiceName $sqlServiceName)
    {
        write-host "Waiting for " $VM.Name "..."
    
        # Loop until the VM status is "ReadyRole"
        While ($VM.InstanceStatus -ne "ReadyRole")
        {
            write-host "  Current Status = " $VM.InstanceStatus
            Start-Sleep -Seconds 15
            $VM = Get-AzureVM -ServiceName $VM.ServiceName -Name $VM.InstanceName
        }
    
        write-host "  Current Status = " $VM.InstanceStatus
    
        # Download remote desktop file
        Get-AzureRemoteDesktopFile -ServiceName $VM.ServiceName -Name $VM.InstanceName -LocalPath "$workingDir$($VM.InstanceName).rdp"
    }
    

    SQL Server VM 現在已布建並執行,但會使用預設選項與 SQL Server 一起安裝。

初始化故障轉移叢集虛擬機

在本節中,您必須修改將用於故障轉移叢集和 SQL Server 安裝的三部伺服器。 具體說來:

  • 所有伺服器:您必須安裝 故障轉移叢集 功能。

  • 所有伺服器:您必須將 CORP\Install 新增為計算機 管理員

  • 僅限 ContosoSQL1 和 ContosoSQL2:您必須在預設資料庫中新增 CORP\Install 作為 系統管理員 角色。

  • 僅限 ContosoSQL1 和 ContosoSQL2:您必須將 NT AUTHORITY\System 新增為具有下列許可權的登入:

    • 改變任何可用性群組
    • 連線 SQL
    • 檢視伺服器狀態
  • 僅限 ContosoSQL1 和 ContosoSQL2:已在 SQL Server VM 上啟用 TCP 通訊協定。 不過,您仍然需要開啟防火牆以遠端訪問 SQL Server。

現在,您已準備好開始。 從 ContosoQuorum 開始,請遵循下列步驟:

  1. 啟動遠端桌面檔案,以連線到 ContosoQuorum 。 使用您建立 VM 時所指定的電腦系統管理員用戶名稱 AzureAdmin 和密碼 Contoso!000

  2. 確認計算機已成功加入 corp.contoso.com

  3. 等候 SQL Server 安裝完成執行自動化初始化工作,再繼續進行。

  4. 在系統管理員模式下開啟 [Azure PowerShell] 視窗。

  5. 安裝 Windows 故障轉移叢集功能。

    Import-Module ServerManager
    Add-WindowsFeature Failover-Clustering
    
  6. CORP\Install 新增為本機系統管理員。

    net localgroup administrators "CORP\Install" /Add
    
  7. 註銷 ContosoQuorum。 您現在已經不需要再使用此伺服器。

    logoff.exe
    

接下來,初始化 ContosoSQL1ContosoSQL2。 請遵循下列步驟,這兩部 SQL Server VM 都相同。

  1. 啟動遠端桌面檔案,以連線到這兩部 SQL Server VM。 使用您建立 VM 時所指定的電腦系統管理員用戶名稱 AzureAdmin 和密碼 Contoso!000

  2. 確認計算機已成功加入 corp.contoso.com

  3. 等候 SQL Server 安裝完成執行自動化初始化工作,再繼續進行。

  4. 在系統管理員模式下開啟 [Azure PowerShell] 視窗。

  5. 安裝 Windows 故障轉移叢集功能。

    Import-Module ServerManager
    Add-WindowsFeature Failover-Clustering
    
  6. CORP\Install 新增為本機系統管理員。

    net localgroup administrators "CORP\Install" /Add
    
  7. 匯入 SQL Server PowerShell 提供者。

    Set-ExecutionPolicy -Execution RemoteSigned -Force
    Import-Module -Name "sqlps" -DisableNameChecking
    
  8. 新增 CORP\Install 作為預設 SQL Server 實例的系統管理員角色。

    net localgroup administrators "CORP\Install" /Add
    Invoke-SqlCmd -Query "EXEC sp_addsrvrolemember 'CORP\Install', 'sysadmin'" -ServerInstance "."
    
  9. NT AUTHORITY\System 新增為具有上述三個許可權的登入。

    Invoke-SqlCmd -Query "CREATE LOGIN [NT AUTHORITY\SYSTEM] FROM WINDOWS" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    
  10. 開啟防火牆以遠端訪問 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
    
  11. 註銷這兩部 VM。

     logoff.exe
    

最後,您已準備好設定可用性群組。 您將使用 SQL Server PowerShell 提供者,在 ContosoSQL1 上執行所有工作。

設定可用性群組

  1. 啟動遠端桌面檔案,以再次連線到 ContosoSQL1 。 使用 CORP\Install 登入,而不是使用電腦帳戶登入。

  2. 在系統管理員模式下開啟 [Azure PowerShell] 視窗。

  3. 定義下列變數:

    $server1 = "ContosoSQL1"
    $server2 = "ContosoSQL2"
    $serverQuorum = "ContosoQuorum"
    $acct1 = "CORP\SQLSvc1"
    $acct2 = "CORP\SQLSvc2"
    $password = "Contoso!000"
    $clusterName = "Cluster1"
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $db = "MyDB1"
    $backupShare = "\\$server1\backup"
    $quorumShare = "\\$server1\quorum"
    $ag = "AG1"
    
  4. 匯入 SQL Server PowerShell 提供者。

    Set-ExecutionPolicy RemoteSigned -Force
    Import-Module "sqlps" -DisableNameChecking
    
  5. 將 ContosoSQL1 的 SQL Server 服務帳戶變更為 CORP\SQLSvc1。

    $wmi1 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server1
    $wmi1.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct1,$password)}
    $svc1 = Get-Service -ComputerName $server1 -Name 'MSSQLSERVER'
    $svc1.Stop()
    $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc1.Start();
    $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  6. 將 ContosoSQL2 的 SQL Server 服務帳戶變更為 CORP\SQLSvc2。

    $wmi2 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server2
    $wmi2.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct2,$password)}
    $svc2 = Get-Service -ComputerName $server2 -Name 'MSSQLSERVER'
    $svc2.Stop()
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc2.Start();
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  7. 建立 Azure VM 中的 Always On 可用性群組故障轉移叢集 下載 CreateAzureFailoverCluster.ps1 到本地工作目錄。 您將使用此腳本來協助您建立功能故障轉移叢集。 如需 Windows 故障轉移叢集如何與 Azure 網路互動的重要資訊,請參閱 Azure 虛擬機中 SQL Server 的高可用性和災害復原

  8. 切換至您的工作目錄,並使用下載的腳本建立故障轉移叢集。

    Set-ExecutionPolicy Unrestricted -Force
    .\CreateAzureFailoverCluster.ps1 -ClusterName "$clusterName" -ClusterNode "$server1","$server2","$serverQuorum"
    
  9. ContosoSQL1ContosoSQL2 上啟用預設 SQL Server 實例的 Always On 可用性群組。

    Enable-SqlAlwaysOn `
        -Path SQLSERVER:\SQL\$server1\Default `
        -Force
    Enable-SqlAlwaysOn `
        -Path SQLSERVER:\SQL\$server2\Default `
        -NoServiceRestart
    $svc2.Stop()
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc2.Start();
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  10. 建立備份目錄,並授與 SQL Server 服務帳戶的許可權。 您將使用這個目錄來準備次要副本上的可用性資料庫。

    $backup = "C:\backup"
    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")
    
  11. 在名為 MyDB1ContosoSQL1 上建立資料庫、採用完整備份和記錄備份,並使用 WITH NORECOVERY 選項在 ContosoSQL2 上還原資料庫。

    Invoke-SqlCmd -Query "CREATE database $db"
    Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server1
    Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server1 -BackupAction Log
    Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server2 -NoRecovery
    Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server2 -RestoreAction Log -NoRecovery
    
  12. 在 SQL Server VM 上建立可用性群組端點,並在端點上設定適當的許可權。

    $endpoint =
      New-SqlHadrEndpoint MyMirroringEndpoint `
        -Port 5022 `
        -Path "SQLSERVER:\SQL\$server1\Default"
      Set-SqlHadrEndpoint `
        -InputObject $endpoint `
        -State "Started"
    $endpoint =
      New-SqlHadrEndpoint MyMirroringEndpoint `
        -Port 5022 `
        -Path "SQLSERVER:\SQL\$server2\Default"
    Set-SqlHadrEndpoint `
         -InputObject $endpoint `
         -State "Started"
    
    Invoke-SqlCmd -Query "CREATE LOGIN [$acct2] FROM WINDOWS" -ServerInstance $server1
    Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct2]" -ServerInstance $server1
    Invoke-SqlCmd -Query "CREATE LOGIN [$acct1] FROM WINDOWS" -ServerInstance $server2
    Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct1]" -ServerInstance $server2
    
  13. 建立可用性複本。

    $primaryReplica =
       New-SqlAvailabilityReplica `
         -Name $server1 `
         -EndpointURL "TCP://$server1.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
    $secondaryReplica =
       New-SqlAvailabilityReplica `
         -Name $server2 `
         -EndpointURL "TCP://$server2.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
    
  14. 最後,建立可用性群組,並將次要複本加入可用性群組。

    New-SqlAvailabilityGroup `
        -Name $ag `
        -Path "SQLSERVER:\SQL\$server1\Default" `
        -AvailabilityReplica @($primaryReplica,$secondaryReplica) `
        -Database $db
    Join-SqlAvailabilityGroup `
        -Path "SQLSERVER:\SQL\$server2\Default" `
        -Name $ag
    Add-SqlAvailabilityDatabase `
        -Path "SQLSERVER:\SQL\$server2\Default\AvailabilityGroups\$ag" `
        -Database $db
    

後續步驟

您現在已藉由在 Azure 中建立可用性群組,成功實作 SQL Server Always On。 若要設定此可用性群組的接聽程式,請參閱 在 Azure 中設定 Always On 可用性群組的 ILB 接聽程式

如需在 Azure 中使用 SQL Server 的其他資訊,請參閱 Azure 虛擬機上的 SQL Server