导出 (0) 打印
全部展开

教程:混合 IT 环境中用于实现灾难恢复的数据库镜像

更新时间: 2014年4月

本教程介绍如何在混合 IT 环境中实现 SQL Server 数据库镜像以进行端到端灾难恢复。在此配置中,主体数据库服务器在内部运行,而镜像数据库服务器在 Azure 中运行。如果使用服务器证书,则可在 Azure 与内部网络之间没有 VPN 连接的情况下实现此应用场景。此外,如果将内部 NAT 设备上的相应端口转发到主体数据库服务器,则可在 NAT 设备后运行服务器。

在本教程中,你将使用 Azure 中的 SQL Server 虚拟机 (VM) 和内部数据库服务器部署异步数据库镜像作为灾难恢复解决方案。在本教程的结尾,你的 SQL Server 高可用性解决方案将由以下要素组成:

  • 一个运行在美国西部数据中心内的虚拟网络

  • 在内部网络中部署的一个 SQL Server 计算机 (SQLOnPrem),运行在 NAT 设备后

  • 一个 SQL Server 虚拟机 (SQLInCloud),部署到美国西部数据中心内的 Azure

  • SQLOnPrem 是主体数据库服务器

  • SQLInCloud 是镜像数据库服务器

本教程介绍设置上述解决方案所需的步骤,但不详细阐述每一步的细节。因此,并未列出 GUI 配置步骤,而是通过 PowerShell 和 Transact-SQL (T-SQL) 脚本带你迅速完成每一步。假设如下:

  1. 在将用于主体数据库服务器的内部计算机上安装 Windows Server 2008 R2。

  2. 将计算机连接至 Internet 并安装所有更新。

  3. 断开计算机与 Internet 的连接,然后将其连接至 VPN 设备所在的子网。

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

  5. 如果尚未将计算机名称改为 SQLOnPRem,则执行此操作。

    $computerName = "SQLOnPrem"
    netdom renamecomputer $env:COMPUTERNAME /newname:$computerName /force /reboot
    

    运行上述命令后,计算机会自动重启。

  6. 计算机完成重启后,以本地管理员身份重新登录,并在管理员模式下打开 Windows PowerShell 窗口。

  7. $installDir 中指定包含 SQL Server 安装程序文件的目录,并在计算机上安装 SQL Server 2012 和 SQL Server Management Studio (SSMS)。在安装过程中指定 SSMS 功能将导致安装命令行工具和 PowerShell 提供程序。

    $installDir = "<Directory of SQL Server Setup.exe>"
    
    cd $installDir
    .\Setup.exe `
        /q `
        /ACTION=Install `
        /FEATURES=SQL,SSMS `
        /INSTANCENAME=MSSQLSERVER `
        /SQLSYSADMINACCOUNTS="Administrator" `
        /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. 退出当前的 PowerShell 窗口。下次打开 PowerShell 窗口时,将在 PATH 环境变量中加入 SQL Server 二进制文件路径,以使你可使用命令行工具和 SQL Server PowerShell 提供程序设置数据库镜像。

    Exit
    
  11. 以管理员身份登录到本地 NAT 设备,然后添加一个端口转发规则,该规则将端口 5022 上的所有入站流量指向 SQLOnPrem 的端口 5022。有关设置 NAT 设备的说明,请参阅各自制造商提供的用户手册。

    在 NAT 设备上为端口 5022 配置端口转发使数据库镜像流量可从 Azure 虚拟机发往内部数据库服务器。

现在,你已完成内部 SQL Server 配置。接下来,你将配置 Azure 中的 SQL Server 虚拟机。

  1. 在连接至 Internet 的计算机上打开 PowerShell 窗口,定义一系列用于创建云 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"
    $subnetName = "Back"
    

    请注意以下几点,以确保后面的命令可以成功执行:

    • 变量 $storageAccountName$serviceName 分别用于标识 Internet 上的云存储帐户和云服务器,因此必须唯一。并且,在随后配置数据库镜像会话时,你需要使用 $serviceName 的值。

    • 在稍后将使用的虚拟网络配置文档中配置为变量 $affinityGroupName$virtualNetworkName$subnetName 指定的名称。

    • $sqlImageName 指定包含 SQL Server 2012 Service Pack 1 Enterprise Edition 的虚拟机映像的更新名称。

  2. 导入 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 服务。

  3. 创建地缘组。

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. 通过导入名为 NetworkConfig.xml 的配置文件来创建虚拟网络。

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    配置文件包含以下 XML 文档。简而言之,它指定了一个名为 ContosoNET(位于名为 ContosoAG 的地缘组中)的虚拟网络并拥有地址空间 10.10.0.0/16。将在 Back 子网(即 10.1.1.0/24)放置你的 SQL Server 虚拟机。如果以前更改过 $affinityGroupName$virtualNetworkName$subnetName 变量,则还必须在下方更改相应名称。

    <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="Back">
                <AddressPrefix>10.10.1.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. 在新的云服务中创建 SQL Server 虚拟机。

    New-AzureVMConfig `
        -Name $sqlServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sqlServerName.vhd" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -Password $vmAdminPassword `
            -AdminUserName $vmAdminUser `
            -DisableAutomaticUpdates ` |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1433 `
                    -LocalPort 1433 | 
                    Add-AzureEndpoint `
                        -Name "SQL" `
                        -Protocol "mirroring" `
                        -PublicPort 5022 `
                        -LocalPort 5022 | 
                        New-AzureVM `
                            -ServiceName $serviceName `
                            –AffinityGroup $affinityGroupName `
                            -VNetName $virtualNetworkName
    

    这一系列的管接命令执行以下操作:

    • New-AzureVMConfig 使用虚拟机库中的 SQL Server 2012 Service Pack 1 Enterprise Edition 映像创建虚拟机配置。它还将操作系统磁盘设置为只读缓存(无写缓存)。建议将这些数据库文件迁移到一个附加到虚拟机的独立数据磁盘中,并将其配置为无读或写缓存。但是,由于内部数据库服务器使用 C 驱动器保存数据库文件,因此需要提前迁移数据库文件。这样,Azure 虚拟机可与配置中的内部服务器完全相同。

    • Add-AzureProvisioningConfig 指定独立 Windows 计算机、设置管理员密码并禁用自动更新。

    • Add-AzureEndpoint 添加两个访问终结点:端口 1433 用于从本地客户端应用程序进行连接,端口 5022 用于通过 Internet 进行数据库镜像。

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

  7. 请等待新虚拟机设置完毕,然后将远程桌面文件下载到工作目录中。该 while 循环不断轮询新的 Azure 虚拟机,直至其准备就绪。

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

