Impossibile avviare una transazione distribuita


95

Sto cercando di eseguire SQL su un server collegato, ma ottengo gli errori seguenti:

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.

Ci sono due errori restituiti dal provider:

Errore 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

Errore 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

Come posso convincere Microsoft a preferire la funzionalità alla sicurezza?

O, almeno, come posso fare in modo che due SQL Severs parlino tra loro?

Domande correlate


Quello che ho fatto è irrilevante, ma lo posterò comunque.

  1. Assicurati che il Distributed Transaction Coordinatorservizio sia in esecuzione su entrambi i computer:

    inserisci qui la descrizione dell'immagine

    inserisci qui la descrizione dell'immagine

  2. Disabilita tutta la sicurezza MSDTC su entrambe le macchine:

    inserisci qui la descrizione dell'immagine

    inserisci qui la descrizione dell'immagine

  3. Attiva le opzioni casuali sul server collegato:

inserisci qui la descrizione dell'immagine

  1. Maledetto e imprecato.

  2. Cose distrutte.

  3. Controllato che un SELECTpossa utilizzare il server collegato :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Controllato che il server client possa pingil server remoto :

         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. Controllato che il server remoto possa comunicare di nuovo, per nome, al server che ha avviato:

         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. Selezionato che @@SERVERNAMEcorrisponda al nome del server su entrambi i server :

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

    e

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

  8. Emesso SET XACT_ABORT ONprima di inviare la mia richiesta :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Concesso Everyone Full Controla :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    su entrambi i server.


30
bello vedere che non hai saltato il passaggio cruciale "maledetto e giurato"!
jwl

11
@joelarson Ehi, a volte le persone sono molto particolari nel fatto che tu segua ogni passo. Non volevo che nessuno dicesse che non avevo provato qualcosa.
Ian Boyd

5
Amo questo post. Tipizza ogni esperienza che abbia mai avuto con MSDTC.
A. Murray

5
Nel mio caso, dopo aver impostato "Abilita la promozione delle transazioni distribuite per RPC" su False sul server collegato, funziona. Forse
provateci

3
@HaiPhan Disattivare l'uso delle transazioni distribuite interrompe l'integrità transnazionale: se ripristini le tue modifiche sul server locale significa che le modifiche rimarranno sul server remoto. Molto pericoloso.
Ian Boyd

Risposte:


31

Trovato, MSDTC sul server remoto era un clone del server locale.

Dal registro degli eventi dell'applicazione Windows:

Tipo evento: errore
Origine evento: MSDTC
Categoria evento: CM
ID evento: 4101
Data: 19/09/2011
Ora: 1:32:59 PM
Utente: N / D
Computer: ASITESTSERVER
Descrizione:

L'MS DTC locale ha rilevato che l'MS DTC su ASICMSTEST ha la stessa identità univoca dell'MS DTC locale. Ciò significa che i due MS DTC non saranno in grado di comunicare tra loro. Questo problema si verifica in genere se uno dei sistemi è stato clonato utilizzando strumenti di clonazione non supportati. MS DTC richiede che i sistemi vengano clonati utilizzando strumenti di clonazione supportati come SYSPREP. L'esecuzione di "msdtc -uninstall" e quindi "msdtc -install" dal prompt dei comandi risolverà il problema. Nota: l'esecuzione di "msdtc -uninstall" comporterà la perdita di tutte le informazioni di configurazione di MS DTC da parte del sistema.

Per ulteriori informazioni, vedere Guida e supporto tecnico all'indirizzo http://go.microsoft.com/fwlink/events.asp .

In esecuzione

msdtc -uninstall
msdtc -install

e quindi l'arresto e il riavvio del servizio SQL Server lo hanno risolto.


2
Vediamo se ho capito bene: 1- msdtc -uninstall 2- msdtc -install 3- riavvia il servizio SQL Server 4- riavvia il servizio SQL Agent, solo per essere sicuri 5- riavvia anche il servizio "Distributed Transaction Coordinator" ... Ho fatto tutto questo su entrambe le macchine (server principale e server collegato) a ~ e niente, sempre lo stesso errore!
Hamid Sadeghian il

9

