Compartilhar via


MSSQLSERVER_7391

Aplica-se: SQL Server

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

Explicação

Esse erro ocorre porque o serviço MSDTC (Coordenador de Transações Distribuídas da Microsoft) não está em execução ou desabilitou o acesso à rede.

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

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

Os 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), também poderá 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 dá 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 destinam-se a testes e não têm suporte para muitas operações, como transações distribuídas.

Comunicação com o servidor

Para garantir que a comunicação entre os servidores seja bem-sucedida, siga estas etapas:

  1. Verifique se a resolução de nomes de rede funciona. Certifique-se de que os servidores possam se comunicar entre si 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 sua consulta distribuída. Isso pode envolver a atualização dos arquivos WINS, DNS ou LMHost.

  2. Se você tiver um firewall, certifique-se de que as portas RPC (Chamada de Procedimento Remoto) estejam 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 uma exibição ou um procedimento armazenado, ou se ele fizer com que um gatilho seja executado, verifique se ele aponta implicitamente para outro servidor. Nesse caso, o terceiro servidor é a origem do problema. Execute a consulta diretamente no terceiro servidor. Se você não puder fazer isso, a consulta do servidor vinculado não é o problema. Resolva o problema subjacente primeiro.

  4. Verifique se você está usando o RAS (Servidor de Acesso Remoto) para acessar servidores remotos. Nesse caso, verifique se você implementou o RRAS (RAS de Roteamento). Os servidores vinculados não funcionam no RAS porque o RAS permite apenas comunicação unidirecional.

Configuração de Servidor

Siga estas etapas para configurar os servidores:

  1. Inicie o DTC (Coordenador de Transações Distribuídas) 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 na maioria dos provedores OLE DB, incluindo SQL Server. Você pode fazer isso executando o comando a seguir antes de executar sua consulta.

    SET XACT_ABORT ON
    

    Observação

    Essa opção não será necessária se o provedor der 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. Verifique se 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 por nome e não apenas por 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 sua 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 remote proc trans 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 for 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 retornado 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