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
- La operación no se pudo realizar porque el proveedor OLE DB "SQLNCLI10" ... (* el nombre del servidor vinculado es
(null)
) - ¿Error de transacción distribuida? ( utilizando el proveedor de Oracle )
- No se puede enlistar en una transacción distribuida con NHibernate ( usando Hibernate )
- Error al usar transacciones distribuidas en SQL Server 2008 R2 ( SQL Server 2008 R2, sin respuesta )
- Error de transacción distribuida solo a través del código ( causado por la agrupación de conexiones )
- Error al realizar el coordinador de transacciones distribuidas en el servidor vinculado ( SQL Server 2008, sin respuesta )
- ¿Error de transacción distribuida? ( no hay respuesta aceptada; la única respuesta no ayuda )
- ¿Cómo insertar en una tabla remota usando un servidor vinculado dentro de la transacción? (la respuesta aceptada no se resuelve )
Lo que he hecho es irrelevante, pero lo publicaré de todos modos.
Asegúrese de que el
Distributed Transaction Coordinator
servicio se esté ejecutando en ambas máquinas:Deshabilite toda la seguridad de MSDTC en ambas máquinas:
Active las opciones aleatorias en el servidor vinculado:
Maldito y jurado.
Cosas destrozadas.
Comprobado que
SELECT
puede utilizar el servidor vinculado :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
Comprobado que el servidor cliente puede
ping
el 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
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
Comprobado que
@@SERVERNAME
coincide con el nombre del servidor en ambos servidores :SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ------------- ------------- ASITESTSERVER ASITESTSERVER
y
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ---------- ---------- ASIGROBTEST ASIGROBTEST
Gritó
Emitido
SET XACT_ABORT ON
antes de emitir mi consulta :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
Otorgado
Everyone
Full Control
a :HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
en ambos servidores.
Respuestas:
Lo encontré, MSDTC en el servidor remoto era un clon del servidor local.
Desde el registro de eventos de la aplicación de Windows:
Corriendo
y luego detener y reiniciar el servicio SQL Server lo solucionó.
fuente
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
):fuente
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 ...
fuente
Si los servidores están agrupados y hay un DTC agrupado, debe desactivar la seguridad en el DTC agrupado, no en el DTC local.
fuente
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.
fuente
Para mí, se relaciona con la configuración del Firewall. Vaya a la configuración de su firewall, permita el servicio DTC y funcionó.
fuente
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!
fuente
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
fuente
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
fuente