使用 PowerShell 在 Azure VM 上配置 AlwaysOn 可用性组

在开始之前,请考虑现在可以在 Azure 资源管理器模型中完成此任务。 建议使用 Azure 资源管理器模型进行新部署。 请参阅 Azure 虚拟机上的 SQL Server Always On 可用性组

重要

建议大多数新部署使用 Resource Manager 模型。 Azure 具有用于创建和处理资源的两个不同的部署模型:资源管理器部署模型和经典部署模型。 本文介绍使用经典部署模型的情况。

Azure 虚拟机(VM)可帮助数据库管理员降低高可用性 SQL Server 系统的成本。 本教程介绍如何在 Azure 环境中使用 SQL Server Always On 端到端实现可用性组。 本教程结束时,Azure 中的 SQL Server Always On 解决方案将包含以下元素:

  • 包含多个子网的虚拟网络,包括前端子网和后端子网。
  • 具有 Active Directory 域的域控制器。
  • 部署在后端子网并加入 Active Directory 域的两台 SQL Server 虚拟机。
  • 具有节点多数仲裁模型的三节点 Windows 故障转移群集。
  • 一个可用性组,其中包含可用性数据库的两个同步提交副本。

此方案因其在 Azure 上的简单性而不是成本效益或其他因素,是一个不错的选择。 例如,可以通过使用域控制器作为两节点故障转移群集中的仲裁文件共享见证来减少两个副本可用性组的虚拟机数量,以在 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 订阅和服务的凭据(未编码)。 此文件的安全最佳做法是将其暂时存储在源目录之外(例如,在 Libraries\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 必须是唯一的,因为它们用于在 Internet 上分别标识云存储帐户和云服务器。
    • 为变量指定的名称 $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 虚拟机的位置。 如果之前更改 $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. 通过启动远程桌面文件连接到域控制器服务器。 使用在创建新 VM 时指定的计算机管理员用户名 AzureAdmin 和密码 Contoso!000

  2. 在管理员模式下打开 PowerShell 窗口。

  3. 运行以下 DCPROMO.EXE 命令,使用驱动器 M 上的数据目录设置 corp.contoso.com 域。

    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\安装 在域中创建计算机对象的权限。

    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. 运行以下管道命令,在故障转移群集中创建名为 ContosoQuorum 的第一个 VM:

    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 添加了访问终结点,以便客户端应用程序可以访问 Internet 上的这些 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 添加为 sysadmin 角色。

  • 仅 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. 在管理员模式下打开 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. 在管理员模式下打开 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 实例的 sysadmin 角色。

    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. 注销这两个虚拟机。

     logoff.exe
    

最后,您已准备好配置可用性组。 你将使用 SQL Server PowerShell 提供程序在 ContosoSQL1 上执行所有工作。

配置可用性组

  1. 通过启动远程桌面文件再次连接到 ContosoSQL1 。 使用 CORP\Install 登录,而不是使用计算机帐户登录。

  2. 在管理员模式下打开 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 实例启用 AlwaysOn 可用性组。

    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 中为 AlwaysOn 可用性组配置 ILB 侦听器

有关在 Azure 中使用 SQL Server 的其他信息,请参阅 Azure 虚拟机上的 SQL Server