MSSQLSERVER_7391

Aplica-se a:SQL Server

Atributo Valor
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 o servidor vinculado "%ls" não pôde iniciar uma transação distribuída.

Explicação

Este erro ocorre porque o serviço Microsoft Distributed Transaction Coordinator (MSDTC) não está em execução ou desativou o acesso à rede.

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

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

Números de erro que estão no intervalo de 7300 a 7399 indicam um problema que afeta o provedor. Como cada provedor pode ter recursos diferentes e mostrar detalhes diferentes, talvez você não receba uma mensagem de erro completa. Para recuperar a mensagem de erro completa dos provedores, execute o seguinte comando antes de executar a consulta que gera o erro:

DBCC TRACEON (3604, 7300)

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

Ação do usuário

Observação

É uma prática recomendada limitar seu código em uma transação que envolve uma consulta distribuída feita apenas para o servidor remoto.

Capacidade de suporte

  • Para verificar se o driver oferece suporte a transações distribuídas, entre em contato com o fornecedor do driver que você usa na consulta do servidor vinculado.

  • Verifique se o objeto no servidor de destino aponta de volta para o primeiro servidor. Isso é conhecido como uma situação de loopback. Os servidores vinculados de loopback são destinados a testes e não têm suporte para muitas operações, como transações distribuídas.

Comunicação do servidor

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

  1. Verifique se a resolução de nomes de rede funciona. Certifique-se de que os servidores possam se comunicar uns com os outros pelo nome e não apenas pelo endereço IP. Faça check-in em ambas as direções (por exemplo, do servidor A para o servidor B e do servidor B para o servidor A). Resolva todos os problemas de resolução de nomes na rede antes de executar a consulta distribuída. Isso pode envolver a atualização dos arquivos WINS, DNS ou LMHost.

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

  3. Verifique o objeto para o qual você aponta no servidor de destino. Se o objeto for um modo de exibição ou um procedimento armazenado, ou se ele fizer com que um gatilho seja executado, verifique se ele aponta implicitamente para outro servidor. Em caso afirmativo, o terceiro servidor é a origem do problema. Execute a consulta diretamente no terceiro servidor. Se você não conseguir fazer isso, a consulta do servidor vinculado não será o problema. Resolva o problema subjacente primeiro.

  4. Verifique se você está usando o Servidor de Acesso Remoto (RAS) para acessar servidores remotos. Em caso afirmativo, certifique-se de ter implementado o Roteamento RAS (RRAS). Os servidores vinculados não funcionam no RAS porque o RAS permite apenas a comunicação unidirecional.

Configuração de Servidor

Siga estas etapas 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 obter informações sobre como habilitar o acesso DTC de rede, consulte Mensagem de erro do provedor OLE DB - SQL Server.

  2. Defina a opção XACT_ABORT como ON para instruções de modificação de dados em uma transação implícita ou explícita em relação à maioria dos provedores OLE DB, incluindo o SQL Server. Você pode fazer isso executando o seguinte comando antes de executar a consulta.

    SET XACT_ABORT ON
    

    Observação

    Essa opção não será necessária se o provedor oferecer suporte a transações aninhadas.

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

  4. Se você estiver usando a tecnologia de servidores remotos mais antiga em vez dos servidores vinculados recomendados, defina a opção de configuração proc trans remota como OFF para o servidor ou execute uma SET REMOTE_PROC_TRANSACTIONS OFF instrução antes de executar qualquer consulta distribuída. Se essa configuração estiver definida como ON, as chamadas de procedimento remoto serão feitas em uma transação local. Para obter mais informações, consulte Configurar o proc trans remoto (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, renomeie o servidor.

  6. Verifique se a conta de inicialização do SQL Server tem permissões de controle total na seguinte chave do Registro:

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

Próximas etapas