排查专用 SQL 池上的连接问题

适用对象:Azure Synapse Analytics

专用 SQL 池上发生的连接问题可能会产生各种原因。 本文提供了工具和方法,可帮助你排查最常见的连接问题。

初始连接清单

以下列表描述了专用 SQL 池上连接问题经常被忽视的原因。 检查列表以查看如何解决这些问题。

任务说明 解决方法
检查 Azure 服务中断。 检查 Microsoft Azure 服务仪表板 ,查看是否存在任何已知问题。
检查服务可用性。 在Azure 门户中,转到尝试连接到的专用 SQL 池,然后选择“诊断”并解决左侧窗格中的问题检查服务可用性
检查已暂停的操作或正在缩放的操作。 查看你的服务当前是否已暂停或正在缩放。 在 Azure 门户中,转到你要尝试连接的专用 SQL 池。 有关详细信息,请参阅 故障排除文档
检查Azure 门户中的“资源运行状况”边栏选项卡,了解状态更新。 不可用状态意味着资源运行状况检测到一致的登录失败,因为 SQL 数据库中出现系统错误。 降级状态表示资源运行状况已检测到大部分成功登录,但也有一些故障。 这些登录失败可能是由暂时性错误引起的。
检查防火墙设置。 专用 SQL 池通过端口 1433 进行通信。 如果尝试从企业网络内部进行连接,则该网络的防火墙可能不允许经端口 1433 的出站流量。 在这种情况下,你无法连接到 Azure SQL 数据库服务器,除非 IT 部门打开了端口 1433。 有关详细信息,请参阅创建和管理 IP 防火墙规则
检查虚拟网络/服务终结点设置。 如果看到错误“40914”和“40615”,请参阅常见错误消息参考部分中的错误说明和解决方法
检查最新的驱动程序。 验证是否正在使用 最新版本的工具和驱动程序 连接到专用 SQL 池。 有关详细信息,请参阅检查最新驱动程序

资源:
* 使用 Azure 门户连接和管理专用 SQL 池
* 使用 PowerShell 连接和管理专用 SQL 池。
检查连接字符串。 验证是否已正确设置连接字符串。 检查连接字符串以查看有关 ADO.NET、ODBC、PHP 和 JDBC 的一些示例连接字符串。 请参阅有关连接字符串的其他信息

排查持久性连接错误

Azure SQL 连接检查器是一个 PowerShell 脚本,可自动执行一系列检查以发现最常见的配置问题。 脚本检测到的大多数问题都附带解决问题的建议。

以下 PowerShell 脚本下载并运行最新版本的 Azure SQL 连接检查器。 可以从发生持久连接问题的任何客户端计算机运行它。

