销售电话: 1-800-867-1380

教程:Azure 中的 AlwaysOn 可用性组 (PowerShell)

更新时间: 2013年10月

note备注
有关同一方案的基于 GUI 的教程,请参阅测试实验室:在 Azure 中创建端到端 AlwaysOn 可用性组

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

  • 一个包含多个子网(包括前端子网和后端子网)的虚拟网络

  • Active Directory (AD) 域的域控制器

  • 部署到后端子网并加入 AD 域的两个 SQL Server 虚拟机

  • 具有节点多数仲裁模型的 3 节点 WSFC 群集

  • 具有可用性数据库的两个同步提交副本的可用性组

之所以选择此方案是因为其简易性,而非其成本效益或 Azure 上的其他功能。例如,你可最大程度减少 2 副本可用性组的虚拟机数目,以便通过将域控制器作为 2 节点 WSFC 群集中的仲裁文件共享见证服务器来节省 Azure 中的计算时间。通过此方法,上述配置中的虚拟机数目可以减少一个。

本教程介绍设置上述解决方案所需的步骤,但不详细阐述每一步的细节。因此,我们没有列出 GUI 配置步骤,而是借助 PowerShell 脚本带你迅速完成每个步骤。假设如下:

  1. 在本地计算机上的 PowerShell 窗口中,导入 Azure 模块,将发布设置文件下载到计算机,然后通过导入所下载的发布设置将 PowerShell 会话连接至你的 Azure 订阅。

    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 基础结构的一系列变量。

    $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 的虚拟机映像的更新名称。

    • 为了简便,在整个教程中使用同一密码 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="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://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>
    
  5. 创建与所创建的地缘组关联的存储帐户,然后将其设置为订阅中的当前存储帐户。

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName 
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  6. 在新的云服务和可用性集中创建 DC 服务器。

    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 创建虚拟机配置。

    • Add-AzureProvisioningConfig 提供独立 Windows 服务器的配置参数。

    • Add-AzureDataDisk 添加将用于保存 Active Directory 数据的数据磁盘,缓存选项设置为 None

    • New-AzureVM 创建新的云服务,并在新的云服务中创建新的 Azure 虚拟机。

  7. 请等待新虚拟机设置完毕,然后将远程桌面文件下载到工作目录中。由于新 Azure 虚拟机的设置要用很长时间,while 循环会持续轮询新虚拟机,直到其使用就绪。

    $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" 
    

现在已成功配置 DC 服务器。下一步,在 DC 服务器上配置 Active Directory 域。在本地计算机上使 PowerShell 窗口保持打开。稍后将再次使用它来创建两个 SQL Server 虚拟机。

  1. 通过启动远程桌面文件连接到 DC 服务器。使用计算机管理员的用户名 AzureAdmin 和密码 Contoso!000(在创建新虚拟机时指定二者)。

  2. 在管理员模式下打开 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"
    

    命令完成后,虚拟机会自动重新启动。

  4. 通过启动远程桌面文件再次连接到 DC 服务器。此时,以 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 服务实例、WSFC 群集和可用性组。CORP\SQLSvc1CORP\SQLSvc2 用作两个 SQL Server 虚拟机的 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 帐户需要 Read All PropertiesCreate Computer Objects 权限才能为 WSFC 群集创建 Active Direct 对象。默认情况下,已经将 Read All Properties 权限授予 CORP\Install,因此无需显式授予该权限。有关创建 WSFC 群集所需权限的详细信息,请参阅故障转移群集循序渐进指南:在 Active Directory 中配置帐户

