No se puede iniciar una transacción distribuida

95

Estoy tratando de ejecutar SQL en un servidor vinculado, pero recibo los siguientes errores:

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.

Hay dos errores devueltos por el proveedor:

Error # 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

Error # 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

¿Cómo consigo que Microsoft favorezca la funcionalidad sobre la seguridad?

O, al menos, ¿cómo puedo hacer que dos servidores SQL se comuniquen entre sí?

Preguntas relacionadas


Lo que he hecho es irrelevante, pero lo publicaré de todos modos.

  1. Asegúrese de que el Distributed Transaction Coordinatorservicio se esté ejecutando en ambas máquinas:

    ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

  2. Deshabilite toda la seguridad de MSDTC en ambas máquinas:

    ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

  3. Active las opciones aleatorias en el servidor vinculado:

ingrese la descripción de la imagen aquí

  1. Maldito y jurado.

  2. Cosas destrozadas.

  3. Comprobado que SELECTpuede utilizar el servidor vinculado :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. Comprobado que el servidor cliente puede pingel servidor 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. Comprobado que el servidor remoto puede comunicarse de nuevo, por nombre, al servidor de inicio:

         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. Comprobado que @@SERVERNAMEcoincide con el nombre del servidor en ambos servidores :

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

    y

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

  8. Emitido SET XACT_ABORT ONantes de emitir mi consulta :

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

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    en ambos servidores.

Ian Boyd
fuente
30
¡Es bueno ver que no te saltaste el paso crucial de "maldición y maldición"!
jwl
11
@joelarson Oye, a veces la gente es muy particular en que sigas cada paso. No quería que nadie dijera que no intenté algo.
Ian Boyd
5
Me encanta esta publicación. Tipifica cada experiencia que he tenido con MSDTC.
A. Murray
5
En mi caso, después de configurar "Habilitar promoción de transacciones distribuidas para RPC" en Falso en el servidor vinculado, funciona. Tal vez intente eso
Sarsaparilla
3
@HaiPhan Desactivar el uso de transacciones distribuidas rompe la integridad transnacional: si revierte sus cambios en el servidor local significa que los cambios permanecerán en su lugar en el servidor remoto. Muy peligroso.
Ian Boyd

Respuestas:

31

Lo encontré, MSDTC en el servidor remoto era un clon del servidor local.

Desde el registro de eventos de la aplicación de Windows:

Tipo de evento: Error
Origen del evento: MSDTC
Categoría del evento: CM
Identificador de evento: 4101
Fecha: 19/09/2011
Hora: 1:32:59 PM
Usuario: N / D
Equipo: ASITESTSERVER
Descripción:

El MS DTC local detectó que el MS DTC en ASICMSTEST tiene la misma identidad única que el MS DTC local. Esto significa que los dos MS DTC no podrán comunicarse entre sí. Este problema suele ocurrir si uno de los sistemas se clonó con herramientas de clonación no compatibles. MS DTC requiere que los sistemas se clonen utilizando herramientas de clonación compatibles como SYSPREP. Ejecutar 'msdtc -uninstall' y luego 'msdtc -install' desde el símbolo del sistema solucionará el problema. Nota: Si ejecuta 'msdtc -uninstall', el sistema perderá toda la información de configuración de MS DTC.

Para obtener más información, consulte el Centro de ayuda y soporte técnico en http://go.microsoft.com/fwlink/events.asp .

Corriendo

msdtc -uninstall
msdtc -install

y luego detener y reiniciar el servicio SQL Server lo solucionó.

Ian Boyd
fuente
2
Veamos si lo hice bien: 1- msdtc -uninstall 2- msdtc -install 3- reiniciar el servicio SQL Server 4- reiniciar el servicio SQL Agent, solo para estar seguro 5- incluso reiniciar el servicio "Distributed Transaction Coordinator" ... Hice todo esto en ambas máquinas (servidor principal y servidor vinculado) a ~ y nada, ¡sigue siendo el mismo error!
Hamid Sadeghian
9

Yo era capaz de resolver este problema (como otros mencionados en los comentarios) deshabilitando "Activar Promoción de transacciones distribuidas para RPC" (es decir, poniéndolo a False):

