Incapaz de iniciar uma transação distribuída

95

Estou tentando executar o SQL em um servidor vinculado, mas recebo os erros abaixo:

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions


OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

Existem dois erros retornados pelo provedor:

Erro # 1:

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

Erro # 2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

Como faço para que a Microsoft dê preferência à funcionalidade em vez da segurança?

Ou, pelo menos, como posso fazer com que dois SQL Severs se comuniquem?

Perguntas relacionadas


O que eu tenho feito é irrelevante, mas eu vou postá-lo de qualquer maneira.

  1. Certifique-se de que o Distributed Transaction Coordinatorserviço está sendo executado em ambas as máquinas:

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

  2. Desative toda a segurança MSDTC em ambas as máquinas:

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

  3. Ative as opções aleatórias no servidor vinculado:

insira a descrição da imagem aqui

  1. Amaldiçoado e xingado.

  2. Coisas quebradas.

  3. Foi verificado se um SELECTpode usar o servidor vinculado :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Verificado se o servidor cliente pode pingo servidor remoto :

         C:\Documents and Settings\avatar>ping asicmstest.contoso.com
    
         Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
    
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.40:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  5. Verificado se o servidor remoto pode se comunicar de volta, por nome, ao servidor inicial:

         C:\Documents and Settings\avatar>ping asitestserver.contoso.com
    
         Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
    
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.22:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  6. Verificado que @@SERVERNAMEcorresponde ao nome do servidor em ambos os servidores :

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       -------------  -------------
       ASITESTSERVER  ASITESTSERVER

    e

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
  7. Gritou

  8. Emitido SET XACT_ABORT ONantes de emitir minha consulta :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Concedido Everyone Full Controla :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    em ambos os servidores.

Ian Boyd
fonte
30
bom ver que você não pulou a etapa crucial "amaldiçoado e jurado"!
jwl
11
@joelarson Ei, às vezes as pessoas são muito específicas quanto a você seguir cada passo. não queria que ninguém dissesse que não tentei nada.
Ian Boyd
5
Eu amo esse post Ele simboliza todas as experiências que já tive com o MSDTC.
A. Murray
5
No meu caso, depois de definir "Ativar promoção de transações distribuídas para RPC" como False no servidor vinculado, funciona. Talvez tente isso
Salsaparrilha
3
@HaiPhan Desativar o uso de transações distribuídas quebra a integridade transnacional: se você reverter suas alterações no servidor local, significa que as alterações permanecerão em vigor no servidor remoto. Muito perigoso.
Ian Boyd

Respostas:

31

Encontrado, o MSDTC no servidor remoto era um clone do servidor local.

No registro de eventos de aplicativos do Windows:

Tipo de evento: erro
Origem do evento: MSDTC
Categoria do evento: CM
ID do evento: 4101
Data: 19/09/2011
Hora: 1:32:59 PM
Usuário: N / A
Computador: ASITESTSERVER
Descrição:

O MS DTC local detectou que o MS DTC em ASICMSTEST tem a mesma identidade exclusiva que o MS DTC local. Isso significa que os dois MS DTC não poderão se comunicar um com o outro. Esse problema normalmente ocorre se um dos sistemas foi clonado usando ferramentas de clonagem não suportadas. O MS DTC requer que os sistemas sejam clonados usando ferramentas de clonagem com suporte, como SYSPREP. Executar 'msdtc -uninstall' e, em seguida, 'msdtc -install' no prompt de comando corrigirá o problema. Nota: A execução de 'msdtc -uninstall' resultará na perda de todas as informações de configuração do MS DTC no sistema.

Para obter mais informações, consulte o Centro de ajuda e suporte em http://go.microsoft.com/fwlink/events.asp .

Corrida

msdtc -uninstall
msdtc -install

e, em seguida, parar e reiniciar o serviço SQL Server corrigiu o problema.

Ian Boyd
fonte
2
Vamos ver se entendi direito: 1- msdtc -uninstall 2- msdtc -install 3- reinicie o serviço SQL Server 4- reinicie o serviço SQL Agent, apenas para ter certeza 5- reinicie o serviço "Distributed Transaction Coordinator" ... Já fiz tudo isso nas duas máquinas (servidor principal e servidor vinculado) a ~ e nada, continua o mesmo erro!
Hamid Sadeghian
9

