教程:从 SQL Server 配置 Microsoft Fabric 镜像数据库

Fabric 中的镜像是一种基于云的企业级零 ETL SaaS 技术。 本部分介绍如何创建镜像的 SQL Server 数据库,该数据库在 OneLake 中创建 SQL Server 数据的只读连续复制副本。

重要

此功能目前为预览版

先决条件

Fabric 的数据库主体

接下来,需要为 Fabric 服务创建一种向 SQL Server 实例进行身份验证的方法。

可以使用登录名和映射的数据库用户来完成此操作。

使用登录名和映射的数据库用户

  1. 使用 T-SQL 查询工具(如 SQL Server Management Studio(SSMS)Visual Studio Code 的 mssql 扩展连接到 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 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 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 并启用管理标识

若要配置 Fabric 镜像,需要为 SQL Server 2025 实例配置 Azure Arc。

  1. 请将服务器连接到 Azure Arc。按照《快速入门 - 将混合环境中的计算机连接到使用 Azure Arc 的服务器》中的步骤进行操作。

    对于在 AlwaysOn 可用性组或故障转移群集实例配置中运行的 SQL Server 实例,所有节点都必须连接到 Azure Arc。

  2. 在托管源 SQL Server 实例的 Windows Server 上需要三个注册表项以支持 Fabric Mirroring。 注册表项包括有关 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
     } 
    

    重要

    对于在 AlwaysOn 可用性组或故障转移群集实例配置中运行的 SQL Server 实例,请在每个节点上本地运行 PowerShell 脚本。

  3. 连接到本地 SQL Server 2025 实例。 连接时,选择 “信任服务器证书”。

  4. 查看托管标识:

    SELECT *
    FROM sys.dm_server_managed_identities;
    

    这应返回 1 行,其中包含正确的 client_idtenant_idIdentity_type 应为“系统分配”。

在 Microsoft Fabric 中添加托管标识权限

SQL Server 的托管标识由 Microsoft Fabric 自动创建和授予权限。

但是,对于在 AlwaysOn 可用性组或故障转移群集实例配置中运行的 SQL Server 实例,需要为每个辅助节点的系统分配托管标识(SAMI)授予对 Fabric 工作区的 参与者 权限。 托管标识由为每个辅助节点提供的 PowerShell 脚本创建,必须手动授予 Fabric 权限。

  1. 在 Fabric 门户中,向每个辅助节点的托管标识授予 Fabric 权限。
    1. 在 Fabric 工作区中,选择“ 管理访问权限”。

      Fabric 门户中“管理访问”按钮的屏幕截图。

    2. 选择“添加人员或组”。

    3. “添加人员 ”对话框中,查找可用性组或故障转移群集中每个节点的服务器名称。

    4. 将每个成员身份分配给 贡献者 角色。

      “添加人员”对话框的屏幕截图,可在其中将每个节点添加到 Fabric 参与者角色。

配置本地数据网关

检查您为 Fabric 访问 SQL Server 所需的网络要求。 需要 安装本地数据网关 来镜像数据。 确保本地网关计算机的网络可以 连接到 SQL Server 实例。 有关详细信息,请参阅 如何:从 SQL Server 保护 Microsoft Fabric 镜像数据库中的数据

  1. 从官方Microsoft下载中心下载本地数据网关
  2. 开始安装。 请按照 安装本地数据网关中的说明进行操作。
    • 提供Microsoft帐户电子邮件地址。
    • 名称: MyOPDG 或所需的任何名称。
    • 恢复密钥:提供强大的恢复密钥。

创建一个镜像的 SQL Server

  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 实例的连接详细信息。
    • 服务器:Fabric 将用于访问 SQL Server 实例的完全限定服务器名称路径,与用于 SSMS 的服务器名称路径相同。
    • 数据库:输入 SQL Server 的名称。
    • 连接:创建新连接。
    • 连接名称:会自动提供名称。 无法更改它。
    • 数据网关: 选择您根据方案设置的本地数据网关。
    • 身份验证类型:选择身份验证方法并提供在 “使用登录名和映射数据库用户”中设置的主体。
    • 选中“ 使用加密连接 ”复选框。
  3. 选择 连接

重要

必须在 Microsoft Fabric 的镜像数据库中重新配置在源数据库中建立的任何精细安全性设置。 有关详细信息,请参阅 如何:从 SQL Server 保护 Microsoft Fabric 镜像数据库中的数据

启动镜像过程

  1. “配置镜像”屏幕允许你镜像数据库中的所有数据,这是默认选项。

    • 镜像所有数据意味着,镜像启动后创建的任何新表都会被镜像。

    • 也可选择只镜像某些对象。 禁用“镜像所有数据”选项,然后从数据库中选择单独的表。

    在本教程中,我们将选择“镜像所有数据”选项。

  2. 选择“ 创建镜像数据库”。 镜像开始。

  3. 等待 2-5 分钟。 然后,选择“监视复制”以查看状态。

  4. 几分钟后,状态应变为“正在运行”,这表明正在同步表。

    如果未看到表和相应的复制状态,请等待几秒钟,然后刷新面板。

  5. 完成表的初始复制后,“上次刷新”列中会显示一个日期。

  6. 现在,你的数据已启动并运行,整个 Fabric 中具有各种可用的分析场景。

监视结构镜像

配置镜像后,将定向到“镜像状态”页。 可以在此处监视复制的当前状态。

有关复制状态的详细信息和细节,请参阅监视 Fabric 镜像数据库复制

Fabric 门户的屏幕截图,显示了新镜像 SQL Server 数据库的监控复制状态。

验证 OneLake 中的数据

在 Fabric 镜像启动并运行后,现在可以从 Microsoft Fabric 中的 SQL Server 数据库进行查询。 有关可能性,请参阅 使用 Microsoft Fabric 浏览镜像数据库中的数据

使用 SQL 分析终结点查询镜像 SQL Server 数据库中数据的屏幕截图。