Sono stato in grado di risolvere questo problema (come altri menzionati nei commenti) disabilitando "Abilita la promozione delle transazioni distribuite per RPC" (ovvero impostandolo su False):

inserisci qui la descrizione dell'immagine


1
Questo ha funzionato per me. La cosa strana è che è andato tutto bene per settimane, e poi improvvisamente è iniziato. Probabilmente perché il servizio DTC del server remoto potrebbe essere disabilitato. Comunque grazie.
Boyd P

6

OK, quindi i servizi vengono avviati, c'è un percorso ethernet tra di loro, la risoluzione dei nomi funziona, i server collegati funzionano e hai disabilitato l'autenticazione della transazione.

Il mio istinto dice che c'è un problema con il firewall, ma mi vengono in mente alcune cose ...

  1. Le macchine sono nello stesso dominio? (sì, non dovrebbe importare con l'autenticazione disabilitata)
  2. I firewall sono in esecuzione sulle macchine? DTC può essere un po 'fastidioso per i firewall poiché utilizza una gamma di porte, vedere http://support.microsoft.com/kb/306843 Per il momento, disabiliterei i firewall per identificare il problema
  3. Cosa dice il ping DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Con quale account viene eseguito il servizio SQL?

2

Se i server sono in cluster e c'è un DTC in cluster, è necessario disabilitare la protezione sul DTC in cluster e non nel DTC locale.


1

Se il server di destinazione si trova su un altro cloud o data center, è necessario aggiungere la voce host del servizio MSDTC (server di destinazione) nel server di origine.

Prova questo se il problema non viene risolto, dopo aver abilitato le impostazioni di MSDTC.


1

Per me, si riferisce all'impostazione del firewall. Vai alle impostazioni del firewall, consenti il ​​servizio DTC e ha funzionato.inserisci qui la descrizione dell'immagine


0

La mia ultima avventura con MSDTC e questo errore di oggi si è rivelato essere un problema DNS. Sei sulla strada giusta chiedendo se le macchine sono sullo stesso dominio, EBarr. Fantastico elenco per questo numero, a proposito!

La mia situazione: avevo bisogno di un server in un dominio figlio per poter eseguire transazioni distribuite su un server nel dominio padre attraverso un firewall. Ho utilizzato server collegati un po 'nel corso degli anni, quindi avevo tutte le solite impostazioni in SQL per un server collegato e in MSDTC che Ian ha documentato così bene sopra. Ho impostato MSDTC con una gamma di porte TCP (5000-5200) da utilizzare su entrambi i server e ho predisposto un buco del firewall tra le scatole per le porte 1433 e 5000-5200. Avrebbe dovuto funzionare. Il server collegato è stato testato correttamente e ho potuto interrogare correttamente il server SQL remoto tramite il server collegato, ma non sono riuscito a farlo consentire una transazione distribuita. Potevo persino vedere una connessione sul server QA dal server DEV, ma qualcosa non stava tornando indietro.

Potrei PING il server DEV da QA utilizzando un FQDN come: PING DEVSQL.dev.domain.com

Non sono riuscito a eseguire il ping del server DEV solo con il nome della macchina: PING DEVSQL

Il server DEVSQL avrebbe dovuto essere un membro di entrambi i domini, ma il nome non si risolveva nel DNS del dominio padre ... era successo qualcosa all'account macchina per DEVSQL nel dominio padre. Dopo aver aggiunto DEVSQL al DNS per il dominio principale e "PING DEVSQL" ha funzionato dal server QA remoto, questo problema è stato risolto per noi.

Spero che aiuti!


0

A parte le impostazioni di sicurezza, ho dovuto aprire alcune porte su entrambi i server per eseguire la transazione. Ho dovuto aprire la porta 59640 ma secondo il seguente suggerimento, la porta 135 deve essere aperta. http://support.microsoft.com/kb/839279


0

Ho ricevuto lo stesso errore e sono riuscito a risolverlo configurando correttamente MSDTC sul server di origine per consentire l'uscita e consentire il DTC attraverso il firewall di Windows.

Consenti al Distributed Transaction Coordinator, seleziona dominio, opzioni private e pubbliche

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.