SSIS包在SQL Server 2012中未运行为32位

时间:2015-02-04 01:26:53

标签: ssis sql-server-2012 oledbconnection visual-foxpro ssis-2012

我有一个我在VS2012中开发的软件包(使用SQL Data Tools组件),它使用VFPOLEDB提供程序从DBF文件收集数据,并将其放入SQL Server 2012 X64服务器上的数据库中。包含该程序包的项目将Run64BitRuntime的DebugOption设置为false。我已将此包导入测试和实时服务器的SSIS包存储(相同的设置)。 VFPOLEDB提供程序安装在两者上,我可以在两台计算机的注册表中看到它的32位运行时。

程序包在测试计算机上运行良好,但在活动计算机上运行失败。 SQL的实时实例似乎无法识别已安装的32位VFPOLEDB提供程序。

SQL实例的唯一区别是实时环境设置了集成服务目录,而测试则没有。查看服务器的日志,当实时启动时,它会运行sp_ssis_startup,然后记录有关正在加载的不安全程序集的消息。由于没有目录,此SP不会在测试环境中运行。

我创建的作业将标志设置为使用32位运行时,但我无法帮助,但我觉得SSIS目录与我正在使用的VFPOLEDB有问题,而不是加载它。

我对SSIS目录一无所知,那么是否有人能够建议我可以进入的任何方向?

更新: 这是我的工作步骤配置。设置32位运行时标志。 SSIS Job Step Configuration

更新#2:

  1. OLEDB提供程序已正确安装。
  2. 两台计算机上都安装了相同版本的提供程序。
  3. OBDCAD32.exe显示相同版本的VFPOLEDB提供程序。两台计算机上都没有定义DSN。我的本地机器确实定义了DSN,因此我将尝试为dBASE文件添加一个,看看是否有帮助。
  4. 现在正在尝试此步骤。我正在寻找一种方法来使用dtexec工具,而无需创建SSISDB目录。虽然我确实删除了现有的SSIS目录,并停止在服务启动时执行sp_ssis_startup。我没有看到关于不安全程序集的日志条目,但作业仍然失败,并且出现了与以往相同的错误。我将在4日报告,并可能进一步要求进一步的指导。
  5. 更新#3:
    我刚检查过,测试和现场环境与我原先说的不一样。实时服务器没有32位版本的dtexec.exe(虽然我认为这不重要,因为TechNet表示使用SQL Server代理运行的作业将始终使用64位版本。我想我用过用于设置测试环境的x86和i64 ISO,但是只有64位版本才能实现。改变这一点需要,我想象一下,从活动框中卸载Integration Services共享组件并使用双iso重新安装它。

    我想设置"使用32位运行时"选项仅在有32位版本可用时才有效?这可能解释了一些事情。

2 个答案:

答案 0 :(得分:11)

默认情况下,服务器上的所有内容都将以64位运行。要更改此行为,您需要指明应使用32位版本的dtexec。对于2012 SSISDB,我们有两种简单的方法来调用我们的包:SQL Agent和catalog.start_execution方法。

catalog.start_execution

对于单个服务包运行,您可以在SSISDB目录中找到该包,然后右键单击它们到Execute...

在弹出的对话框中,您需要转到“高级”选项卡并选中32-bit runtime框。这将在包的每次运行中完成。

enter image description here

在幕后,向导生成的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,表示它应该在32个空格中运行。

SQL代理

对于重复的包运行,我们通常使用调度工具。要在代理程序中获取程序包的32位设置,它基本上是相同的单击路径,除非您首先需要单击“配置”选项卡,然后然后单击“高级”选项卡以选择{{ 1}}

enter image description here

作业步骤定义类似于

32-bit runtime

您将在@command调用中看到,向导会生成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 调用,这是为SQL Agent保留的特殊参数(在开头检查BOL链接)以指示32或应使用64位版本的dtexec。命令行调用将要求我们明确使用正确的dtexec。默认情况下,64位dtexec将首先列在PATH环境中

64位dtexec位置

  • C:\ Program Files \ Microsoft SQL Server \ 90 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files \ Microsoft SQL Server \ 100 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files \ Microsoft SQL Server \ 110 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files \ Microsoft SQL Server \ 120 \ DTS \ Binn \ DTExec.exe

32位dtexec位置

  • C:\ Program Files(x86)\ Microsoft SQL Server \ 90 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files(x86)\ Microsoft SQL Server \ 100 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ DTS \ Binn \ DTExec.exe
  • C:\ Program Files(x86)\ Microsoft SQL Server \ 120 \ DTS \ Binn \ DTExec.exe

进一步的故障排除驱动程序

它在一台服务器上运行,而不在另一台服务器上运行。

第1步 - 验证您是否已安装驱动程序。愚蠢,显而易见,但有很多问题,人们错误地认为部署SSIS包/ .ispac也会部署所有引用的程序集。它不是nuget所以不,所有先决条件都需要安装和正确安装(看到人们试图将程序集复制到GAC而不是使用工具)

步骤2 - 验证驱动程序安装是否与服务器匹配。再次,似乎很明显,但我经历过痛苦,一般是VS_NEEDSNEWMETADATA,在驱动程序版本4.0.2.013上的点差异产生的结果与4.0.2.014不同

步骤3 - 确保您定义的所有DSN都在正确的空间中定义。由于种种原因,这个人咬人。我认为直到Server 2012你才能获得32位版本的odbcad32.exe(与管理工具相关的可执行文件 - >数据源(ODBC))是通过在文件系统上找到它。令人困惑的是,可执行文件名为odbcad32.exe,无论它是在System32还是SysWOW64中,这两个文件夹分别用于64位驱动程序和32位驱动程序。是的,未来的读者,这不是一个错字。 64版本的应用程序在System32中,32位版本在SysWOW64中。这是一项旨在尽量减少影响的设计决策。

在测试和实时服务器上,运行/X86找到您的FoxPro驱动程序和相关的DSN,它们是否符合预期?

第4步 - 奇怪的权限检查。以" normal"身份登录到两台服务器帐户并从命令行运行包。重复此步骤,但使用代理执行它,使用您可能已定义或未定义的任何代理。如果第一个工作但后者失败,则通常表示权限问题。可能是SQL Server或代理帐户无法访问驱动程序安装到的任何文件夹。可能是所述帐户需要InteractWithDesktop权限或其他被拒绝或未明确授予的权限。

答案 1 :(得分:0)

如果要以32位模式从64位SQL Server代理作业运行包,请选择作业步骤类型o - >操作系统,然后输入命令行或使用调用的批处理文件32位版本的dtexec.exe

命令:CD" C:\ Program Files(x86)\ Microsoft SQL Server \ 120 \ DTS \ Binn \" DTExec.exe / f" C:\ Download \ Root \ SQL Package.dtsx"

或命令: " C:\ Program Files(x86)\ Microsoft SQL Server \ 120 \ DTS \ Binn \ DTExec.exe" /文件 " C:\ Download \ Root \ SQL Package.dtsx" / MAXCONCURRENT" -1 " /检查点/报告V / CONSOLELOG NCOSGXMT

注意:我使用的是SQL 2014 64位版本。