昨天在一資料庫(SQL Server 2008 R2 SP3)上部署了一個作業,今天早上收到告警郵件,作業執行報錯“Unable to start execution of step 1 (reason: Variable SQLLOGDIR not found). The step failed”... ...
昨天在一資料庫(SQL Server 2008 R2 SP3)上部署了一個作業,今天早上收到告警郵件,作業執行報錯“Unable to start execution of step 1 (reason: Variable SQLLOGDIR not found). The step failed”,剛開始有點莫名其妙,後面檢查發現出錯的原因是因為在高級選項(Advanced)裡面的output file使用了標記(tokens),而SQL Server 2008R2不支持這個。
作業是在SQL Server 2017下創建、測試的,然後生成作業的相關腳本,部署到SQL Server 2008 R2上,部分具體的代碼如下所示:
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'YourSQLDba_Index_Statistics_Maintenance_Step_One',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'EXECUTE [dbo].[IndexOptimize]
@Databases = ''USER_DATABASES'',
@LogToTable = ''Y''
EXECUTE dbo.IndexOptimize @Databases = ''USER_DATABASES'',
@FragmentationLow = NULL,
@FragmentationMedium = ''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'',
@FragmentationHigh = ''INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@SortInTempdb = ''Y'',
@MaxDOP = 0,
@UpdateStatistics=''ALL'',
@StatisticsSample=80,
@LogToTable = ''Y''',
@database_name=N'TMISDB',
@output_file_name=N'$(ESCAPE_SQUOTE(SQLLOGDIR))\IndexOptimize_$(ESCAPE_SQUOTE(JOBID))_$(ESCAPE_SQUOTE(STEPID))_$(ESCAPE_SQUOTE(STRTDT))_$(ESCAPE_SQUOTE(STRTTM)).txt',
@flags=0
關於標記(tokens) SQLLOGDIR的介紹如下;
(SQLLOGDIR) SQL Server 錯誤日誌文件夾路徑的替換標記 – 例如 $(ESCAPE_SQUOTE(SQLLOGDIR))。
其實SQL Server Agent的標記(token) SQLLOGDIR是從SQL Server 2014之後才開始支持的。所以需要修改output file設置,取消標記SQLLOGDIR.
如需測試當前資料庫版本是否支持這個比較,可以創建一個簡單作業執行下麵命令,個人測試發現,SQL Server 2014以及後續版本才支持這個標記。SQL Server 2008R2、2012等版本皆不支持。
PRINT '$(ESCAPE_SQUOTE(SQLLOGDIR))'
參考資料:
https://docs.microsoft.com/zh-cn/sql/ssms/agent/use-tokens-in-job-steps?view=sql-server-2017