SQL SSIS 作业失败

问题描述 投票:0回答:1

我有一个 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



sql sql-server ssis sql-job
1个回答
0
投票

发布临时答案,因为我认为这将是一个权限/用户错误,但想看看你的端是如何设置的

我们获得了在文件系统上运行 SSIS 包的类似脚本 foo

让我们看看是否可以整理出更多信息。在两个节点上创建此作业。

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 代理作业的帐户更改为镜像能够访问文件共享的那个。

© www.soinside.com 2019 - 2024. All rights reserved.