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


95

Я намагаюся запустити 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 Severs розмовляти між собою?

Пов’язані запитання


Те , що я б зробив це не має значення, але я викладу його в будь-якому випадку.

  1. Переконайтесь, що Distributed Transaction Coordinatorсервіс працює на обох пристроях:

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

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

  2. Вимкнути всю безпеку MSDTC на обох машинах:

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

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

  3. Увімкніть випадкові параметри на пов'язаному сервері:

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

  1. Прокляв і лаявся.

  2. Розбив речі.

  3. Перевірив, що a SELECTможе використовувати зв'язаний сервер :

        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

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


30
приємно бачити, що ви не пропустили вирішального кроку "проклятий і клятий"!
jwl

11
@joelarson Гей, іноді люди дуже особливі, що ви дотримуєтесь кожного кроку. я не хотів, щоб хтось говорив, що я щось не пробував.
Ян Бойд

5
Я люблю цю посаду. Він описує кожен досвід, який я коли-небудь мав з MSDTC.
А. Мюррей

5
У моєму випадку, після того, як я встановив "Увімкнути просування розподілених транзакцій для RPC" на помилковому сервері, воно працює. Можливо, спробуйте це
Сарсапарілья

3
@HaiPhan Відключення використання розподілених транзакцій порушує транснаціональну цілісність: якщо ви відкажете ваші зміни на локальному сервері, це означає, що зміни залишаться на віддаленому сервері. Дуже небезпечно.
Ян Бойд

Відповіді:


31

Знайшовши це, MSDTC на віддаленому сервері був клоном локального сервера.

З журналу подій програми Windows:

Тип події: Помилка
Джерело події: MSDTC
Категорія події: CM
ID події: 4101
Дата: 19.09.2011
Час: 13:32:59 PM
Користувач: Немає даних
Комп'ютер: 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 -встановити 3- перезапустити сервіс SQL Server 4- перезапустити службу SQL Agent, просто щоб бути впевненим 5- навіть перезапустити послугу "Координатор розподілених транзакцій" ... Я все це робив на обох машинах (основний сервер і пов'язаний сервер) ~ і нічого, все одно однакова помилка!
Хамід Садегіан

9

Мені вдалося вирішити цю проблему (як це було зазначено в коментарях), відключивши "Увімкнути просування розподілених транзакцій для RPC" (тобто встановивши її на False):

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


1
Це працювало для мене. Що дивно - це було добре тижнями, а потім раптом почалося. Можливо тому, що послуга DTC віддаленого сервера може бути відключена. Все одно, дякую.
Бойд П

6

Гаразд, так що сервіси запускаються, між ними є шлях до Ethernet, працює розв’язання імен, працюють пов'язані сервери, і ви відключили аутентифікацію транзакцій.

Моя кишка говорить про проблему з брандмауером, але кілька речей приходить на думку ...

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

2

Якщо сервери кластеризовані і є кластеризований DTC, ви повинні відключити захист кластеризованого DTC, а не локального DTC.


1

Якщо ваш сервер призначення в іншому хмарі або центрі обробки даних, вам потрібно додати хост- сервіс MSDTC (Destination Server) на вихідному сервері.

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


1

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


0

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

Моя ситуація: мені потрібен був сервер у дочірньому домені, щоб можна було виконувати розподілені транзакції проти сервера в батьківському домені через брандмауер. Протягом багатьох років я використовував пов'язані сервери небагато, тому у мене були всі звичні параметри в SQL для зв'язаного сервера та в MSDTC, що Іан так добре задокументував вище. Я встановив MSDTC з діапазоном портів TCP (5000-5200) для використання на обох серверах, і влаштував отвір між брандмауером між ящиками для портів 1433 та 5000-5200. Це мало би спрацювати. Зв'язаний сервер протестував ОК, і я міг чудово запитати віддалений сервер через пов'язаний сервер, але я не міг отримати його, щоб дозволити розподілену транзакцію. Я навіть міг бачити з'єднання на сервері QA з сервером DEV, але щось не змусило подорожувати назад.

Я міг би PING-сервер DEV від QA за допомогою FQDN, наприклад: PING DEVSQL.dev.domain.com

Я не міг ПІНГВАТИ сервер DEV із лише ім'ям машини: PING DEVSQL

Сервер DEVSQL повинен був бути членом обох доменів, але ім'я не вирішувалося в DNS батьківського домену ... щось сталося з машинним обліковим записом для DEVSQL у батьківському домені. Після того, як ми додали DEVSQL до DNS для батьківського домену та "PING DEVSQL" працював із віддаленого сервера QA, ця проблема була вирішена для нас.

Я сподіваюся, що це допомагає!


0

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


0

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

Дозволити розподіленому координатору транзакцій, позначте домен, приватні та загальнодоступні параметри

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.