我使用Azure Elastic Job Agent创建了一个 SQL 维护作业,步骤如下:
EXEC jobs.sp_add_jobstep @job_name = @jobName,
@step_name = 'Optimize indexes and statistics',
@command=N'
EXECUTE dbo.IndexOptimize
@Databases = ''USER_DATABASES'',
@FragmentationLow = NULL,
@FragmentationMedium = ''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE'',
@FragmentationHigh = ''INDEX_REBUILD_ONLINE'',
@FragmentationLevel1 = 10,
@FragmentationLevel2 = 30,
@MinNumberOfPages = 10,
@TimeLimit = 3600,
@UpdateStatistics = ''ALL'',
@OnlyModifiedStatistics = ''Y'',
@SortInTempdb = ''Y'',
@MaxDOP = 1,
@LogToTable = ''Y''
',
@credential_name = @jobStepCredName,
@target_group_name= @targetGroupName,
@retry_attempts = 0,
@step_timeout_seconds = 3600,
@max_parallelism = 1 -- IMPORTANT! We don't want to run index optimization on multiple databases at the same time
该代码使用 Ola Hallengren 提供的存储过程dbo.IndexOptimize。
该作业计划每天早上 5 点运行,每周失败一到两次。失败的原因是 Azure 弹性作业代理的内部问题:“作业服务在此任务进行时重新启动。”。Azure 的服务仍处于预览阶段,因此预计会出现内部服务错误。
我当前的解决方案是将 @retry_attempts 设置为大于 0 的某个数字,以便 Job Agent 可以重试该步骤,但是我不确定重试失败的步骤以进行索引优化是否是个好主意。
特别是,我不确定如果 INDEX REBUILD、INDEX REORGANIZE 或 UPDATE STATISTICS 进程被取消或终止,它们会发生什么情况。
所以总结一下,我有以下问题:
- 如果步骤失败,重试索引维护是个好主意吗?
- 当 INDEX REBUILD、INDEX REORGANIZE 或 UPDATE STATISTICS 进程失败或终止时会发生什么。
感谢您对此事的反馈。
在您的情况下,您应该将 @Resumable = 'Y' 选项添加到您的作业中,然后重新启动或等待下一个计划运行作业并完成,具体取决于时间和并发问题,因为在许多用户使用时运行索引重建数据库可能是个问题。
统计和索引重建在早期版本中是事务性的,因此如果更改索引重建语句失败,结果将回滚并使用旧对象,但在 2017 年以后,有一个新选项WITH (RESUMABLE=ON)允许您恢复索引重建之后。
您还应该查看Ola 脚本中的 @WaitAtLowPriorityMaxDuration 和 @LockTimeout 参数,因为它们有助于最大限度地减少阻塞。