Impossible de démarrer une transaction distribuée

95

J'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs ci-dessous:

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.

Il y a deux erreurs renvoyées par le fournisseur:

Erreur n ° 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

Erreur n ° 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

Comment amener Microsoft à privilégier la fonctionnalité par rapport à la sécurité?

Ou, du moins, comment puis-je faire en sorte que deux serveurs SQL se parlent?

Questions connexes


Ce que j'ai fait est hors de propos, mais je vais le poster de toute façon.

  1. Assurez-vous que le Distributed Transaction Coordinatorservice fonctionne sur les deux machines:

    entrez la description de l'image ici

    entrez la description de l'image ici

  2. Désactivez toute la sécurité MSDTC sur les deux machines:

    entrez la description de l'image ici

    entrez la description de l'image ici

  3. Activez les options aléatoires sur le serveur lié:

entrez la description de l'image ici

  1. Maudit et juré.

  2. Des choses brisées.

  3. Vérifié qu'un SELECTpeut utiliser le serveur lié :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Vérifié que le serveur client peut pingle serveur distant :

         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. Vérifié que le serveur distant peut renvoyer, par nom, au serveur initiateur:

         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. Vérifié que @@SERVERNAMEcorrespond au nom du serveur sur les deux serveurs :

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

    et

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

  8. Émis SET XACT_ABORT ONavant d'émettre ma requête :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Accordé Everyone Full Controlà :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    sur les deux serveurs.

Ian Boyd
la source
30
content de voir que vous n'avez pas sauté l'étape cruciale "maudit et juré"!
jwl
11
@joelarson Hé, parfois les gens sont très particuliers que vous suivez chaque étape. Je ne voulais pas que quelqu'un dise que je n'ai pas essayé quelque chose.
Ian Boyd
5
J'adore ce post. Il caractérise chaque expérience que j'ai jamais eue avec MSDTC.
A. Murray le
5
Dans mon cas, après avoir défini «Activer la promotion des transactions distribuées pour RPC» sur False sur le serveur lié, cela fonctionne. Essayez peut-être ça
Sarsaparilla
3
@HaiPhan La désactivation de l'utilisation des transactions distribuées brise l'intégrité transnationale: si vous annulez vos modifications sur le serveur local, cela signifie que les modifications resteront en place sur le serveur distant. Très dangereux.
Ian Boyd

Réponses:

31

Je l'ai trouvé, MSDTC sur le serveur distant était un clone du serveur local.

À partir du journal des événements d'application Windows:

Type d'événement: erreur
Source de l'événement: MSDTC
Catégorie d'événement: CM
L'ID d'événement: 4101
Date: 9/19/2011
Heure: 1:32:59 PM
Utilisateur: N / A
Ordinateur: ASITESTSERVER
Description:

Le MS DTC local a détecté que le MS DTC sur ASICMSTEST a la même identité unique que le MS DTC local. Cela signifie que les deux MS DTC ne pourront pas communiquer entre eux. Ce problème se produit généralement si l'un des systèmes a été cloné à l'aide d'outils de clonage non pris en charge. MS DTC nécessite que les systèmes soient clonés à l'aide d'outils de clonage pris en charge tels que SYSPREP. L'exécution de «msdtc -uninstall» puis de «msdtc -install» à partir de l'invite de commande résoudra le problème. Remarque: l'exécution de 'msdtc -uninstall' entraînera la perte de toutes les informations de configuration MS DTC par le système.

Pour plus d'informations, consultez le Centre d'aide et de support à l' adresse http://go.microsoft.com/fwlink/events.asp .

Fonctionnement

msdtc -uninstall
msdtc -install

puis l'arrêt et le redémarrage du service SQL Server l'ont corrigé.

Ian Boyd
la source
2
Voyons si j'ai raison: 1- msdtc -uninstall 2- msdtc -install 3- redémarrer le service SQL Server 4- redémarrer le service SQL Agent, juste pour être sûr 5- même redémarrer le service "Distributed Transaction Coordinator" ... J'ai fait tout cela sur les deux machines (serveur principal et serveur lié) un ~ et rien, toujours la même erreur!
Hamid Sadeghian
9

