Невозможно начать распределенную транзакцию - PullRequest
88 голосов
/ 19 сентября 2011

Я пытаюсь запустить SQL на связанном сервере, но я получаю ошибки.

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.

Поставщик возвращает две ошибки:

Ошибка #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

Ошибка № 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

Как заставить Microsoft отдать предпочтение функциональности над безопасностью?

Илипо крайней мере, как я могу заставить два сервера SQL общаться друг с другом?

Вопросы, связанные с этим


То, что я выполнил , не имеет значения, но я все равно опубликую это.

  1. Убедитесь, что служба Distributed Transaction Coordinator запущенана обеих машинах:

    enter image description here

    enter image description here

  2. Отключить все средства защиты MSDTC на обеих машинах:

    enter image description here

    enter image description here

  3. Включение случайных опций на связанном сервере:

enter image description here

Проклят и выругался.

Разбитые вещи.

Проверено, что SELECT может использовать связанныйсервер :

   SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
   ....

   (763 row(s) affected)

Проверено, что клиентский сервер может ping удаленный сервер :

    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

Проверено, что удаленный сервер может отправлять сообщения по имени на инициирующий сервер:

    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

Проверено, что @@SERVERNAME соответствует имени сервера на обоих серверах:

  SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')

  -------------  -------------
  ASITESTSERVER  ASITESTSERVER

и

  SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')

  ----------  ----------
  ASIGROBTEST  ASIGROBTEST

Кричать

Выдано SET XACT_ABORT ON довыдача запроса :

SET XACT_ABORT ON
GO
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions

Предоставлено Everyone Full Control до :

HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

на обоих серверах.

Ответы [ 6 ]

29 голосов
/ 19 сентября 2011

Нашел, MSDTC на удаленном сервере был клоном локального сервера.

Из журнала событий приложений Windows:

Тип события: ошибка
Источник события: MSDTC
Категория события: CM
Код события: 4101
Дата: 19.09.2011
Время: 13:32:59
Пользователь: N / A
Компьютер: ASITESTSERVER
Описание:

Местный MS DTC обнаружил, чтоMS DTC на ASICMSTEST имеет тот же уникальный идентификатор, что и локальный MS DTC.Это означает, что два MS DTC не смогут общаться друг с другом.Эта проблема обычно возникает, если одна из систем была клонирована с использованием неподдерживаемых инструментов клонирования.MS DTC требует, чтобы системы были клонированы с использованием поддерживаемых инструментов клонирования, таких как SYSPREP.Выполнение «msdtc -uninstall», а затем «msdtc -install» из командной строки решит проблему.Примечание. Запуск «msdtc -uninstall» приведет к потере системой всей информации о конфигурации MS DTC.

Для получения дополнительной информации см. Центр справки и поддержки по адресу http://go.microsoft.com/fwlink/events.asp.

Запуск

msdtc -uninstall
msdtc -install

, а затем остановка и перезапуск службы SQL Server исправили это.

6 голосов
/ 19 сентября 2011

ОК, значит, службы запущены, между ними есть сетевой путь, работает разрешение имен, работают связанные серверы, и вы отключили аутентификацию транзакций.

Моя интуиция говорит о проблеме с брандмауэром, но на ум приходит несколько вещей ...

  1. Машины находятся в одном домене? (да, не имеет значения при отключенной аутентификации)
  2. На компьютерах работают брандмауэры? DTC может быть немного болезненным для брандмауэров, поскольку он использует диапазон портов, см. http://support.microsoft.com/kb/306843 В настоящее время я бы отключил брандмауэры для выявления проблемы
  3. Что говорит пинг DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. От имени какой учетной записи работает служба SQL?
2 голосов
/ 09 октября 2014

Если серверы кластеризованы и есть кластерный код неисправности, вам необходимо отключить защиту кластерного кода неисправности, а не локального кода неисправности.

1 голос
/ 01 апреля 2017

Если ваш целевой сервер находится в другом облаке или дата-центре, необходимо добавить запись хоста MSDTC service (Destination Server) на исходном сервере.

Попробуйте эту, еслипроблема не решена, после включения настроек MSDTC.

0 голосов
/ 10 марта 2015

Помимо настроек безопасности, мне пришлось открыть несколько портов на обоих серверах для выполнения транзакции. Мне пришлось открыть порт 59640, но согласно следующему предложению порт 135 должен быть открыт. http://support.microsoft.com/kb/839279

0 голосов
/ 15 октября 2013

Мое последнее приключение с MSDTC и эта ошибка сегодня оказались проблемой DNS. Вы на правильном пути и спрашиваете, находятся ли машины в одном домене, EBarr. Потрясающий список для этого вопроса, кстати!

Моя ситуация: мне нужен был сервер в дочернем домене, чтобы можно было выполнять распределенные транзакции с сервером в родительском домене через брандмауэр. За прошедшие годы я немного использовал связанные серверы, поэтому у меня были все обычные настройки в SQL для связанного сервера и в MSDTC, которые Ян так хорошо описал выше. Я настроил MSDTC с диапазоном портов TCP (5000-5200) для использования на обоих серверах и устроил дыру в брандмауэре между полями для портов 1433 и 5000-5200. Это должно было сработать. Связанный сервер тестировался нормально, и я мог красиво запросить удаленный SQL-сервер через связанный сервер, но я не мог заставить его разрешить распределенную транзакцию. Я даже мог видеть соединение на сервере QA с сервера DEV, но что-то не возвращало.

Я мог бы пропинговать сервер DEV из QA, используя полное доменное имя типа: PING DEVSQL.dev.domain.com

Я не смог PING-сервер DEV только с именем машины: PING DEVSQL

Сервер DEVSQL должен был быть членом обоих доменов, но имя не разрешалось в DNS родительского домена ... что-то случилось с учетной записью компьютера для DEVSQL в родительском домене. Как только мы добавили DEVSQL в DNS для родительского домена, и «PING DEVSQL» работал с удаленного сервера QA, эта проблема была решена для нас.

Надеюсь, это поможет!

...