在本节中,你需要修改所有三个服务器上所装 SQL Server 的默认设置。具体而言,SQL Server 虚拟机上已启用 TCP 协议。但是,仍需打开防火墙允许远程访问 SQL Server。

现在,准备启动。按以下步骤进行操作,除另行说明的内容之外,这些步骤对于所有这三个服务器完全相同:

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

  2. 等待 SQL Server 安装完成自动初始化任务,然后继续。

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

  4. 打开防火墙允许远程访问 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
    

此时即准备就绪,可在这两个服务器上配置数据库镜像。为执行后续步骤,使 PowerShell 窗口保持打开。

  1. SQLOnPrem 上,在 PowerShell 窗口中运行 SQLCMD.EXE,然后创建并备份服务器证书。

    SQLCMD -S SQLOnPrem
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#1>';
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert WITH SUBJECT = 'SQLOnPrem certificate';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLOnPrem_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLOnPrem_cert TO FILE = 'SQLOnPrem_cert.cer';
    GO 
    
  2. SQLInCloud 上,在 PowerShell 窗口中运行 SQLCMD.EXE,然后创建并备份服务器证书。

    SQLCMD -S SQLInCloud
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert WITH SUBJECT = 'SQLInCloud certificate for database mirroring';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLInCloud_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLInCloud_cert TO FILE = 'SQLInCloud_cert.cer';
    GO
    
  3. 证书将保存到默认的数据目录:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA。在两个服务器上将证书复制到同一目录,以使每个服务器都拥有来自其他两个服务器的证书。由于两个 SQL Server 虚拟机位于两个不同的虚拟网络中,并且共享文件比较困难,因此在虚拟机之间复制文件的最简单方式为将本地计算机上的某个磁盘驱动器连接到远程桌面会话,然后将证书复制到所连接的这个磁盘驱动器和从其复制证书。

  4. SQLOnPrem 上,使用 SQLInCloud 的证书向其授予登录权限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLInCloud_cert.cer';
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  5. SQLInCloud 上,使用 SQLOnPrem 的证书向其授予登录权限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLOnPrem_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  6. SQLOnPrem 上,创建一个数据库,然后进行一次完整备份和一次日志备份。

    CREATE database MyDB1
    GO
    
    BACKUP DATABASE MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak';
    GO
    
    BACKUP LOG MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log';
    GO 
    
    
  7. 将备份文件复制到以下目录中的 SQLInCloudC:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP

  8. SQLInCloud 上,用 WITH NORECOVERY 选项还原数据库备份,然后使它成为镜像伙伴。

    RESTORE DATABASE MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak' WITH NORECOVERY;
    GO
    
    RESTORE LOG MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log' WITH NORECOVERY;
    GO
    
    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<NAT_PUBLIC_IP_ADDRESS>:5022';
    GO
     
    
    

    注意,必须为内部 NAT 设备而非 SQLOnPrem 的主机名提供公共 IP 地址。SQLInCloud 无法直接连接到 SQLOnPrem,因此必须将流量从 NAT 设备转发到 SQLOnPrem。已在内部 NAT 设备上为端口 5022 配置了端口转发,因此 ALTER DATABASE 命令应成功。

  9. SQLOnPrem 上,使 SQLOnPrem 成为镜像伙伴。

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<uniqueservicename>.cloudapp.net:5022';
    GO
    

    请注意,将使用唯一云服务名称 <uniqueservicename>.cloudapp.net 而不使用 SQLInCloud 的主机名。在创建 SQLInCloud 时,已打开了默认数据库镜像端点,端口 5022。

祝贺你!你已成功地使用证书在混合 IT 环境中设置了数据库镜像。注意,由于服务器使用云服务名称和 NAT 设备而非实例名称访问对方,因此数据库镜像监视器无法连接到远程服务器的实例名称以查询状态。若要在数据库镜像监视器中监视数据库镜像会话,请按下方的说明进行操作:

  1. SQLInCloud 上,启用 SQL Server 身份验证。有关详细信息,请参阅更改服务器身份验证模式

  2. SQLInCloud 上,创建一个使用 SQL Server 身份验证的 sysadmin 用户。有关详细信息,请参阅创建登录名

  3. 在 SSMS 中的 SQLOnPrem 上,将 <uniqueservicename>.cloudapp.net 用作服务器名称,将“SQL Server 身份验证”用作身份验证模式,连接至 SQLInCloud

  4. 通过与 SQLInCloud 建立的数据库引擎连接,启动数据库镜像监视器。有关详细信息,请参阅启动数据库镜像监视器 (SQL Server Management Studio)

显示:
© 2015 Microsoft