銷售: 1-800-867-1380

教學課程:混合式 IT 中因應災害復原的資料庫鏡像

更新日期: 2014年4月

本教學課程示範如何在混合式 IT 環境中實作端對端 SQL Server 資料庫鏡像以利於災害復原。在這種組態下,主體資料庫伺服器是由內部部署執行,而鏡像資料庫伺服器則是在 Azure 中執行。您可以使用伺服器憑證實作這類案例,如此 Azure 與內部部署網路之間便不需要 VPN 連線。另外,如果您將 NAT 裝置上適當的通訊埠轉送至伺服器,主體資料庫伺服器就可以在內部部署 NAT 裝置後方執行。

在本教學課程中,您將使用 Azure 的 SQL Server 虛擬機器 (VM) 以及內部部署資料庫伺服器,部署非同步資料庫鏡像做為災害復原方案。教學課程結束時,您的 SQL Server 高可用性方案將會包含下列項目:

  • 執行於美國西部資料中心的虛擬網路

  • 部署於內部部署網路,在 NAT 裝置後方執行的 SQL Server 電腦 (SQLOnPrem)

  • 部署至美國西部 Azure 資料中心的 SQL Server VM (SQLInCloud)

  • SQLOnPrem 是主體資料庫伺服器

  • SQLInCloud 是鏡像資料庫伺服器

本教學課程用意為示範設定上述方案所需的步驟,但不會闡述每個步驟的細節。因此,本教學課程不會顯示 GUI 組態步驟,而是使用 PowerShell 和 Transact-SQL (T-SQL) 指令碼引導您快速進行每個步驟。指令碼會假設以下程序:

  1. 在要做為主體資料庫伺服器的內部部署電腦上,安裝 Windows Server 2008 R2。

  2. 將電腦連接到網際網路,並安裝所有更新。

  3. 中斷電腦與網際網路的連接,然後將電腦連接到與 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 視窗時,SQL Server 二進位檔案路徑就會包含在 PATH 環境變數中,因此您可以使用命令列工具和 SQL Server PowerShell 提供者設定資料庫鏡像。

    Exit
    
  11. 以系統管理員身分登入您的內部部署 NAT 裝置,並且新增通訊埠轉送規則,將通訊埠 5022 上的所有傳入流量指向 SQLOnPrem 的通訊埠 5022。如需有關設定 NAT 裝置的指示,請參閱裝置製造商提供的使用手冊。

    為 NAT 裝置的通訊埠 5022 設定通訊埠轉送之後,資料庫鏡像傳輸便能夠從 Azure VM 送至內部部署資料庫伺服器。

您現在已完成內部部署 SQL Server 組態。接下來,您將要設定 Azure 中的 SQL Server VM。

  1. 在連接到網際網路之電腦的 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 分別用於分辨網際網路上的雲端儲存體帳戶和雲端伺服器,因此必須是唯一的變數。此外,當您之後設定資料庫鏡像工作階段時,您將必須使用 $serviceName 的值。

    • 您會在稍後使用的虛擬網路組態文件中,設定變數 $affinityGroupName$virtualNetworkName$subnetName 的指定名稱。

    • $sqlImageName 指定包含 SQL Server 2012 Service Pack 1 Enterprise Edition 之 VM 映像的更新名稱。

  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 文件。簡而言之,此檔案會在同質群組 ContosoAG 中指定虛擬網路 ContosoNET,並具有位址空間 10.10.0.0/16Back 子網路或 10.1.1.0/24 是您放置 SQL Server VM 的位置。如果您變更上述 $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 VM。

    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 映像建立 VM 組態,它也會將作業系統磁碟設定為唯讀快取 (無寫入快取)。建議您將資料庫檔案移轉至您連接至 VM 的個別資料磁碟,並設定為無讀取或寫入快取。不過,由於內部部署資料庫伺服器使用 C 磁碟機來存放資料庫檔案,您將要放棄移動資料庫檔案。如此一來,Azure VM 可能會與組態中的內部部署伺服器相同。

    • Add-AzureProvisioningConfig 指定一部單獨的 Windows 電腦、設定系統管理員密碼,並且停用自動更新。

    • Add-AzureEndpoint 會加入兩個存取端點:通訊埠 1433 供內部部署用戶端應用程式連接使用,及通訊埠 5022 供透過網際網路進行資料庫鏡像。

    • New-AzureVM 建立新的雲端服務,並在此服務中建立新的 Azure VM。

  7. 等候新的 VM 完整佈建,並將遠端桌面檔案下載至您的工作目錄。等候迴圈會持續輪詢新的 Azure VM,直到已備妥可供使用為止。

    $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 VM 已啟用 TCP 通訊協定。不過,您仍必須開啟防火牆允許 SQL Server 的遠端存取。

現在可以準備開始了。請依照下列步驟進行,除另有註明者外,所有三部伺服器的作法都相同:

  1. 透過啟動遠端桌面檔案連接到 VM。使用您在建立 VM 時所指定的電腦系統管理員使用者名稱 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 VM 位於兩個不同的虛擬網路而不方便共用檔案,要跨 VM 複製檔案最簡單的方式就是從您的本機電腦將磁碟機附加至遠端桌面工作階段,然後再從附加的磁碟機交叉複製憑證。

  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. 將備份檔案複製到 SQLInCloud 的下列目錄中:C:\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 裝置向外界公開的 IP 位址,而非提供 SQLOnPrem 的主機名稱。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. SQLOnPrem 的 SSMS 中,使用 <uniqueservicename>.cloudapp.net 做為伺服器名稱及 [SQL Server 驗證] 當做驗證模式以連接到 SQLInCloud

  4. 經由與 SQLInCloud 建立的 Database Engine 連接,啟動資料庫鏡像監視器。如需詳細資訊,請參閱啟動資料庫鏡像監視器 (SQL Server Management Studio)

本文對您有任何幫助嗎?
(剩餘 1500 個字元)
感謝您提供意見
顯示:
© 2015 Microsoft