SSIS 包在 SQL Server 2012 中不是 运行 作为 32 位
SSIS Package Not Running as 32bit in SQL Server 2012
我有一个在 VS2012 中开发的包(使用 SQL 数据工具组件),它使用 VFPOLEDB 提供程序从 DBF 文件收集数据,并将其放入 [=48= 上的数据库中] 服务器 2012 X64 服务器。包含包的项目将 Run64BitRuntime 的 DebugOption 设置为 false。我已将此包导入到测试和实时服务器(相同设置)的 SSIS 包存储中。 VFPOLEDB 提供程序安装在两台机器上,我可以在两台机器的注册表中看到它存在 32 位 运行 次。
包运行在测试机器上没问题,但在实际机器上失败了。 SQL 的实时实例似乎无法识别已安装的 32 位 VFPOLEDB 提供程序。
SQL 实例的唯一区别是实时环境设置了集成服务目录,而测试没有。查看服务器的日志,当live开始时,它运行s sp_ssis_startup,然后记录有关正在加载不安全程序集的消息。这个SP不是运行测试环境因为没有目录。
我创建的作业将标志设置为使用 32 位 运行时间,但我不禁觉得 SSIS 目录与我正在使用的 VFPOLEDB 有问题,无法加载它。
我对 SSIS 目录一无所知,所以有人可以建议我可以进入的任何方向吗?
更新:
这是我的工作步骤配置。设置了 32 位 运行 时间标志。
更新#2:
- OLEDB 提供程序已正确安装。
- 两台机器上安装了相同版本的提供程序。
- OBDCAD32.exe 显示相同版本的 VFPOLEDB 提供程序。两台机器上都没有定义 DSN。我的本地计算机确实定义了 DSN,因此我将尝试为 dBASE 文件添加一个 DSN,看看是否有帮助。
- 正在尝试这一步。我正在寻找一种无需创建 SSISDB 目录即可使用 dtexec 工具的方法。尽管我确实删除了现有的 SSIS 目录并停止了 sp_ssis_startup 在服务启动时执行。我没有看到关于不安全程序集的日志条目,但作业仍然失败,并出现与往常一样的错误。我将在 4 上进行报告,并可能进一步寻求进一步的指导。
更新#3:
我刚刚检查过,测试和实际环境并不像我最初所说的那样相同。实时服务器没有 dtexec.exe 的 32 位版本(虽然我不认为这会很重要,因为 TechNet 说作业 运行 和 SQL 服务器代理将始终使用64 位版本。我想我使用了 x86 和 i64 ISO 来设置测试环境,但只有 64 位版本用于实时。我想改变这个需要从实时框中卸载 Integration Services 共享组件并重新安装它与双 iso.
我想设置 "Use 32bit runtime" 选项只有在有 32 位版本可供使用时才有效?这或许可以解释一些事情。
默认情况下,服务器上的所有内容都会 运行 64 位。要更改此行为,您需要指明应使用 dtexec 的 32 位版本。对于 2012 SSISDB,我们有两种调用包的简单方法:SQL Agent 和 catalog.start_execution
方法。
catalog.start_execution
对于单个服务包 运行s,您可以在 SSISDB 目录中找到该包并右键单击它们以 Execute...
在弹出的对话框中,您需要转到高级选项卡并选中 32-bit runtime
框。这将在包的每个 运行 上完成。
在幕后,向导生成的 SQL 看起来像
DECLARE @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'Package.dtsx'
, @execution_id = @execution_id OUTPUT
, @folder_name = N'POC'
, @project_name = N'SSISConfigMixAndMatch'
, @use32bitruntime = True
, @reference_id = NULL
SELECT
@execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id
, @object_type = 50
, @parameter_name = N'LOGGING_LEVEL'
, @parameter_value = @var0
EXEC [SSISDB].[catalog].[start_execution]
@execution_id
GO
如您所见,@use32bitruntime
参数传递了一个 True 值以指示它应该 运行 in 32 space.
SQL代理
对于周期性包运行s,我们一般使用调度工具。要在 agent 中获得包的 32 位设置,它基本上是相同的点击路径,除了您首先需要点击 Configuration 选项卡,然后 然后 点击 Advanced 选项卡以 select 32-bit runtime
作业步骤定义类似于
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'Do it'
, @step_name = N'Run in 32bit'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'SSIS'
, @command = N'/ISSERVER "\"\SSISDB\POC\SSISConfigMixAndMatch\Package.dtsx\"" /SERVER "\".\dev2014\"" /X86 /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
, @database_name = N'master'
, @flags = 0
您会看到在@command 调用中,向导会生成 /X86
调用,这是为 SQL 代理保留的特殊参数(检查 BOL link 在开头) 以指示是否应使用 32 位或 64 位版本的 dtexec。命令行调用将要求我们明确使用正确的 dtexec。默认情况下,64 位 dtexec 将首先列在您的 PATH 环境中
64 位 dtexec 位置
- C:\Program Files\Microsoft SQL Server\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
32 位 dtexec 位置
- C:\Program Files (x86)\Microsoft SQL Server\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
进一步排除驱动程序故障
它 运行 在一台服务器上,在另一台服务器上没有。
第 1 步 - 确认您已安装驱动程序。愚蠢的,明显的,但有很多问题,人们错误地认为部署 SSIS 包/.ispac 也会部署所有引用的程序集。它不是 nuget 所以不,所有先决条件都需要安装,并正确安装(看到人们试图将程序集复制到 GAC 而不是使用该工具)
第 2 步 - 验证驱动程序安装在服务器之间是否匹配。同样,这似乎很明显,但我经历过痛苦,一般来说 VS_NEEDSNEWMETADATA,驱动程序版本 4.0.2.013 产生的结果不同于 4.0.2.014
第 3 步 - 确保您定义的任何 DSN 都在正确的 space 中定义。这只咬人的原因有很多。我认为直到 Server 2012 才可以通过在文件系统上找到它来获得 odbcad32.exe(与管理工具相关的可执行文件 -> 数据源 (ODBC))的 32 位版本。更令人困惑的是可执行文件被命名为 odbcad32.exe,无论它是在 System32 还是 SysWOW64 中,这两个文件夹分别用于 64 位驱动程序和 32 位驱动程序。是的,未来的读者,这不是错字。 64 位版本的应用程序在 System32 中,32 位版本的应用程序在 SysWOW64 中。这是一项旨在将影响降至最低的设计决策。
在测试服务器和正式服务器上,运行 C:\Windows\SysWOW64\odbcad32.exe
找到您的 FoxPro 驱动程序和相关的 DSN,是否符合预期?
第 4 步 - 奇怪的权限检查。从命令行以 "normal" 帐户和 运行 包的身份登录到两台服务器。重复此步骤,但使用 Agent 执行它,无论您是否定义了代理。如果前者有效但后者失败,则通常表示存在权限问题。可能是 SQL 服务器或代理帐户无法访问驱动程序安装到的任何文件夹。可能是该帐户需要 InteractWithDesktop 权限或其他一些被拒绝或未明确授予的权限。
如果您想 运行 来自 64 位 SQL 32 位模式服务器代理作业的包,select 作业步骤类型 o-->操作系统, 然后输入命令行或使用调用 32 位版本 dtexec.exe
的批处理文件
命令:CD "C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\"
DTExec.exe /f "C:\Download\Root\SQL Package.dtsx"
或命令:
"C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe" /文件
"C:\Download\Root\SQL Package.dtsx" /MAXCONCURRENT " -1
" /CHECKPOINTING OFF /REPORTING V /CONSOLELOG NCOSGXMT
注意:我使用的是 SQL 2014 64 位版本。
我有一个在 VS2012 中开发的包(使用 SQL 数据工具组件),它使用 VFPOLEDB 提供程序从 DBF 文件收集数据,并将其放入 [=48= 上的数据库中] 服务器 2012 X64 服务器。包含包的项目将 Run64BitRuntime 的 DebugOption 设置为 false。我已将此包导入到测试和实时服务器(相同设置)的 SSIS 包存储中。 VFPOLEDB 提供程序安装在两台机器上,我可以在两台机器的注册表中看到它存在 32 位 运行 次。
包运行在测试机器上没问题,但在实际机器上失败了。 SQL 的实时实例似乎无法识别已安装的 32 位 VFPOLEDB 提供程序。
SQL 实例的唯一区别是实时环境设置了集成服务目录,而测试没有。查看服务器的日志,当live开始时,它运行s sp_ssis_startup,然后记录有关正在加载不安全程序集的消息。这个SP不是运行测试环境因为没有目录。
我创建的作业将标志设置为使用 32 位 运行时间,但我不禁觉得 SSIS 目录与我正在使用的 VFPOLEDB 有问题,无法加载它。
我对 SSIS 目录一无所知,所以有人可以建议我可以进入的任何方向吗?
更新:
这是我的工作步骤配置。设置了 32 位 运行 时间标志。
更新#2:
- OLEDB 提供程序已正确安装。
- 两台机器上安装了相同版本的提供程序。
- OBDCAD32.exe 显示相同版本的 VFPOLEDB 提供程序。两台机器上都没有定义 DSN。我的本地计算机确实定义了 DSN,因此我将尝试为 dBASE 文件添加一个 DSN,看看是否有帮助。
- 正在尝试这一步。我正在寻找一种无需创建 SSISDB 目录即可使用 dtexec 工具的方法。尽管我确实删除了现有的 SSIS 目录并停止了 sp_ssis_startup 在服务启动时执行。我没有看到关于不安全程序集的日志条目,但作业仍然失败,并出现与往常一样的错误。我将在 4 上进行报告,并可能进一步寻求进一步的指导。
更新#3:
我刚刚检查过,测试和实际环境并不像我最初所说的那样相同。实时服务器没有 dtexec.exe 的 32 位版本(虽然我不认为这会很重要,因为 TechNet 说作业 运行 和 SQL 服务器代理将始终使用64 位版本。我想我使用了 x86 和 i64 ISO 来设置测试环境,但只有 64 位版本用于实时。我想改变这个需要从实时框中卸载 Integration Services 共享组件并重新安装它与双 iso.
我想设置 "Use 32bit runtime" 选项只有在有 32 位版本可供使用时才有效?这或许可以解释一些事情。
默认情况下,服务器上的所有内容都会 运行 64 位。要更改此行为,您需要指明应使用 dtexec 的 32 位版本。对于 2012 SSISDB,我们有两种调用包的简单方法:SQL Agent 和 catalog.start_execution
方法。
catalog.start_execution
对于单个服务包 运行s,您可以在 SSISDB 目录中找到该包并右键单击它们以 Execute...
在弹出的对话框中,您需要转到高级选项卡并选中 32-bit runtime
框。这将在包的每个 运行 上完成。
在幕后,向导生成的 SQL 看起来像
DECLARE @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'Package.dtsx'
, @execution_id = @execution_id OUTPUT
, @folder_name = N'POC'
, @project_name = N'SSISConfigMixAndMatch'
, @use32bitruntime = True
, @reference_id = NULL
SELECT
@execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id
, @object_type = 50
, @parameter_name = N'LOGGING_LEVEL'
, @parameter_value = @var0
EXEC [SSISDB].[catalog].[start_execution]
@execution_id
GO
如您所见,@use32bitruntime
参数传递了一个 True 值以指示它应该 运行 in 32 space.
SQL代理
对于周期性包运行s,我们一般使用调度工具。要在 agent 中获得包的 32 位设置,它基本上是相同的点击路径,除了您首先需要点击 Configuration 选项卡,然后 然后 点击 Advanced 选项卡以 select 32-bit runtime
作业步骤定义类似于
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'Do it'
, @step_name = N'Run in 32bit'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'SSIS'
, @command = N'/ISSERVER "\"\SSISDB\POC\SSISConfigMixAndMatch\Package.dtsx\"" /SERVER "\".\dev2014\"" /X86 /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
, @database_name = N'master'
, @flags = 0
您会看到在@command 调用中,向导会生成 /X86
调用,这是为 SQL 代理保留的特殊参数(检查 BOL link 在开头) 以指示是否应使用 32 位或 64 位版本的 dtexec。命令行调用将要求我们明确使用正确的 dtexec。默认情况下,64 位 dtexec 将首先列在您的 PATH 环境中
64 位 dtexec 位置
- C:\Program Files\Microsoft SQL Server\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTExec.exe
32 位 dtexec 位置
- C:\Program Files (x86)\Microsoft SQL Server\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
- C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe
进一步排除驱动程序故障
它 运行 在一台服务器上,在另一台服务器上没有。
第 1 步 - 确认您已安装驱动程序。愚蠢的,明显的,但有很多问题,人们错误地认为部署 SSIS 包/.ispac 也会部署所有引用的程序集。它不是 nuget 所以不,所有先决条件都需要安装,并正确安装(看到人们试图将程序集复制到 GAC 而不是使用该工具)
第 2 步 - 验证驱动程序安装在服务器之间是否匹配。同样,这似乎很明显,但我经历过痛苦,一般来说 VS_NEEDSNEWMETADATA,驱动程序版本 4.0.2.013 产生的结果不同于 4.0.2.014
第 3 步 - 确保您定义的任何 DSN 都在正确的 space 中定义。这只咬人的原因有很多。我认为直到 Server 2012 才可以通过在文件系统上找到它来获得 odbcad32.exe(与管理工具相关的可执行文件 -> 数据源 (ODBC))的 32 位版本。更令人困惑的是可执行文件被命名为 odbcad32.exe,无论它是在 System32 还是 SysWOW64 中,这两个文件夹分别用于 64 位驱动程序和 32 位驱动程序。是的,未来的读者,这不是错字。 64 位版本的应用程序在 System32 中,32 位版本的应用程序在 SysWOW64 中。这是一项旨在将影响降至最低的设计决策。
在测试服务器和正式服务器上,运行 C:\Windows\SysWOW64\odbcad32.exe
找到您的 FoxPro 驱动程序和相关的 DSN,是否符合预期?
第 4 步 - 奇怪的权限检查。从命令行以 "normal" 帐户和 运行 包的身份登录到两台服务器。重复此步骤,但使用 Agent 执行它,无论您是否定义了代理。如果前者有效但后者失败,则通常表示存在权限问题。可能是 SQL 服务器或代理帐户无法访问驱动程序安装到的任何文件夹。可能是该帐户需要 InteractWithDesktop 权限或其他一些被拒绝或未明确授予的权限。
如果您想 运行 来自 64 位 SQL 32 位模式服务器代理作业的包,select 作业步骤类型 o-->操作系统, 然后输入命令行或使用调用 32 位版本 dtexec.exe
的批处理文件命令:CD "C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\" DTExec.exe /f "C:\Download\Root\SQL Package.dtsx"
或命令: "C:\Program Files (x86)\Microsoft SQL Server0\DTS\Binn\DTExec.exe" /文件 "C:\Download\Root\SQL Package.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING V /CONSOLELOG NCOSGXMT
注意:我使用的是 SQL 2014 64 位版本。