web-dev-qa-db-fra.com

L'opération n'a pas pu être effectuée car OLE le fournisseur de base de données "SQLNCLI11" pour le serveur lié n'a pas pu commencer une transaction distribuée

J'essaie d'exécuter une transaction distribuée de ma machine (SQL Server 2012) vers un serveur client (SQL Server 2008).

J'essaye de courir:

begin distributed transaction
select * from [172.01.01.01].master.dbo.sysprocesses
Commit Transaction

et je reçois:

OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" was unable to begin a distributed transaction.

Je peux exécuter un SELECT sur ce serveur avec des données qui reviennent, donc au moins je sais que les serveurs peuvent se voir, et le serveur lié existe et fonctionne

Maintenant, il existe plusieurs publications sur le Web pour cela, mais je ne peux pas le faire fonctionner. Voici ce que j'ai essayé jusqu'à présent: 1. Définissez les propriétés DTC comme suit (sur les deux serveurs) enter image description here

  1. Redémarrage du coordinateur de transactions distribuées (MSDTC) à partir du Panneau de configuration -> Services (sur les deux serveurs).

  2. DTC désinstallé et installé (sur les deux serveurs).

  3. Redémarré le serveur distant.

  4. Désactivé le pare-feu sur les deux serveurs.

  5. Activé sp_configure 'Ad Hoc Distributed Queries', 1 (sur les deux serveurs).

  6. J'ai exécuté DTCPing et le ping a réussi.

  7. Les propriétés du serveur lié ont été modifiées comme suit: enter image description here

Qu'y a-t-il d'autre à essayer?

MISE À JOUR: L'exécution de la transaction d'un autre serveur vers 172.01.01.01 fonctionne. Par conséquent, le problème n'est pas sur le serveur de destination, mais sur ma machine qui est la source.

13
Cameron Castillo

Si après avoir configuré votre MS Distributed Transaction Coordinator (MSDTC) sur les deux serveurs SQL selon la publication d'origine de l'OP, vous obtenez toujours "aucune transaction active", vous devez vérifier que chaque hôte est accessible via l'IP (en supposant que c'est ce que vous avez utilisé) enregistré sur le serveur lié.

Par exemple; sur une configuration récente, deux serveurs SQL étaient accessibles via un réseau dans la plage 192.168.200.x (même sous-réseau), mais chaque serveur était également indirectement connecté via une adresse IP dans la plage 10.x.x.x. Sur un serveur SQL, le serveur DNS utilisé a continué de résoudre le serveur SQL cible en son IP 10.x.x.x (qui était pare-feu), même si l'entrée du serveur lié utilisait l'IP dans le 192.168.200.x du serveur cible.

Il semble que MSDTC utilise le nom d'hôte du serveur, tandis que le serveur SQL se connecte sur toute connexion liée en utilisant l'IP ou le nom d'hôte défini dans l'entrée de serveur lié, ce qui conduit à ce comportement déroutant de connectivité apparente lors de la vérification du serveur lié cible dans SQL Management Studio, mais incapacité à exécuter des procédures distantes sur la cible.

La solution consistait à ajouter des entrées dans le fichier hôte (% windir%\system32\drivers\etc\hosts) pour forcer explicitement chaque serveur SQL à résoudre l'autre à l'adresse IP sur le réseau 192.168.200.x.

Sur l'hôte 1 (IP 192.168.200.15):

# TARGET SERVER
192.168.200.20    targetserverhostname.and.any.domain.suffix  targetserverhostname

Sur l'hôte 2 (IP 192.168.200.2)

# SOURCE SERVER
192.168.200.15    sourceserverhostname.and.any.domain.suffix sourceserverhostname

N'oubliez pas de vous assurer que MSDTC a été configuré conformément à la capture d'écran de l'OP ci-dessus permettant l'accès au réseau et (si nécessaire) aucune authentification.

5
Yumbelie

La définition de l'indicateur "Activer la promotion de la transaction distribuée" sur false (dans la fenêtre Propriétés du serveur lié) a résolu mon problème similaire.

11
A.K.

J'ai rencontré un problème similaire et je l'ai résolu comme suit. Il existe un nœud dans l'arborescence de l'Explorateur d'objets dans SQL Server. Vous y trouverez Serverobjects → LinkedServers → ci-dessous, il y a une liste d'adresses IP des serveurs distribués.

Faites un clic droit dessus, sélectionnez les propriétés, une fenêtre apparaîtra. Sélectionnez les options du serveur dans le volet gauche; vous obtiendrez la liste des propriétés. Définissez la valeur de l'indicateur false sur la propriété "Activer la promotion de la transaction distribuée".

10
Srinu

essayez ce SQL au-dessus de votre transaction distribuée de début

set XACT_ABORT on
1
AZ Chad

J'avais un problème similaire. Je suis allé à travers toutes les choses énumérées en vain. Nous avons un environnement de cluster et il s'avère que notre DBA effectuait les services sur le cluster et non sur le serveur principal. Cela vaut la peine de garder cela à l'esprit si tout le reste échoue :-)

0
Wiaan van Aswegen