J'ai pu résoudre ce problème (comme d'autres l'ont mentionné dans les commentaires) en désactivant "Activer la promotion des transactions distribuées pour RPC" (c'est-à-dire en le définissant sur False):

entrez la description de l'image ici

Steve Bauman
la source
1
Cela a fonctionné pour moi. Ce qui est étrange, c'est que ça va bien pendant des semaines, puis ça a soudainement commencé. Peut-être parce que le service DTC du serveur distant est peut-être désactivé. Bref, merci.
Boyd P
6

OK, donc les services sont démarrés, il y a un chemin Ethernet entre eux, la résolution de nom fonctionne, les serveurs liés fonctionnent et vous avez désactivé l'authentification des transactions.

Mon instinct dit problème de pare-feu, mais certaines choses me viennent à l'esprit ...

  1. Les machines sont-elles dans le même domaine? (ouais, cela ne devrait pas avoir d'importance avec l'authentification désactivée)
  2. Les pare-feu fonctionnent-ils sur les machines? Le DTC peut être un peu pénible pour les pare-feu car il utilise une gamme de ports, voir http://support.microsoft.com/kb/306843 Pour le moment, je désactiverais les pare-feu pour identifier le problème
  3. Que dit le ping DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Sous quel compte le service SQL est-il exécuté?
EBarr
la source
2

Si les serveurs sont en cluster et qu'il existe un DTC en cluster, vous devez désactiver la sécurité sur le DTC en cluster et non sur le DTC local.

David Wolfinger
la source
1

Si votre serveur de destination se trouve sur un autre cloud ou centre de données, vous devez alors ajouter une entrée d'hôte du service MSDTC (serveur de destination) dans votre serveur source.

Essayez celui-ci si le problème n'est pas résolu, après avoir activé les paramètres MSDTC.

JERRY
la source
1

Pour moi, cela concerne le réglage du pare-feu. Accédez aux paramètres de votre pare-feu, autorisez le service DTC et cela a fonctionné.entrez la description de l'image ici

Hoang Tran
la source
0

Ma dernière aventure avec MSDTC et cette erreur aujourd'hui se sont avérées être un problème DNS. Vous êtes sur la bonne voie en demandant si les machines sont sur le même domaine, EBarr. Excellente liste pour ce numéro, au fait!

Ma situation: j'avais besoin d'un serveur dans un domaine enfant pour pouvoir exécuter des transactions distribuées contre un serveur du domaine parent via un pare-feu. J'ai utilisé un peu de serveurs liés au fil des ans, donc j'avais tous les paramètres habituels dans SQL pour un serveur lié et dans MSDTC que Ian a si bien documenté ci-dessus. J'ai mis en place MSDTC avec une gamme de ports TCP (5000-5200) à utiliser sur les deux serveurs, et organisé un trou de pare-feu entre les boîtes pour les ports 1433 et 5000-5200. Cela aurait dû marcher. Le serveur lié a testé OK et j'ai pu interroger le serveur SQL distant via le serveur lié, mais je ne pouvais pas l'obtenir pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur QA du serveur DEV, mais quelque chose ne faisait pas le voyage en arrière.

Je pourrais PING le serveur DEV de QA en utilisant un FQDN comme: PING DEVSQL.dev.domain.com

Je ne pouvais pas PING le serveur DEV avec juste le nom de la machine: PING DEVSQL

Le serveur DEVSQL était censé être membre des deux domaines, mais le nom ne se résolvait pas dans le DNS du domaine parent ... quelque chose était arrivé au compte machine pour DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS pour le domaine parent et que "PING DEVSQL" a fonctionné à partir du serveur QA distant, ce problème a été résolu pour nous.

J'espère que ça aide!

Marck
la source
0

Outre les paramètres de sécurité, j'ai dû ouvrir certains ports sur les deux serveurs pour que la transaction s'exécute. J'ai dû ouvrir le port 59640 mais selon la suggestion suivante, le port 135 doit être ouvert. http://support.microsoft.com/kb/839279

Trepach
la source
0

J'obtenais la même erreur et j'ai réussi à la résoudre en configurant correctement le MSDTC sur le serveur source pour autoriser les sorties et autoriser le DTC à travers le pare-feu Windows.

Autoriser le coordinateur de transactions distribuées, cocher le domaine, les options privées et publiques

Kaawach a dit
la source