备注

  • 若要在 Linux 中运行测试,请从无法访问 Internet 的计算机或容器化环境运行测试,请参阅 GitHub 上的 SQL 连接检查器。
  • 有关更多 PowerShell 命令,请参阅可用的 PowerShell 命令
  1. 打开 Windows PowerShell ISE(如果可能,请使用管理员模式)。

    备注

    若要将网络跟踪与测试(CollectNetworkTrace 参数)一起收集,必须以管理员身份运行 PowerShell。

  2. 打开新建脚本窗口。

  3. 将以下文本复制并粘贴到脚本窗口中:

    $parameters = @{
    # Supports Single, Elastic Pools and Managed Instance (MI public endpoint is supported)
    # Supports Azure Synapse / Azure SQL Data Warehouse (*.sql.azuresynapse.net / *.database.windows.net)
    # Supports Public Cloud (*.database.windows.net), Azure China (*.database.chinacloudapi.cn), Azure Germany (*.database.cloudapi.de) and Azure Government (*.database.usgovcloudapi.net)
    Server = '.database.windows.net' # or any other supported FQDN
    Database = ''  # Set the name of the database you wish to test, 'master' will be used by default if nothing is set
    User = ''  # Set the login username you wish to use, 'AzSQLConnCheckerUser' will be used by default if nothing is set
    Password = ''  # Set the login password you wish to use, 'AzSQLConnCheckerPassword' will be used by default if nothing is set
    
    # Optional parameters (default values will be used if omitted)
    SendAnonymousUsageData = $true  # Set as $true (default) or $false
    RunAdvancedConnectivityPolicyTests = $true  # Set as $true (default) or $false, this will load the library from Microsoft's GitHub repository needed for running advanced connectivity tests
    ConnectionAttempts = 1 # Number of connection attempts while running advanced connectivity tests
    DelayBetweenConnections = 1 # Number of seconds to wait between connection attempts while running advanced connectivity tests
    CollectNetworkTrace = $true  # Set as $true (default) or $false
    #EncryptionProtocol = '' # Supported values: 'Tls 1.0', 'Tls 1.1', 'Tls 1.2'; Without this parameter operating system will choose the best protocol to use
     }
    
    $ProgressPreference = "SilentlyContinue";
    if ("AzureKudu" -eq $env:DOTNET_CLI_TELEMETRY_PROFILE) {
    $scriptFile = '/ReducedSQLConnectivityChecker.ps1'
    } else {
    $scriptFile = '/AzureSQLConnectivityChecker.ps1'
    }
    $scriptUrlBase = 'http://raw.githubusercontent.com/Azure/SQL-Connectivity-Checker/master'
    cls
    Write-Host 'Trying to download the script file from GitHub (https://github.com/Azure/SQL-Connectivity-Checker), please wait...'
    try {
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
    Invoke-Command -ScriptBlock ([Scriptblock]::Create((Invoke-WebRequest ($scriptUrlBase + $scriptFile) -UseBasicParsing -TimeoutSec 60).Content)) -ArgumentList $parameters
    }
    catch {
    Write-Host 'ERROR: The script file could not be downloaded:' -ForegroundColor Red
    $_.Exception
    Write-Host 'Confirm this machine can access https://github.com/Azure/SQL-Connectivity-Checker/' -ForegroundColor Yellow
    Write-Host 'or use a machine with Internet access to see how to run this from machines without Internet. See how at https://github.com/Azure/SQL-Connectivity-Checker/' -ForegroundColor Yellow
    }
    #end
    
  4. 设置脚本的参数。

    • 指定服务器名称和数据库名称。
    • 指定用户和密码信息。

      备注

      此步骤是可选的,但最佳做法是。

  5. 运行该脚本。 结果会显示在输出窗口中。 如果用户有权创建文件夹,则会创建包含生成的日志文件的文件夹以及.zip文件(AllFiles.zip)。 在 Windows 中,该文件夹在脚本完成运行后自动打开。

  6. 检查输出中是否存在任何检测到的问题,并按照建议的步骤解决问题。 如果无法解决问题,请在创建支持请求时,使用“详细信息”步骤中的“文件上传”选项将文件发送到AllFiles.zipMicrosoft。

排查间歇性连接错误

请确保所有生产应用程序都具有可靠的重试逻辑来处理删除的连接和暂时性错误。

网关的连接策略配置问题

Azure SQL 数据库网关终止空闲超过 30 分钟的会话。 此方案经常影响共用的空闲连接。 对于专用 SQL 池(以前称为 SQL DW),可将服务器的连接策略代理切换为重定向。 重定向设置在连接后会绕过网关。 这样就消除了问题。

Microsoft JDBC Driver 中的 TCP KeepAlive

Microsoft JDBC 驱动程序和某些第三方驱动程序未启用 TCP KeepAlive。 这会导致 TCP 网络层在特定空闲时段后删除连接。 验证是否安装了最新的客户端驱动程序以及驱动程序是否启用 KeepAlive

超时配置

连接到 Synapse SQL 池的所有应用程序都应使用至少 15 秒的登录超时。 在数据库重新配置期间,较短的持续时间可能会遇到超时。

高资源使用率

  • 检查是否在服务器上遇到大量排队请求的负载。 可能需要纵向扩展数据仓库以获取 更多资源
  • 尝试在客户端应用程序中添加 重试逻辑 ,以帮助缓解这些情况,并使错误对用户透明。
  • Azure Synapse Analytics 在 Azure 门户中提供了丰富的监视体验,可以显示与数据仓库工作负载相关的见解。 可以查看 CPU、内存和本地tempdb使用情况,因为它与 azure Monitor 中Azure 门户的工作负荷相关。

常见错误消息参考

