Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Pacote SSIS não está sendo executado como 32 bits no SQL Server 2012


Por padrão, tudo será executado em 64 bits nos servidores. Para alterar esse comportamento, você precisa indicar que a versão de 32 bits do dtexec deve ser usado. Para o SSISDB 2012, temos duas maneiras fáceis de invocar nossos pacotes:SQL Agent e o catalog.start_execution método.

catálogo.start_execution


Para execuções de pacotes de serviço único, você pode encontrar o pacote no catálogo do SSISDB e clicar com o botão direito neles para Execute...

Na caixa de diálogo pop-up resultante, você precisará ir para a guia Avançado e verificar o 32-bit runtime caixa. Isso seria feito em cada execução do pacote.



Nos bastidores, o SQL gerado pelo assistente pareceria
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

Como você pode ver, o @use32bitruntime é passado um valor de True para indicar que deve ser executado em 32 espaços.

Agente SQL


Para execuções de pacotes recorrentes, geralmente usamos uma ferramenta de agendamento. Para chegar à configuração de 32 bits para um pacote no agente, é basicamente o mesmo caminho de clique, exceto que primeiro você precisa clicar na guia Configuração e depois clique na guia Avançado para selecionar 32-bit runtime



A definição da etapa de trabalho seria algo como
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

Você verá que na chamada @command, o assistente gera o /X86 call que é o argumento especial reservado para o SQL Agent (verifique o link BOL no início) para indicar se a versão de 32 ou 64 bits do dtexec deve ser usada. Uma invocação de linha de comando exigiria que usássemos explicitamente o dtexec correto. Por padrão, o dtexec de 64 bits será listado primeiro em seu ambiente PATH

localizações dtexec de 64 bits

  • C:\Arquivos de Programas\Microsoft SQL Server\90\DTS\Binn\DTExec.exe
  • C:\Arquivos de Programas\Microsoft SQL Server\100\DTS\Binn\DTExec.exe
  • C:\Arquivos de Programas\Microsoft SQL Server\110\DTS\Binn\DTExec.exe
  • C:\Arquivos de Programas\Microsoft SQL Server\120\DTS\Binn\DTExec.exe

localizações dtexec de 32 bits

  • 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

Outros drivers de solução de problemas


Ele roda em um servidor, não em outro.

Etapa 1 - verifique se você instalou os drivers. Bobo, óbvio, mas tem havido muitas perguntas em que as pessoas erroneamente pensaram que a implantação de um pacote SSIS/.ispac também implantaria todos os assemblies referenciados. Não é nuget, então não, todos os pré-requisitos precisariam ser instalados e instalados corretamente (visto pessoas tentando copiar assemblies para o GAC em vez de usar a ferramenta)

Etapa 2 - verifique se a instalação do driver corresponde aos servidores. Novamente, parece óbvio, mas experimentei dor, geralmente VS_NEEDSNEWMETADATA, em uma diferença pontual na versão do driver 4.0.2.013 produziu resultados diferentes do 4.0.2.014

Etapa 3 - Certifique-se de que todos os DSNs que você definiu foram definidos no espaço correto. Este morde as pessoas por uma série de razões. Acho que não foi até o Server 2012 que você só conseguiu chegar à versão de 32 bits do odbcad32.exe (executável relacionado a Ferramentas Administrativas -> Fontes de Dados (ODBC)) foi encontrando-o no sistema de arquivos. Ainda mais confuso é que o executável é chamado odbcad32.exe, independentemente de estar em System32 ou SysWOW64 e essas duas pastas são para os drivers de 64 bits e drivers de 32 bits, respectivamente. Sim, futuros leitores, isso não é um erro de digitação. A versão 64 dos aplicativos está no System32, as versões de 32 bits estão no SysWOW64. Foi uma decisão de design destinada a minimizar o impacto.

No servidor de teste e ativo, execute C:\Windows\SysWOW64\odbcad32.exe Encontre seus drivers FoxPro e os DSNs relacionados, eles estão conforme o esperado?

Etapa 4 - Verificação de permissão estranha. Faça logon em ambos os servidores como uma conta "normal" e execute o pacote na linha de comando. Repita esta etapa, mas execute-a usando o Agent, com qualquer proxy que você possa ou não ter definido. Se o primeiro funcionar, mas o último falhar, isso geralmente indica um problema de permissão. Pode ser que a conta do SQL Server ou Agent não possa acessar a pasta em que o driver foi instalado. Pode ser que essa conta precise da permissão InteractWithDesktop ou alguma outra permissão negada ou não concedida explicitamente.