ingrese la descripción de la imagen aquí

Steve Bauman
fuente
1
Esto funcionó para mí. Lo extraño es que ha estado bien durante semanas y luego comenzó de repente. Posiblemente porque el servicio DTC del servidor remoto podría estar desactivado. Gracias de todas formas.
Boyd P
6

Bien, entonces los servicios se inician, hay una ruta de Ethernet entre ellos, la resolución de nombres funciona, los servidores vinculados funcionan y usted deshabilitó la autenticación de transacciones.

Mi instinto dice problema de firewall, pero algunas cosas me vienen a la mente ...

  1. ¿Están las máquinas en el mismo dominio? (sí, no debería importar con la autenticación deshabilitada)
  2. ¿Se están ejecutando firewalls en las máquinas? DTC puede ser un poco molesto para los firewalls, ya que utiliza una variedad de puertos, consulte http://support.microsoft.com/kb/306843 Por el momento, deshabilitaría los firewalls para identificar el problema
  3. ¿Qué dice el ping DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. ¿Con qué cuenta se ejecuta el servicio SQL?
EBarr
fuente
2

Si los servidores están agrupados y hay un DTC agrupado, debe desactivar la seguridad en el DTC agrupado, no en el DTC local.

David Wolfinger
fuente
1

Si su servidor de destino está en otra nube o centro de datos, debe agregar la entrada de host del servicio MSDTC (servidor de destino) en su servidor de origen.

Pruebe este si el problema no se resuelve, después de habilitar la configuración de MSDTC.

ALEMÁN
fuente
1

Para mí, se relaciona con la configuración del Firewall. Vaya a la configuración de su firewall, permita el servicio DTC y funcionó.ingrese la descripción de la imagen aquí

Hoang Tran
fuente
0

Mi última aventura con MSDTC y este error de hoy resultó ser un problema de DNS. Estás en el camino correcto preguntando si las máquinas están en el mismo dominio, EBarr. ¡Excelente lista para este número, por cierto!

Mi situación: necesitaba un servidor en un dominio secundario para poder ejecutar transacciones distribuidas contra un servidor en el dominio principal a través de un firewall. He usado servidores vinculados bastante a lo largo de los años, por lo que tenía todas las configuraciones habituales en SQL para un servidor vinculado y en MSDTC que Ian documentó tan bien anteriormente. Configuré MSDTC con un rango de puertos TCP (5000-5200) para usar en ambos servidores, y dispuse un agujero de firewall entre las cajas para los puertos 1433 y 5000-5200. Eso debería haber funcionado. El servidor vinculado probó bien y pude consultar bien el servidor SQL remoto a través del servidor vinculado, pero no pude lograr que permitiera una transacción distribuida. Incluso pude ver una conexión en el servidor de QA desde el servidor DEV, pero algo no estaba haciendo el viaje de regreso.

Podría hacer ping al servidor DEV desde QA usando un FQDN como: PING DEVSQL.dev.domain.com

No pude hacer ping al servidor DEV con solo el nombre de la máquina: PING DEVSQL

Se suponía que el servidor DEVSQL era miembro de ambos dominios, pero el nombre no se resolvía en el DNS del dominio principal ... algo le había sucedido a la cuenta de la máquina para DEVSQL en el dominio principal. Una vez que agregamos DEVSQL al DNS para el dominio principal y "PING DEVSQL" funcionó desde el servidor de control de calidad remoto, este problema se resolvió para nosotros.

¡Espero que esto ayude!

Marck
fuente
0

Aparte de la configuración de seguridad, tuve que abrir algunos puertos en ambos servidores para que se ejecutara la transacción. Tuve que abrir el puerto 59640 pero de acuerdo con la siguiente sugerencia, el puerto 135 tiene que estar abierto. http://support.microsoft.com/kb/839279

Trepach
fuente
0

Recibí el mismo error y logré resolverlo configurando el MSDTC correctamente en el servidor de origen para permitir la salida y permitir el DTC a través del firewall de Windows.

Permitir que el Coordinador de transacciones distribuidas, marque el dominio, las opciones públicas y privadas

Kaawach dijo
fuente