Consegui resolver esse problema (como outros mencionaram nos comentários) desativando "Ativar promoção de transações distribuídas para RPC" (ou seja, configurando-o para False):

insira a descrição da imagem aqui

Steve Bauman
fonte
1
Isso funcionou para mim. O estranho é que está tudo bem há semanas e, de repente, começou. Possivelmente porque o serviço DTC do servidor remoto pode estar desativado. Enfim, obrigado.
Boyd P
6

OK, então os serviços foram iniciados, há um caminho Ethernet entre eles, a resolução de nomes funciona, os servidores vinculados funcionam e você desabilitou a autenticação de transação.

Meu instinto diz problema de firewall, mas algumas coisas vêm à mente ...

  1. As máquinas estão no mesmo domínio? (sim, não deveria importar com autenticação desativada)
  2. Os firewalls estão funcionando nas máquinas? O DTC pode ser um pouco doloroso para os firewalls, pois usa uma variedade de portas, consulte http://support.microsoft.com/kb/306843 Por enquanto, eu desativaria os firewalls para identificar o problema
  3. O que o ping do DTC diz? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Com qual conta o SQL Service está sendo executado?
EBarr
fonte
2

Se os servidores estiverem em cluster e houver um DTC em cluster, será necessário desabilitar a segurança no DTC em cluster e não no DTC local.

David Wolfinger
fonte
1

Se o seu servidor de destino estiver em outra nuvem ou data center, será necessário adicionar a entrada de host do serviço MSDTC (servidor de destino) no servidor de origem.

Tente este se o problema não for resolvido, depois de habilitar as configurações do MSDTC.

JERRY
fonte
1

Para mim, está relacionado à configuração do Firewall. Vá para a configuração do seu firewall, permita o serviço DTC e funcionou.insira a descrição da imagem aqui

Hoang Tran
fonte
0

Minha última aventura com o MSDTC e este erro hoje acabou por ser um problema de DNS. Você está no caminho certo perguntando se as máquinas estão no mesmo domínio, EBarr. A propósito, uma lista excelente para esse problema!

Minha situação: eu precisava de um servidor em um domínio filho para poder executar transações distribuídas em um servidor no domínio pai por meio de um firewall. Eu usei servidores vinculados um pouco ao longo dos anos, então tinha todas as configurações usuais em SQL para um servidor vinculado e no MSDTC que Ian documentou tão bem acima. Eu configurei o MSDTC com um intervalo de portas TCP (5000-5200) para usar em ambos os servidores e organizei um buraco no firewall entre as caixas para as portas 1433 e 5000-5200. Isso deveria ter funcionado. O servidor vinculado testou OK e pude consultar o servidor SQL remoto por meio do servidor vinculado, mas não consegui fazer com que ele permitisse uma transação distribuída. Eu podia até ver uma conexão no servidor de QA do servidor DEV, mas algo não estava voltando.

Eu poderia fazer o PING do servidor DEV do QA usando um FQDN como: PING DEVSQL.dev.domain.com

Não consegui fazer PING no servidor DEV apenas com o nome da máquina: PING DEVSQL

O servidor DEVSQL deveria ser membro de ambos os domínios, mas o nome não estava resolvido no DNS do domínio pai ... algo havia acontecido com a conta da máquina para DEVSQL no domínio pai. Depois que adicionamos DEVSQL ao DNS para o domínio pai e "PING DEVSQL" funcionou no servidor de controle de qualidade remoto, esse problema foi resolvido para nós.

Eu espero que isso ajude!

Marck
fonte
0

Além das configurações de segurança, tive que abrir algumas portas em ambos os servidores para que a transação fosse executada. Tive que abrir a porta 59640, mas de acordo com a seguinte sugestão, a porta 135 deve ser aberta. http://support.microsoft.com/kb/839279

Trepach
fonte
0

Eu estava recebendo o mesmo erro e consegui resolvê-lo configurando o MSDTC corretamente no servidor de origem para permitir a saída e permitir o DTC através do firewall do Windows.

Permitir que o coordenador de transações distribuídas, marque domínio, opções privadas e públicas

Kaawach Said
fonte