MSSQLSERVER_7391

Aplica-se a: SQL Server

Attribute Value
Produto SQL Server
ID do Evento 7391
Origem do evento MSSQLSERVER
Componente SQLEngine
Nome simbólico RMT_TRANS_JOIN_FAIL
Texto da mensagem A operação não pôde ser executada porque o provedor OLE DB "%ls" para servidor vinculado "%ls" não pôde iniciar uma transação distribuída.

Explanation

Este erro ocorre porque o serviço Coordenador de Transações Distribuídas da Microsoft (MSDTC) não está a funcionar ou desativou o acesso à rede.

Em alguns casos, pode também receber o erro 8522:

Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.

Números de erro que se situam entre 7300 e 7399 indicam um problema que afeta o fornecedor. Como cada fornecedor pode ter capacidades diferentes e mostrar detalhes distintos, pode não receber uma mensagem de erro completa. Para recuperar a mensagem de erro completa dos fornecedores, execute o seguinte comando antes de executar a consulta que gera o erro:

DBCC TRACEON (3604, 7300)

Se receber o erro 7391 de um processo como replicação do SQL Server ou SQL Server Integration Services (SSIS), também pode receber a mensagem de erro se o código contiver uma BEGIN DISTRIBUTED TRAN instrução.

Ação do usuário

Note

É uma boa prática limitar o seu código numa transação que envolva uma consulta distribuída feita apenas ao servidor remoto.

Capacidade de suporte

  • Para verificar se o driver suporta transações distribuídas, contacte o fornecedor do driver que utiliza na consulta do seu servidor ligado.

  • Verifique se o objeto no servidor de destino aponta de volta para o primeiro servidor. Isto é conhecido como uma situação de loopback. Os servidores ligados de loopback destinam-se a testes e não são suportados para muitas operações, como transações distribuídas.

Comunicação com servidores

Para garantir que a comunicação entre servidores é bem-sucedida, siga estes passos:

  1. Verifique se a resolução dos nomes da sua rede funciona. Certifique-se de que os servidores podem comunicar entre si pelo nome e não apenas pelo endereço IP. Verifique em ambas as direções (por exemplo, do servidor A para o servidor B e do servidor B para o servidor A). Resolve todos os problemas de resolução de nomes na rede antes de executares a tua consulta distribuída. Isto pode envolver a atualização dos ficheiros WINS, DNS ou LMHost.

  2. Se tiver um firewall, certifique-se de que as portas de Chamada de Procedimento Remoto (RPC) estão abertas corretamente. Para mais informações, consulte os seguintes artigos:

  3. Verifica o objeto para o qual apontas no servidor de destino. Se o objeto for uma vista ou um procedimento armazenado, ou se causar a execução de um gatilho, verifique se aponta implicitamente para outro servidor. Se assim for, o terceiro servidor é a origem do problema. Executa a consulta diretamente no terceiro servidor. Se não conseguires fazer isto, a consulta do servidor ligado não é o problema. Resolve primeiro o problema subjacente.

  4. Verifique se está a usar o Remote Access Server (RAS) para aceder a servidores remotos. Se sim, certifique-se de que implementou o Routing RAS (RRAS). Servidores ligados não funcionam no RAS porque o RAS permite apenas comunicação unidirecional.

Configuração do servidor

Siga estes passos para configurar os servidores:

  1. Inicie o Coordenador de Transações Distribuídas (DTC ou MS DTC) em todos os servidores envolvidos na transação distribuída. Para informações sobre como ativar o acesso DTC em rede, veja Mensagem de erro do fornecedor OLE DB - SQL Server.

  2. Defina a XACT_ABORT opção ON para instruções de modificação de dados numa transação implícita ou explícita contra a maioria dos fornecedores OLE DB, incluindo o SQL Server. Pode fazer isto executando o comando seguinte antes de executar a sua consulta.

    SET XACT_ABORT ON
    

    Note

    Esta opção não é obrigatória se o fornecedor suportar transações aninhadas.

  3. Verifique se algum dos servidores está num Cluster de Failover do Windows Server. O serviço MSDTC no cluster deve ter o seu próprio endereço IP. Certifique-se de que a resolução correta dos nomes do serviço DTC ocorre em cada servidor. O endereço IP do DTC deve ser definido no seu sistema de resolução de nomes (como WINS, DNS ou LMHosts). Verifique se cada servidor pode comunicar com o MSDTC nos outros servidores pelo nome e não apenas pelo endereço IP. Verifica em ambas as direções. Por exemplo, verifique do servidor A para o serviço MSDTC do servidor B, e depois verifique do servidor B para o MSDTC do servidor A. Deve resolver todos os problemas de resolução de nomes na rede antes de executar a sua consulta distribuída. Para configurar o MSDTC num cluster, consulte Recomendações MSDTC sobre o SQL Failover Cluster - Microsoft Community Hub.

  4. Se estiveres a usar a tecnologia de servidores remotos mais antigos em vez dos recomendados servidores ligados, define a opção de configuração de proc trans remota para OFF o servidor, ou executa uma SET REMOTE_PROC_TRANSACTIONS OFF instrução antes de executares qualquer consulta distribuída. Se esta definição for definida para ON, as chamadas de procedimento remoto são feitas numa transação local. Para mais informações, veja Configurar a transferência remota de proc (opção de configuração do servidor) - SQL Server.

  5. Verifique o valor de retorno da função @@SERVERNAME do sistema em ambos os servidores. Verifique se o valor de retorno corresponde ao nome do computador de cada servidor. Se não corresponder, muda o nome do servidor.

  6. Verifique se a conta de arranque do SQL Server tem permissões de controlo total sobre a seguinte chave de registo:

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

Passos seguintes