我有一个 SQL Server 2022 应用程序在 2 个节点上冗余运行,其中一个作业 (SSIS) 在主节点上失败,表示服务帐户找不到指定的文件,完全相同的作业在辅助节点上运行良好,使用相同的服务帐户(域帐户)。使用相同的域帐户(SQL Server 代理帐户)通过 Visual Studio 运行时,作业工作正常
我可以使用服务帐户从两个节点浏览存储作业文件的路径。我通过使用工作中的脚本重新创建了工作,该脚本工作正常,但仍然没有成功。我将 SSIS 包文件本地复制到服务器中,但仍然遇到同样的问题。有任何想法吗?预先感谢!
无法为作业 0x72DB1C3372A2974DAA7D83AED24F078F 的步骤 1 创建进程(原因:系统找不到指定的文件)。该步骤失败。
USE [msdb]
GO
/****** Object: Job [UPLOAD] Script Date: 4/11/2024 12:25:14 PM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 4/11/2024 12:25:14 PM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'UPLOAD',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa',
@notify_email_operator_name=N'Administrator Group', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [1step] Script Date: 4/11/2024 12:25:14 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'step 1',
@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'SSIS',
@command=N'/FILE "\"\\[PATHTODRIVE]\jobs\ssis_job.dtsx\"" /X86 /CHECKPOINTING OFF /REPORTING E',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Update Scores',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20240328,
@active_end_date=99991231,
@active_start_time=63000,
@active_end_time=235959,
@schedule_uid=N'01xxx58-4xxxb-4xxxx-861f-9dxxxx0xx1'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
发布临时答案,因为我认为这将是一个权限/用户错误,但想看看你的端是如何设置的
我们获得了在文件系统上运行 SSIS 包的类似脚本
让我们看看是否可以整理出更多信息。在两个节点上创建此作业。
DECLARE @jobId binary(16);
EXEC msdb.dbo.sp_add_job
@job_name = N'CMD Debugging'
, @enabled = 1
, @notify_level_eventlog = 0
, @notify_level_email = 0
, @notify_level_netsend = 0
, @notify_level_page = 0
, @delete_level = 0
, @description = N'No description available.'
, @category_name = N'[Uncategorized (Local)]'
, @owner_login_name = N'sa'
, @job_id = @jobId OUTPUT;
EXEC msdb.dbo.sp_add_jobstep
@job_id = @jobId
, @step_name = N'DBG - where dtexec'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 3
, @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'CmdExec'
, @command = N'where dtexec.exe'
, @flags = 32;
EXEC msdb.dbo.sp_add_jobstep
@job_id = @jobId
, @step_name = N'DBG - whoami'
, @step_id = 2
, @cmdexec_success_code = 0
, @on_success_action = 3
, @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'CmdExec'
, @command = N'whoami'
, @flags = 32;
EXEC msdb.dbo.sp_add_jobstep
@job_id = @jobId
, @step_name = N'DBG - network path'
, @step_id = 3
, @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'CmdExec'
, @command = N'DIR "\\erech\C$\tmp\so_58775698\output\ETL\Step1.Load"'
, @flags = 32;
EXEC msdb.dbo.sp_update_job
@job_id = @jobId
, @start_step_id = 1;
它应该运行 3 个操作系统命令作业步骤。
第一个是
where dtexec
,它将按顺序识别实际运行 SSIS 包的程序的路径。
第二个命令有点多余,但它是
whoami
,它返回当前用户的域名。冗余,因为作业步骤的执行也将包括这一点,但我发现明确的意图很有帮助
第三个命令是列出目录内容的请求。
DIR "\\erech\C$\tmp\so_58775698\output\ETL\Step1.Load"
网络路径将是您实际工作中的网络路径。
运行作业,然后在每台服务器上,让我们看看输出。
SELECT SJH.step_id, SJH.run_time, SJH.server, SJH.message
FROM msdb.dbo.sysjobhistory AS SJH
WHERE EXISTS (SELECT * FROM msdb.dbo.sysjobs AS SJ WHERE SJ.name = 'CMD Debugging' AND SJ.job_id = SJH.job_id)
AND SJH.step_id > 0
ORDER BY SJH.run_time;
我看到类似以下内容
1 115043 ERECH\DEV2017 C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\DTExec.exe
C:\Program Files\Microsoft SQL Server\150\DTS\Binn\DTExec.exe
C:\Program Files\Microsoft SQL Server\140\DTS\Binn\DTExec.exe
C:\Program Files (x86)\Microsoft SQL Server\140\DTS\Binn\DTExec.exe
1 115043 ERECH\DEV2017 Executed as user: NT Service\SQLAgent$DEV2017. The step succeeded.
1 115406 ERECH\DEV2017 C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\DTExec.exe
C:\Program Files\Microsoft SQL Server\150\DTS\Binn\DTExec.exe
C:\Program Files\Microsoft SQL Server\140\DTS\Binn\DTExec.exe
C:\Program Files (x86)\Microsoft SQL Server\140\DTS\Binn\DTExec.exe
1 115406 ERECH\DEV2017 Executed as user: NT Service\SQLAgent$DEV2017. The step succeeded.
2 115407 ERECH\DEV2017 nt service\sqlagent$dev2017
2 115407 ERECH\DEV2017 Executed as user: NT Service\SQLAgent$DEV2017. The step succeeded.
3 115407 ERECH\DEV2017 Volume in drive \\erech\C$ has no label.
Volume Serial Number is 3AB8-1C01
Directory of \\erech\C$\tmp\so_58775698\output\ETL\Step1.Load
08/17/2020 10:08 AM <DIR> .
08/17/2020 10:08 AM <DIR> ..
08/17/2020 08:50 AM 163 BimlScript.biml
08/17/2020 08:47 AM <DIR> bin
08/17/2020 08:47 AM 65 Project.params
08/17/2020 08:51 AM 639 SO.63451166.dtsx
08/17/2020 08:47 AM 1,251 Step1.Load.database
08/17/2020 08:47 AM 2,710 Step1.Load.dtproj
08/17/2020 10:08 AM 563 Step1.Load.dtproj.user
08/17/2020 08:51 AM 638 Step1.Load.dtsx
7 File(s) 6,029 bytes
3 Dir(s) 167,191,408,640 bytes free
3 115407 ERECH\DEV2017 Executed as user: NT Service\SQLAgent$DEV2017. The step succeeded.
很混乱,输出中嵌入了回车符,但我可以看出第一个 dtexec 是 150。这可能是一个问题,因为这个实例是 2017 年,但我认为实际的 SSIS 作业步骤有更多的大脑,不会被交叉dtexec 版本已更新。但是,我们至少在路径上找到了 dtexec。
第2步,冗余部分显示了
nt service\sqlagent$dev2017
的whoami,我怀疑这在你的两个节点之间会有所不同
第3步,这将显示文件内容。我可以确认,是的,我看到
Step1.Load.dtsx
这是我尝试在此 UNC 路径上运行的包。如果 sql 代理作业在服务器上的步骤 3 中失败,并且无法找到该包,我希望看到类似“系统找不到指定的路径”的输出。在你的日志中。
如果我们得到了这一点,并且步骤 2 中列出了 2 个不同的帐户,那么我们就知道要么我们有人员负责 PATHTODRIVE 服务器授予指定帐户的列表/读取权限,要么您将运行 SQL 代理作业的帐户更改为镜像能够访问文件共享的那个。