我们有一个在Azure上运行的Web应用程序,该应用程序执行其他数据库维护任务,例如创建数据库,删除未使用的数据库等。一切都在Azure SQL上运行。
此应用程序运行24/24,并且每小时执行维护任务。大多数情况下,每一个旋转都很好。但是,任务有时会出现像这样的错误:
- HTTP错误GatewayTimeOut:网关在指定的时间段内未从" Microsoft.sql"收到响应
- http错误serviceunavailable:请求时机
- sqlexception:执行超时到期。在完成操作或服务器完成之前已经过的超时时间未响应。
- sqlexception:与服务器成功建立了连接,但随后在前login握手期间发生了错误
发生这种情况时似乎无法到达数据库。
我们很高兴有人可以帮助我们调试问题。
预先感谢您。
有瞬态错误和其他类型的错误是Azure SQL数据库。瞬态故障错误通常显示为来自客户端程序的以下错误消息之一:
•服务器上的数据库目前尚不可用。请稍后重试连接。如果问题持续存在,请联系客户支持,并为他们提供
的会话跟踪ID•服务器上的数据库目前尚不可用。请稍后重试连接。如果问题持续存在,请与客户支持联系,并为他们提供会话跟踪ID。(Microsoft SQL Server,错误:40613)
•现有连接被远程主机强行关闭。
•System.Data.Entity.Core.Core.EntityCommandExecutionException:执行命令定义时发生了错误。有关详细信息,请参见内部例外。---> system.data.sqlclient.sqlexception:接收服务器结果时发生了传输级别的错误。(提供商:会话提供商,错误:19-物理连接不可用)
•与辅助数据库的连接尝试失败,因为数据库正在重新配置的过程中,并且在主数据库上的主动横向中间忙于应用新页面。
因为这些错误,此处有更多解释。有必要在连接到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.
}
}
更多关于如何在此处创建重试逻辑的更多信息。
节流也是超时的原因。以下查询可能会帮助您了解工作负载对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; =转到下一个层