共用方式為


教學課程:從 SQL Server 設定Microsoft網狀架構鏡像資料庫

Fabric 中的鏡像是企業級、基於雲端的、零ETL的SaaS技術。 在本節中,您將瞭解如何建立鏡像 SQL Server 資料庫,以在 OneLake 中建立 SQL Server 數據的唯讀、持續復寫複本。

這很重要

這項功能目前處於預覽階段。

先決條件

Fabric 的資料庫主體

接下來,您必須建立一種方式,讓 Fabric 服務向 SQL Server 實例進行驗證。

您可以使用登入和對應的資料庫使用者來完成此作業。

使用登入帳號和對應的資料庫使用者

請遵循 SQL Server 2025 或 SQL Server 2016-2022 的這些步驟,來建立用於資料庫鏡像的登入和資料庫使用者。

  1. 使用像是 SQL Server Management Studio (SSMS) 或 Visual Studio Code 的 mssql 擴充功能 等 T-SQL 查詢工具連線到 SQL Server 執行個體。

  2. 連線至 master 資料庫。 建立伺服器登入並指派適當的權限。

    • 建立名為 fabric_login 的 SQL 驗證登入。 您可以為此登入選擇任何名稱。 提供您自己的強式密碼。 在 master 資料庫中執行下列 T-SQL 指令碼:
    CREATE LOGIN [fabric_login] WITH PASSWORD = '<strong password>';
    ALTER SERVER ROLE [##MS_ServerStateReader##] ADD MEMBER [fabric_login];
    
    • 或者,以 Microsoft Entra 系統管理員身分登入,並從現有帳戶建立 Microsoft Entra ID 驗證的登入。 在 master 資料庫中執行下列 T-SQL 指令碼:
    CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER;
    ALTER SERVER ROLE [##MS_ServerStateReader##] ADD MEMBER [bob@contoso.com];
    
  3. 連接到您計劃要同步至 Microsoft Fabric 的用戶資料庫。 建立連線到登入的資料庫使用者,並授與所需的最低許可權:

    針對 SQL 驗證的登入:

    CREATE USER [fabric_user] FOR LOGIN [fabric_login];
    GRANT SELECT, ALTER ANY EXTERNAL MIRROR, 
       VIEW SERVER SECURITY STATE, VIEW DATABASE SECURITY STATE, VIEW PERFORMANCE DEFINITION TO [fabric_user];
    

    或者,使用 Microsoft Entra 驗證的登入方式(推薦):

    CREATE USER [bob@contoso.com] FOR LOGIN [bob@contoso.com];
    GRANT SELECT, ALTER ANY EXTERNAL MIRROR, 
       VIEW SERVER SECURITY STATE, VIEW DATABASE SECURITY STATE, VIEW PERFORMANCE DEFINITION TO [bob@contoso.com];
    

連接到您的 SQL Server

設定 SQL Server 中的 Fabric 鏡像資料庫的指示和需求在 SQL Server 2025 中有所不同。 在 SQL Server 2025 中,已啟用 Azure Arc 的伺服器是與 Fabric 通訊的必要設定的一部分。 在 SQL Server 2025 之前,不需要 Azure Arc,而且復寫是以 異動數據擷取 (CDC) 為基礎。

將伺服器連線到 Azure Arc 並啟用管理身分識別

若要設定網狀架構鏡像,您必須為 SQL Server 2025 實例設定 Azure Arc。

  1. 將伺服器連線到 Azure Arc。請遵循 快速入門 - 將混合式機器與已啟用 Azure Arc 的伺服器連線中的步驟。

    針對在 AlwaysOn 可用性群組或故障轉移叢集實例組態中執行的 SQL Server 實例,所有節點都必須連線到 Azure Arc。

  2. 裝載網狀架構鏡像來源 SQL Server 實例的 Windows Server 上需要三個登錄機碼。 登錄機碼包含 Windows Server 系統指派受控識別 (SAMI) 的相關信息。 下列 PowerShell 腳本會新增三個登錄機碼、必要的文件系統許可權和受控識別。

    備註

    本節包含修改 Windows 登錄的腳本。 請確定您仔細遵循這些步驟。 為了增加保護,請在修改前備份登錄檔。 然後,如果發生問題,您可以還原登錄檔。 如需有關如何備份和還原登錄檔的詳細資訊,請參閱 如何在 Windows 中備份和還原登錄檔

    在下列位置會添加三個登錄機碼:

    • 針對預設實例: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQLServer\FederatedAuthentication
    • 針對具名實例: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL17.Instancename\MSSQLServer\FederatedAuthentication

    文稿會新增下列索引鍵:

    • ArcServerManagedIdentityClientId
    • ArcServerSystemAssignedManagedIdentityClientId
    • ArcServerSystemAssignedManagedIdentityTenantID

    執行下列 PowerShell 腳本,在裝載來源 SQL Server 實例的 Windows Server 上設定系統指派的受控識別 (SAMI) 和必要的登錄機碼。

     $apiVersion = "2020-06-01"
     $resource = "https://storage.azure.com/"
     $ep = $env:IDENTITY_ENDPOINT
     $msi = "arc"
     if (!$ep) {
         $msi = "vm"
         $ep = 'http://169.254.169.254/metadata/identity/oauth2/token'
     }
     $endpoint = "{0}?resource={1}&api-version={2}" -f $ep,$resource,$apiVersion
     $secretFile = ""
     try {
         Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'} -UseBasicParsing > $null
         $msi = "vm"
     } catch {
         if ($_.Exception.Response.Headers) {
             $wwwAuthHeader = $_.Exception.Response.Headers["WWW-Authenticate"]
             if ($wwwAuthHeader -match "Basic realm=.+") {
                 $secretFile = ($wwwAuthHeader -split "Basic realm=")[1]
             }
         }
     }
     $secret = ""
     if ($secretFile) {
         $msi = "arc"
         $secret = cat -Raw $secretFile
     }
     try {
         $response = Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'; Authorization="Basic $secret"} -UseBasicParsing
     } catch {
         Write-Output "Can not establish communication with IMDS service. You need either to have Azure Arc service installed or run this script on Azure VM."
     }
     if ($response) {
         $parts = (ConvertFrom-Json -InputObject $response.Content).access_token -split "\."
         $padLength = 4 - ($parts[1].Length % 4)
         if ($padLength -ne 4) { $parts[1] += "=" * $padLength }
         $payload = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($parts[1])) | ConvertFrom-Json
         $regPath = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"
         $instance = ""
         $regKey = Get-Item -Path $regPath
         $regKey.GetValueNames() | Where-Object { $regKey.GetValue($_) -match 'MSSQL17' } | ForEach-Object {
             $instance = $_
             $service = if ($instance -eq "MSSQLSERVER") { "MSSQLSERVER" } else { "MSSQL$" + $instance }
             $reginst = $regKey.GetValue($_)
             $regFed = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$($reginst)\MSSQLServer\FederatedAuthentication"
             if (-not (Test-Path -Path $regFed)) {
                 New-Item -Path $regFed -Force > $null
             }
             if ($msi -eq "arc") {
                 Write-Host "Registering Azure Arc MSI service for SQL Server instance: " $instance `n
                 Set-ItemProperty -Path $regFed -Name "ArcServerManagedIdentityClientId" -Value ""
                 Set-ItemProperty -Path $regFed -Name "ArcServerSystemAssignedManagedIdentityClientId" -Value $($payload.appid)
                 Set-ItemProperty -Path $regFed -Name "ArcServerSystemAssignedManagedIdentityTenantId" -Value $($payload.tid)
                 $svcPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$($service)"
                 if (Test-Path -Path $svcPath) {
                     $keyPath = Split-Path $secretFile
                     $svcKey = Get-Item -Path $svcPath
                     $sqlAccount = $svcKey.GetValue("ObjectName")
                     if ($sqlAccount -ne "LocalSystem") {
                         Write-Host "Permissioning folder" $keyPath "for SQL Server account" $sqlAccount `n
                         icacls $keyPath /grant "$($sqlAccount):(OI)(CI)R"
                         $group = "Hybrid agent extension applications"
                         $isMember = Get-LocalGroupMember -Group $group | Where-Object { $_.Name -eq $sqlAccount }
                         if (-not $isMember) {
                             Write-Host "Also adding SQL running account to local group: $group" `n
                             Add-LocalGroupMember -Group $group -Member $sqlAccount
                         } else {
                             Write-Host ""
                         }
                     }
                 }
             } else {
                 Write-Host "Registering Azure VM MSI service for SQL Server instance: " $instance `n
                 Set-ItemProperty -Path $regFed -Name "PrimaryAADTenant" -Value ""
                 Set-ItemProperty -Path $regFed -Name "OnBehalfOfAuthority" -Value "https://login.windows.net/"
                 Set-ItemProperty -Path $regFed -Name "FederationMetadataEndpoint" -Value "login.windows.net"
                 Set-ItemProperty -Path $regFed -Name "AzureVmManagedIdentityClientId" -Value ""
                 Set-ItemProperty -Path $regFed -Name "AzureVmSystemAssignedManagedIdentityClientId" -Value $($payload.appid)
                 Set-ItemProperty -Path $regFed -Name "AzureVmSystemAssignedManagedIdentityTenantId" -Value $($payload.tid)
             }
         }
         Write-Host "Registeration complete for:" `n "Client ID: " $($payload.appid) `n "Tenant ID: " $($payload.tid) `n
     } 
    

    這很重要

    針對在 Always On 可用性群組或故障轉移叢集實例組態中執行的 SQL Server 實例,請在每個節點上本機執行 PowerShell 腳本。

  3. 連接至本機 SQL Server 2025 執行個體。 當您連線時,請選取 [信任伺服器證書]。

  4. 查看受管理的身分識別:

    SELECT *
    FROM sys.dm_server_managed_identities;
    

    這應該會傳回 1 個具有正確 client_idtenant_id的數據列。 Identity_type 應該是「系統指派」。

在 Microsoft Fabric 中新增受控識別許可權

SQL Server 的受控識別是由 Microsoft Fabric 自動建立並授與許可權。

不過,對於在 Always On 可用性群組或故障轉移叢集實例組態中執行的 SQL Server 實例,每個次要節點的系統指派受控識別 (SAMI) 都必須被授與 Fabric 工作區的 參與者 許可權。 受控識別是由針對每個次要節點提供的PowerShell腳本所建立,而且必須手動授與 Fabric 許可權。

  1. 在 Fabric 入口網站中,向每個次要節點的管理身份授予 Fabric 權限。
    1. 在 [網狀架構] 工作區中,選取 [管理存取權]。

      Fabric 入口網站中 [管理存取] 按鈕的螢幕快照。

    2. 選取 [新增人員或群組]

    3. 在 [ 新增人員] 對話框中,尋找可用性群組或故障轉移叢集中每個節點的伺服器名稱。

    4. 將每個會員身分授予 參與者 角色。

      [新增人員] 對話框的螢幕快照,您可以在其中將每個節點新增至網狀架構參與者角色。

設定內部部署數據閘道

檢查網狀架構的網路需求,以存取您的 SQL Server。 您需要安裝內部部署資料閘道來鏡像資料。 請確定內部部署閘道機器的網路可以 連線到 SQL Server 實例。 如需詳細資訊,請參閱 如何保護 Microsoft Fabric 從 SQL Server 鏡像數據庫的數據

  1. 從官方Microsoft下載中心下載內部部署數據閘道
  2. 開始安裝。 請遵循 安裝內部部署數據閘道中的指示。
    • 提供您的Microsoft帳戶電子郵件位址。
    • 名稱: MyOPDG 或您想要的任何名稱。
    • 修復金鑰:提供強式修復金鑰。

建立鏡像 SQL 伺服器

  1. 開啟 Fabric 入口網站
  2. 使用現有的工作區,或建立新的工作區。
  3. 移動至「建立」 窗格。 選取 建立 圖示。
  4. 捲動以選取 [鏡像 SQL Server 資料庫]。
  5. 輸入要鏡像的 SQL Server 資料庫名稱,然後選取 [ 建立]。

將 Fabric 連線到您的 SQL Server 實例

若要啟用鏡像,您必須從 Fabric 連線到 SQL Server 實例,以從 Fabric 起始連線。 以下步驟將引導您完成建立到 SQL Server 的連接過程:

  1. [新增來源] 底下,選取 [SQL Server 資料庫]。 或者,從 OneLake 中樞選取現有的 SQL Server 連線。
  2. 如果您選取 [ 新增連線],請輸入 SQL Server 實例的連線詳細數據。
    • 伺服器:網狀架構將用來連線到 SQL Server 實例的完整伺服器名稱路徑,與 SSMS 所使用的相同。
    • 資料庫:輸入 SQL Server 的名稱。
    • 連線:建立新連線。
    • 連線名稱:提供自動名稱。 您可以變更。
    • 數據閘道: 選取您根據案例設定的內部部署數據閘道。
    • 驗證類型:選擇驗證方法,並提供您在 使用登入和對應的資料庫用戶中設定的身份主體。
    • 選取 [ 使用加密連線 ] 複選框。
  3. 選擇 連線

這很重要

在源資料庫中建立的任何細微安全性,都必須在 Microsoft Fabric 的鏡像資料庫中重新設定。 如需詳細資訊,請參閱 如何保護 Microsoft Fabric 從 SQL Server 鏡像數據庫的數據

啟動鏡像程序

  1. 依預設,[設定鏡像] 畫面可讓您鏡像資料庫中的所有資料。

    • 鏡像所有資料表示在啟動鏡像後建立的任何新資料表都會被鏡像。

    • (選擇性) 僅選擇要鏡像的特定物件。 停用 [鏡像所有資料] 選項,然後從資料庫選取個別資料表。

    在本教學課程中,我們會選取「鏡像所有資料」 選項。

  2. 選取 [建立鏡像資料庫]。 映射開始。

  3. 等候 2-5 分鐘。 然後,選取 監視複寫 以查看狀態。

  4. 幾分鐘後,狀態應該會變更為 [執行中],這表示資料表正在同步處理。

    如果您沒有看到資料表和對應的複寫狀態,請等待幾秒鐘,然後重新整理面板。

  5. 當他們完成資料表的初始複製時,日期就會在 [上次重新整理] 資料行中顯示。

  6. 現在您的資料已啟動並順利運行,Fabric 平台提供各種可用的分析場景。

監視織體鏡像

設定鏡像後,系統會將您導向至 [鏡像狀態] 頁面。 在此,您可監視複寫的目前狀態。

如需有關複寫狀態的更多信息和細節,請參閱 監控 Fabric 鏡像資料庫複寫

網狀架構入口網站的螢幕快照,其中顯示新鏡像SQL Server 資料庫的監視複寫狀態。

驗證 OneLake 中的數據

啟用並運行 Fabric Mirroring 後,您現在可以在 Microsoft Fabric 中從 SQL Server 資料庫進行查詢。 如需探索選項,請參閱 使用 Microsoft Fabric 探索鏡像資料庫中的資料

使用 SQL 分析端點查詢鏡像 SQL Server 資料庫中數據的螢幕快照。