现在已经完成了 Active Directory 和用户对象的配置,接下来创建两个 SQL Server 虚拟机并将它们加入该域中。

  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 子网中创建的第一个虚拟机。应通过运行 IPCONFIG 验证这是不是 DC 服务器的地址。

  2. 运行以下管接命令在 WSFC 群集中创建名为 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 创建具有所需可用性集名称的虚拟机配置。后续虚拟机将以该可用性集名称创建,因此会加入同一可用性集中。

    • Add-AzureProvisioningConfig 将虚拟机加入创建的 Active Directory 域中。

    • Set-AzureSubnet 将虚拟机放入 Back 子网。

    • New-AzureVM 创建新的云服务,并在新的云服务中创建新的 Azure 虚拟机。DnsSettings 参数指定新云服务中的服务器的 DNS 服务器具有 IP 地址 10.10.0.4,这是 DC 服务器的 IP 地址。需要该参数来启用云服务中的新虚拟机才能成功加入 Active Directory 域。如果没有该参数,配置虚拟机后必须在虚拟机中手动设置 IPv4 设置才能将 DC 服务器作为主 DNS 服务器,然后虚拟机才能加入 Active Directory 域。

  3. 运行以下管接命令来创建名为 ContosoSQL1ContosoSQL2 的 SQL Server 虚拟机。

    # 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 使用与 DC 服务器相同的可用性集名称,并使用虚拟机库中的 SQL Server 2012 Service Pack 1 Enterprise Edition 映像。它还将操作系统磁盘设置为只读缓存(无写缓存)。建议将这些数据库文件迁移到一个附加到虚拟机的独立数据磁盘中,并将其配置为无读或写缓存。不过,次优建议是移除操作系统磁盘上的写缓存,因为无法移除操作系统磁盘上的读缓存。

    • Add-AzureProvisioningConfig 将虚拟机加入创建的 Active Directory 域中。

    • Set-AzureSubnet 将虚拟机放入 Back 子网。

    • Add-AzureEndpoint 添加访问端点,以便客户端应用程序能够在 Internet 上访问这些 SQL Server 服务实例。为 ContosoSQL1ContosoSQL2 提供了不同端口。

    • New-AzureVM 在与 ContosoQuorum 相同的云服务中创建新的 SQL Server 虚拟机。如果这些虚拟机需要在同一可用性集中,则必须将它们放置在同一云服务中。

  4. 请等待每个虚拟机设置完毕,然后将其远程桌面文件下载到工作目录中。for 循环会循环访问三个新虚拟机,并为每个虚拟机执行上级大括号内的命令。

    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 虚拟机现在已配置并正在运行,但它们是使用默认选项与 SQL Server 一同安装的。

在本节中,需要修改将在 WSFC 群集和 SQL Server 安装中使用的三个服务器。具体而言:

  • (所有服务器)需要安装Failover Clustering功能。

  • (所有服务器)需要添加 CORP\Install 作为计算机管理员。

  • (仅限 ContosoSQL1 和 ContosoSQL2)需要添加 CORP\Install 作为默认数据库中的 sysadmin 角色。

  • (仅限 ContosoSQL1 和 ContosoSQL2)需要添加 NT AUTHORITY\System 作为具有以下权限的登录名:

    • 更改任何可用性组

    • 连接 SQL

    • 查看服务器状态

  • (仅限 ContosoSQL1 和 ContosoSQL2)在 SQL Server 虚拟机上已启用了 TCP 协议。但是,仍需打开防火墙允许远程访问 SQL Server。

现在,准备启动。从 ContosoQuorum 开始,执行以下步骤:

  1. 通过启动远程桌面文件,连接到 ContosoQuorum。使用计算机管理员的用户名 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 虚拟机,这些步骤相同。

  1. 通过启动远程桌面文件连接到这两个 SQL Server 虚拟机。使用计算机管理员的用户名 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 虚拟机中的 AlwaysOn 可用性组创建 WSFC 群集下载 CreateAzureFailoverCluster.ps1 到本地工作目录中。该脚本将帮助你创建一个正常运行的 WSFC 群集。有关 WSFC 如何与 Azure 网络交互的重要信息,请参阅 Azure 虚拟机中 SQL Server 的高可用性和灾难恢复

  8. 切换至工作目录并使用下载的脚本创建 WSFC 群集。

    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. ContosoSQL1 上创建一个名为 MyDB1 的数据库,获取完整备份和日志备份,然后使用 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 虚拟机上创建可用性组端点,并在这些端点上设置正确权限。

    $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 AlwaysOn。若要为此可用性组配置侦听器,请参阅Tutorial: Listener Configuration for AlwaysOn Availability Groups in Azure

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft