Невозможно начать распределенную транзакцию

97

Я пытаюсь запустить 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сервис работает на обоих машинах:

    введите описание изображения здесь

    введите описание изображения здесь

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

    введите описание изображения здесь

    введите описание изображения здесь

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

введите описание изображения здесь

  1. Проклинал и ругал.

  2. Разбил вещи.

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

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. Проверил, что клиент-сервер может 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
    
  5. Проверено, что удаленный сервер может связываться по имени с инициирующим сервером:

         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. Проверено, @@SERVERNAMEсоответствует ли имя сервера на обоих серверах :

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

    а также

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
    
  7. Кричал

  8. Выпущено SET XACT_ABORT ONдо отправки моего запроса :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. Конечно , Everyone Full Controlчтобы :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

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

Ян Бойд
источник
32
приятно видеть, что вы не пропустили решающий шаг «проклял и поклялся»!
jwl
11
@joelarson Эй, иногда люди очень разборчивы в том, что ты следишь за каждым шагом. Я не хотел, чтобы кто-то говорил, что я что-то не пробовал.
Ian Boyd
5
Мне нравится этот пост Он олицетворяет каждый мой опыт работы с MSDTC.
А. Мюррей
5
В моем случае, после того как я установил для параметра «Включить продвижение распределенных транзакций для RPC» значение False на связанном сервере, он заработает. Может быть , попробовать что
Sarsaparilla
3
@HaiPhan Отключение использования распределенных транзакций нарушает транснациональную целостность: если вы откатите свои изменения на локальном сервере, это означает, что изменения останутся на месте на удаленном сервере. Очень опасно.
Ian Boyd

Ответы:

31

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

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

Тип события: ошибка
Источник события: MSDTC
Категория события: CM
Идентификатор события: 4101
Дата: 19 сентября 2011 г.
Время: 13:32:59
Пользователь: н / д
Компьютер: 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 исправили это.

Ян Бойд
источник
2
Посмотрим, правильно ли я понял: 1- msdtc -uninstall 2- msdtc -install 3- перезапустить службу SQL Server 4- перезапустить службу агента SQL, на всякий случай 5- даже перезапустить службу «Координатор распределенных транзакций» ... Я сделал все это на обеих машинах (главный сервер и связанный сервер) ~ и ничего, все та же ошибка!
Hamid Sadeghian
11

Мне удалось решить эту проблему (как другие упоминались в комментариях), отключив «Включить продвижение распределенных транзакций для RPC» (т.е. установив его на False):

введите описание изображения здесь

По просьбе @WonderWorker вы можете сделать это с помощью SQL-скрипта:

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'
Стив Бауман
источник
1
Это сработало для меня. Что странно, это было хорошо несколько недель, а потом внезапно началось. Возможно, потому что служба DTC удаленного сервера может быть отключена. В любом случае, благодарю Вас.
Boyd P
1
Блестяще. Вы знаете, как это написать? На всех моих серверах для всех связанных серверных объектов было установлено значение «Разрешить продвижение распределенных транзакций», и я еще не смог выяснить, кто это сделал. Это так утомительно.
WonderWorker,
1
@WonderWorker Я только что добавил пример SQL-скрипта, который вы можете использовать, попробуйте!
Стив Бауман,
6

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

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

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

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

Дэвид Вулфингер
источник
1

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

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

ДЖЕРРИ
источник
1

Для меня это связано с настройкой брандмауэра. Перейдите в настройки брандмауэра, разрешите службу DTC, и все заработало.введите описание изображения здесь

Хоанг Тран
источник
0

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

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

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

Я не смог выполнить PING-запрос на сервер DEV, указав только имя компьютера: PING DEVSQL

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

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

Марк
источник
0

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

Trepach
источник
0

Я получал ту же ошибку, и мне удалось ее решить, правильно настроив MSDTC на исходном сервере, чтобы разрешить исходящий трафик и разрешить DTC через брандмауэр Windows.

Разрешить координатора распределенных транзакций, указать домен, частные и общедоступные параметры

Каавач Саид
источник