web-dev-qa-db-fra.com

Impossible de commencer une transaction distribuée

j'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs.

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 faire en sorte que Microsoft privilégie la fonctionnalité à la sécurité?

Ou, au minimum, comment puis-je faire en sorte que deux SQL Severs se parlent?

Questions connexes


Ce que j'ai ont fait n'est pas pertinent, mais je le posterai quand même.

  1. Assurez-vous que le service Distributed Transaction Coordinator est exécuté sur les deux machines:

    enter image description here

    enter image description here

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

     enter image description here

    enter image description here

  3. Activer des options aléatoires sur le serveur lié:

 enter image description here

  1. Maudit et juré.

  2. Des choses écrasées.

  3. Vérifié qu'une SELECT peut utiliser le serveur lié} _:

       SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
       ....
    
       (763 row(s) affected)
    
  4. Vérifié que le serveur client peut ping le 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 son nom, le serveur de départ:

        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 @@SERVERNAME correspond au nom du serveur sur les deux serveurs :

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

    et

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

  8. Publié SET XACT_ABORT ON avant d'émettre ma requête :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. Attribué EveryoneFull Control à :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    sur les deux serveurs.

87
Ian Boyd

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
ID d'événement: 4101
Date: 19/09/2011
Heure: 13:32:59
Utilisateur: N/A
Ordinateur: ASITESTSERVER
La description: 

Le MS DTC local a détecté que le MS DTC sur ASICMSTEST a la même identité unique que le MS .__ local. DTC. Cela signifie que les deux MS DTC ne seront pas en mesure de communiquer avec l'un l'autre. Ce problème se produit généralement si l’un des systèmes ont été clonés à l’aide d’outils de clonage non pris en charge. MS DTC exige que le systèmes peuvent être clonés à l’aide d’outils de clonage pris en charge tels que SYSPREP . Exécutez 'msdtc -uninstall' puis 'msdtc -install' à partir de la commande Invite va résoudre le problème. Remarque: L'exécution de 'msdtc -uninstall' entraînera entraîner la perte de toutes les informations de configuration MS DTC.

Pour plus d'informations, voir 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’a corrigé.

28
Ian Boyd

OK, les services sont démarrés, il existe un chemin Ethernet entre eux, la résolution de noms fonctionne, les serveurs liés fonctionnent et vous avez désactivé l'authentification de transaction. 

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

  1. Les machines sont dans le même domaine? (ouais, ça ne devrait pas avoir d'importance avec l'authentification désactivée)
  2. Est-ce que les pare-feu fonctionnent sur les machines? Les DTC peuvent être un peu pénibles pour les pare-feu car ils utilisent une gamme de ports, voir http://support.Microsoft.com/kb/306843 Pour le moment, je désactiverais les pare-feu pour identifier 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é?
6
EBarr

J'ai réussi à 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":

enter image description here

2
Steve Bauman

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 le DTC local.

2
David Wolfinger

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

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

1
JERRY

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

0
Trepach

Ma dernière aventure avec MSDTC et cette erreur aujourd'hui se sont révélés être un problème de DNS. Vous êtes sur la bonne voie pour demander si les machines sont sur le même domaine, EBarr. Liste terrifiante 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 sur un serveur du domaine parent via un pare-feu. Au fil des années, j'ai utilisé pas mal de serveurs liés. Je disposais donc de tous les paramètres habituels en SQL pour un serveur lié et en MSDTC, que Ian avait si bien documentés. J'ai configuré MSDTC avec une plage de TCP ports (5000-5200) à utiliser sur les deux serveurs et organisé un trou de pare-feu entre les boîtiers des ports 1433 et 5000-5200. Cela aurait dû fonctionner. Le serveur lié a été testé correctement et j'ai pu interroger correctement le serveur SQL distant via le serveur lié, mais je ne pouvais pas le faire pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur d'assurance qualité à partir du serveur DEV, mais quelque chose ne faisait pas le voyage en arrière. 

Je pourrais faire un ping sur le serveur DEV du contrôle qualité en utilisant un nom de domaine complet comme: PING DEVSQL.dev.domain.com

Je ne pouvais pas lancer une commande ping sur le serveur DEV uniquement avec le nom de la machine: PING DEVSQL

Le serveur DEVSQL était supposé être membre des deux domaines, mais le nom n'était pas résolu dans le DNS du domaine parent ... il était arrivé quelque chose au compte d'ordinateur de DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS du domaine parent et que "PING DEVSQL" fonctionnait à partir du serveur QA distant, ce problème a été résolu pour nous. 

J'espère que ça aide!

0
Marck