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 retournées par le fournisseur:
erreur #1:
Number: 040E14
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: "151910920"000000
SQLState: 01000
NativeError: 7412
erreur #2
Number: 040E14
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: "151920920"000000
SQLState: 42000
NativeError: 7391
Comment faire pour que Microsoft privilégie la fonctionnalité à la sécurité?
Ou, à tout le moins, comment puis-je obtenir deux SQL Severs pour se parler?
questions connexes
- l'opération n'a pas pu être effectuée parce que le fournisseur OLE DB "SQLNCLI10"... (*le nom du serveur lié est
(null)
) - erreur de transaction distribuée? ( utilisation d'Oracle fournisseur )
- impossible de s'enrôler dans une transaction distribuée avec NHibernate ( en hibernation )
- Erreur à l'aide de transaction distribuée dans SQL Server 2008 R2 ( SQL Server 2008 R2, pas de réponse )
- erreur de Transaction distribuée uniquement par le Code ( causée par la mise en commun des connexions )
- erreur effectuant une transaction distribuée coordinateur sur le serveur ( SQL Server 2008, Pas de réponse )
- erreur de transaction distribuée? ( pas de réponse; la seule réponse n'aide pas )
- Comment insérer dans une table distante en utilisant un serveur lié avec une Transaction? ( accepté de réponse ne permet pas de résoudre )
ce que je ai fait n'est pas pertinent, mais je le posterai quand même.
-
S'assurer
Distributed Transaction Coordinator
le service fonctionne sur les deux machines: -
désactiver toute sécurité MSDTC sur les deux machines:
-
activez les options aléatoires sur le serveur lié:
-
maudit et juré.
-
cassé des choses.
-
vérifié qu'un
SELECT
peut utiliser le serveur lié :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
-
vérifié que le serveur client peut
ping
le serveur distant :C:Documents and Settingsavatar>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
-
vérifié que le serveur distant peut recomposer, par nom, le serveur initiateur:
C:Documents and Settingsavatar>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
-
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
-
CRI
-
Délivré
SET XACT_ABORT ON
avant de délivrer ma requête :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
-
accordée
Everyone
Full Control
à :HKEY_LOCAL_MACHINESoftwareMicrosoftMSSQLServer
sur les deux serveurs.
6 réponses
L'a trouvé, MSDTC sur le serveur distant était un clone du serveur local.
du journal des événements de L'Application Windows:
Type D'Événement: Erreur
Source de l'événement: MSDTC
Catégorie D'événement: CM
Code de l'événement: 4101
Date: 9/19/2011
Temps: 1:32:59
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 local DTC. Cela signifie que les deux MS DTC ne seront pas en mesure de communiquer les uns avec les autres. Ce problème se produit généralement si l'un des systèmes d' ont été clonés à l'aide d'outils de Clonage non supportés. Le DTC exige que la les systèmes doivent être clonés à l'aide d'outils de Clonage pris en charge tels que: SYSPREP. 'Msdtc -désinstaller", puis "installer msdtc-" de la commande invite de résoudre le problème. Note: exécuter 'msdtc-uninstall' va résultat: le système perd toutes les informations de configuration MS DTC.
pour plus d'informations, voir centre D'AIDE et de soutien à http://go.microsoft.com/fwlink/events.asp .
Running
msdtc -uninstall
msdtc -install
et puis s'arrêter et le redémarrage du service de serveur SQL l'a corrigé.
OK, donc les services sont lancés, il y a un chemin ethernet entre eux, la résolution des noms fonctionne, les serveurs liés fonctionnent, et vous avez désactivé l'authentification des transactions.
mon instinct dit problème de pare-feu, mais quelques choses viennent à l'esprit...
- les machines sont-elles dans le même domaine? (ouais, ne devrait pas désactivé l'authentification)
- est-ce que les pare-feu fonctionnent sur les machines? DTC peut être un peu de douleur pour pare-feu comme 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
- que dit DTC ping? http://www.microsoft.com/download/en/details.aspx?id=2868
- sous quel compte le service SQL fonctionne-t-il ?
si les serveurs sont groupés et qu'il y a un DTC groupé, vous devez désactiver la sécurité sur le DTC groupé et non sur le DTC local.
si votre serveur de Destination se trouve sur un autre cloud ou un autre centre de données, vous devez ajouter l'entrée hôte de service MSDTC(serveur de Destination) dans votre serveur source.
essayez celui-ci si le problème n'est pas résolu, après activer les paramètres MSDTC.
ma dernière aventure avec MSDTC et cette erreur aujourd'hui s'est avérée être un problème DNS. Vous êtes sur la bonne voie en demandant si les machines sont sur le même domaine, EBarr. Liste formidable de ce problème, par la manière dont!
Ma situation: j'avais besoin d'un serveur dans un domaine enfant pour pouvoir exécuter des transactions distribuées contre un serveur dans le domaine parent via un pare-feu. J'ai utilisé assez de serveurs connectés au fil des années, donc J'ai eu tous les réglages habituels en SQL pour un serveur lié et dans MSDTC que Ian a si bien documenté ci-dessus. J'ai configuré MSDTC avec une gamme de ports TCP (5000-5200) à utiliser sur les deux serveurs, et arrangé un trou de pare-feu entre les boîtes pour les ports 1433 et 5000-5200. Cela aurait travaillé. Le serveur lié a testé OK et je pouvais interroger le serveur SQL distant via le serveur lié correctement, mais je n'ai pas pu l'obtenir pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur QA depuis le serveur DEV, mais quelque chose n'était pas de faire le voyage de retour.
je pourrais pinguer le serveur DEV depuis QA en utilisant un FQDN comme: PING DEVSQL.dev.domain.com
Je ne pouvais PING le serveur DEV avec juste le nom de la machine: ping DEVSQL
le serveur DEVSQL était supposé être un 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 de DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS pour le domaine parent, et" PING DEVSQL " a fonctionné à partir du serveur QA distant, ce problème a été résolu pour nous.
j'espère que cela aide!
mis à part 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 est ouvert. http://support.microsoft.com/kb/839279