Azure Web作业中调用的Azure SQL数据库有时会发生超时错误

时间:2017-11-30 13:00:06

标签: timeout azure-sql-database azure-webjobs

我们在Azure上运行一个Web应用程序,它执行各种数据库维护任务,如创建数据库,删除未使用的数据库等。一切都在Azure SQL上运行。

此应用程序24/24运行,每小时执行一次维护任务。大多数时候,每次都很顺利。但是,任务有时最终会出现错误:

  • HTTP错误GatewayTimeout:网关未在指定时间段内收到“Microsoft.Sql”的响应
  • HTTP错误ServiceUnavailable:请求超时
  • SQLException:执行超时已过期。操作完成之前经过的超时时间或服务器没有响应。
  • SQLException:与服务器成功建立连接,但在登录前握手期间发生错误

发生这种情况时似乎无法访问数据库。

如果有人可以帮助我们调试问题,我们很高兴。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

Azure SQL数据库中存在瞬时错误和其他类型的错误。瞬态故障错误通常表现为来自客户端程序的以下错误消息之一:

•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并为其提供会话跟踪ID

•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并为其提供会话跟踪ID。 (Microsoft SQL Server,错误:40613)

•远程主机强行关闭现有连接。

•System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:会话提供者,错误:19 - 物理连接不可用)

•对辅助数据库的连接尝试失败,因为数据库正处于重新配置过程中,并且在主数据库上处于活动转换过程中时正忙于应用新页面。

由于这些错误而更多解释here。有必要在连接到Azure SQL数据库的应用程序上创建重试逻辑。

public void HandleTransients()
{
    var connStr = "some database";
    var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy(
        retryCount: 3,
        retryInterval: TimeSpan.FromSeconds(5));

    using (var conn = new ReliableSqlConnection(connStr, _policy))
    {
        // Do SQL stuff here.
    }
}

有关如何创建重试逻辑here的更多信息。

节流也是导致超时的原因。以下查询可帮助您了解工作负载对Azure SQL数据库的影响。

SELECT 
    (COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats

- 服务水平目标(SLO)为99.9%&lt; =进入下一层