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:
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.
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:
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.
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:
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.
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.
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.
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 umaSET REMOTE_PROC_TRANSACTIONS OFF
instrução antes de executar qualquer consulta distribuída. Se essa configuração for definida comoON
, 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.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.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