我们在Azure上运行一个Web应用程序,它执行各种数据库维护任务,如创建数据库,删除未使用的数据库等。一切都在Azure SQL上运行。
此应用程序24/24运行,每小时执行一次维护任务。大多数时候,每次都很顺利。但是,任务有时最终会出现错误:
发生这种情况时似乎无法访问数据库。
如果有人可以帮助我们调试问题,我们很高兴。
提前谢谢。
答案 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; =进入下一层