使用此表可查找尝试连接到专用 SQL 池时收到的最常见错误消息的说明和缓解措施。

错误消息 说明和缓解
错误 18456:用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。 (Microsoft SQL Server,错误:18456) 当Microsoft Entra 用户尝试连接到 master 数据库但主数据库中没有用户时,会发生此错误。 若要更正此问题,请指定要在连接时连接到的专用 SQL 池,或将用户添加到 master 数据库。 有关详细信息,请参阅 安全概述 和 [状态和说明的登录错误](/sql/relational-databases/errors-events/ 的 SAS 令牌。 请考虑切换到托管标识Microsoft Entra 直通身份验证以访问受保护的存储。 有关详细信息,请参阅 授予对受信任 Azure 服务 的访问权限,以及 控制无服务器 SQL 池的存储帐户访问权限。
错误 916:服务器主体“MyUserName”无法访问当前安全上下文下的数据库“master”。 无法打开用户默认数据库。 登录失败。 用户“MyUserName”的登录失败。 (Microsoft SQL Server,错误:916) 当Microsoft Entra 用户尝试连接到 master 数据库但主数据库中没有用户时,会发生此错误。 若要更正此问题,请指定要在连接时连接到的专用 SQL 池,或将用户添加到 master 数据库。 有关详细信息,请参阅 安全概述 和登录错误以及 状态和说明
错误 40613:服务器 Y 上的数据库 X 当前不可用 错误 40613 是 Azure 在数据库不可用时返回的非特定 暂时性错误 。 在出现错误“40613”期间,应偶尔会出现短暂的时间段(例如小于 60 秒)。若要适应此方案,请确保所有生产应用程序都具有可靠的 重试逻辑
错误 40615:无法打开登录请求的服务器“{0}”。 不允许 IP 地址为“”{1}的客户端访问服务器 客户端尝试从无权连接到Azure SQL 数据库服务器的 IP 地址进行连接。 服务器防火墙没有 IP 地址规则允许客户端从给定 IP 地址与 SQL 数据库进行通信。 在Azure 门户资源防火墙设置中,输入客户端的 IP 地址作为新 IP 规则。 此处收录了多个 SQL 数据库错误消息的列表。
错误 40914:无法打开登录请求的服务器 <服务器名称> 。 不允许客户端访问服务器 在此方案中,客户端位于具有虚拟网络服务器终结点的子网中。 但是,Azure SQL 数据库服务器没有授予与子网SQL 数据库通信的权限的虚拟网络规则。 在 Azure 门户的防火墙窗格中,使用虚拟网络规则控件为子网添加虚拟网络规则
错误 9002:“数据库数据库 <名称> 的事务日志已满,因为”ACTIVE_TRANSACTION”。 (Microsoft SQL Server,错误: 9002) 此错误通常表示尚未提交的长时间运行的事务,或者存在非响应会话。 这会生成完整的事务日志。 检查是否存在记录 SELECT * FROM sys.dm_exec_sessions, and end them by using KILL <session_id>的挂起会话。 如果没有挂起会话,可能需要取消长时间运行的查询或终止该会话来缓解此问题。
建立与 SQL Server 的连接时,出现网络相关或特定于实例的错误。 找不到或无法访问该服务器。 请验证实例名称是否正确,SQL Server 是否已配置为允许远程连接。 SQL 数据库或 Azure Synapse 中的专用 SQL 池(以前称为 SQL DW)的登录名可以在某个区域中的任何网关上登陆。 为了一致地连接到 Azure Synapse 中的SQL 数据库或专用 SQL 池(以前为 SQL DW),允许网络流量传入和传出该区域的所有网关 IP 地址和子网。 请参阅网关 IP 地址
无法打开文件,因为它不存在或被另一个进程使用 如果查询失败并返回此错误消息,并且你验证该文件是否存在且未由另一个进程使用,则无服务器 SQL 池无法访问该文件。 如果存储受防火墙保护,请查看查询防火墙保护存储中所述的步骤。
未能执行查询。 错误:由于无法列出目录的内容,因此无法访问外部表 <> 。 如果使用防火墙保护存储,请参阅 查询防火墙保护的存储。 使用前面的 PowerShell 脚本验证是否已正确配置存储帐户网络规则。

资源