Không thể bắt đầu giao dịch phân tán


95

Tôi đang cố gắng chạy SQL với một máy chủ được liên kết, nhưng tôi gặp các lỗi bên dưới:

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.

Có hai lỗi do nhà cung cấp trả về:

Lỗi # 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

Lỗi # 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

Làm cách nào để Microsoft ưu tiên chức năng hơn bảo mật?

Hoặc, ít nhất, làm thế nào tôi có thể có được hai Máy chủ SQL nói chuyện với nhau?

Câu hỏi liên quan


Những gì tôi đã làm không liên quan, nhưng tôi sẽ đăng nó.

  1. Đảm bảo Distributed Transaction Coordinatordịch vụ đang chạy trên cả hai máy:

    nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

  2. Tắt tất cả bảo mật MSDTC trên cả hai máy:

    nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

  3. Bật các tùy chọn ngẫu nhiên trên máy chủ được liên kết:

nhập mô tả hình ảnh ở đây

  1. Bị nguyền rủa và thề thốt.

  2. Đập nát đồ đạc.

  3. Kiểm tra rằng a SELECTcó thể sử dụng máy chủ được liên kết :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. Đã kiểm tra xem máy chủ khách có thể pinglà máy chủ từ xa :

         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. Kiểm tra để đảm bảo rằng máy chủ từ xa có thể liên lạc lại, theo tên, với máy chủ khởi tạo:

         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. Đã kiểm tra @@SERVERNAMEkhớp với tên máy chủ trên cả hai máy chủ :

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

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
    
  7. La hét

  8. Được cấp SET XACT_ABORT ONtrước khi đưa ra truy vấn của tôi :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. Đã cấp Everyone Full Controlcho :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    trên cả hai máy chủ.


30
thật vui khi thấy bạn đã không bỏ qua bước quan trọng "bị nguyền rủa và thề thốt"!
jwl

11
@joelarson Này, đôi khi mọi người rất đặc biệt mà bạn theo dõi từng bước. tôi không muốn bất cứ ai nói rằng tôi đã không thử một cái gì đó.
Ian Boyd

5
Tôi thích bài viết này. Nó tiêu biểu cho mọi trải nghiệm tôi từng có với MSDTC.
A. Murray

5
Trong trường hợp của tôi, sau khi tôi đặt "Bật Quảng cáo Giao dịch Phân tán cho RPC" thành Sai trên máy chủ được liên kết, nó sẽ hoạt động. Có thể thử mà
Sarsaparilla

3
@HaiPhan Việc tắt việc sử dụng các giao dịch phân tán sẽ phá vỡ tính toàn vẹn xuyên quốc gia: nếu bạn khôi phục các thay đổi của mình trên máy chủ cục bộ có nghĩa là các thay đổi sẽ vẫn còn nguyên trên máy chủ từ xa. Rất nguy hiểm.
Ian Boyd

Câu trả lời:


31

Đã tìm thấy, MSDTC trên máy chủ từ xa là bản sao của máy chủ cục bộ.

Từ Nhật ký Sự kiện Ứng dụng Windows:

Loại sự kiện: Lỗi
Sự kiện Nguồn: MSDTC
Loại sự kiện: CM
ID sự kiện: 4101
Ngày: 19/9/2011
Thời gian: 1:32:59 PM
Người dùng: N / A
Máy tính: ASITESTSERVER
Mô tả:

MS DTC cục bộ đã phát hiện rằng MS DTC trên ASICMSTEST có cùng danh tính duy nhất với MS DTC cục bộ. Điều này có nghĩa là hai MS DTC sẽ không thể giao tiếp với nhau. Sự cố này thường xảy ra nếu một trong các hệ thống được nhân bản bằng các công cụ nhân bản không được hỗ trợ. MS DTC yêu cầu các hệ thống phải được nhân bản bằng các công cụ nhân bản được hỗ trợ như SYSPREP. Chạy 'msdtc -uninstall' và sau đó 'msdtc -install' từ dấu nhắc lệnh sẽ khắc phục sự cố. Lưu ý: Chạy 'msdtc -uninstall' sẽ dẫn đến hệ thống mất tất cả thông tin cấu hình MS DTC.

Để biết thêm thông tin, hãy xem Trung tâm trợ giúp và hỗ trợ tại http://go.microsoft.com/fwlink/events.asp .

Đang chạy

msdtc -uninstall
msdtc -install

và sau đó dừng và khởi động lại dịch vụ SQL Server đã sửa nó.


2
Hãy xem tôi đã hiểu đúng chưa: 1- msdtc -uninstall 2- msdtc -install 3- khởi động lại dịch vụ SQL Server 4- khởi động lại dịch vụ SQL Agent, chỉ để chắc chắn 5- thậm chí khởi động lại dịch vụ "Điều phối viên giao dịch phân tán" ... Tôi đã làm tất cả điều này trên cả hai máy (máy chủ chính và máy chủ liên kết) a ~ và không có gì, vẫn bị lỗi như nhau!
Hamid Sadeghian

9

Tôi đã có thể giải quyết vấn đề này (như những người khác đã đề cập trong nhận xét) bằng cách tắt "Bật Quảng cáo Giao dịch Phân tán cho RPC" (tức là đặt nó thành False):

nhập mô tả hình ảnh ở đây


1
Điều này đã làm việc cho tôi. Điều kỳ lạ là nó vẫn ổn trong nhiều tuần, và sau đó đột nhiên bắt đầu. Có thể do dịch vụ DTC của máy chủ từ xa có thể bị tắt. Dẫu sao cũng cám ơn bạn.
Boyd P

6

OK, vậy là các dịch vụ được khởi động, có một đường dẫn ethernet giữa chúng, tính năng phân giải tên hoạt động, các máy chủ được liên kết hoạt động và bạn đã tắt xác thực giao dịch.

Ruột của tôi nói vấn đề tường lửa, nhưng một số điều tôi nghĩ đến ...

  1. Các máy có trong cùng một miền không? (vâng, không thành vấn đề với xác thực bị vô hiệu hóa)
  2. Tường lửa có chạy trên máy không? DTC có thể gây khó khăn cho tường lửa vì nó sử dụng nhiều cổng, hãy xem http://support.microsoft.com/kb/306843 Hiện tại, tôi sẽ vô hiệu hóa tường lửa để xác định sự cố
  3. DTC ping nói gì? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Dịch vụ SQL đang chạy với tài khoản nào?

2

Nếu các máy chủ được phân nhóm và có một DTC được phân cụm, bạn phải vô hiệu hóa bảo mật trên DTC nhóm không phải DTC cục bộ.


1

Nếu máy chủ đích của bạn nằm trên một đám mây hoặc trung tâm dữ liệu khác thì bạn cần thêm mục nhập máy chủ của dịch vụ MSDTC (Máy chủ đích) trong máy chủ nguồn của bạn.

Hãy thử cái này nếu sự cố không được giải quyết, Sau khi bật cài đặt MSDTC.


1

Đối với tôi, nó liên quan đến thiết lập Tường lửa. Chuyển đến cài đặt tường lửa của bạn, cho phép Dịch vụ DTC và nó đã hoạt động.nhập mô tả hình ảnh ở đây


0

Cuộc phiêu lưu cuối cùng của tôi với MSDTC và lỗi này hôm nay hóa ra là do sự cố DNS. Bạn đang đi đúng hướng khi hỏi các máy có trên cùng một miền không, EBarr. Nhân tiện, danh sách khủng khiếp cho vấn đề này!

Tình huống của tôi: Tôi cần một máy chủ trong miền con để có thể chạy các giao dịch phân tán với máy chủ trong miền mẹ thông qua tường lửa. Tôi đã sử dụng các máy chủ được liên kết khá nhiều trong nhiều năm, vì vậy tôi đã có tất cả các cài đặt thông thường trong SQL cho một máy chủ được liên kết và trong MSDTC mà tôi đã ghi lại ở trên. Tôi đã thiết lập MSDTC với một loạt các cổng TCP (5000-5200) để sử dụng trên cả hai máy chủ và bố trí lỗ tường lửa giữa các hộp cho các cổng 1433 và 5000-5200. Điều đó đáng lẽ phải làm việc. Máy chủ được liên kết đã kiểm tra OK và tôi có thể truy vấn máy chủ SQL từ xa thông qua máy chủ được liên kết một cách độc đáo, nhưng tôi không thể làm cho nó cho phép giao dịch phân tán. Tôi thậm chí có thể thấy kết nối trên máy chủ QA từ máy chủ DEV, nhưng có điều gì đó không làm cho chuyến đi trở lại.

Tôi có thể PING máy chủ DEV từ QA bằng FQDN như: PING DEVSQL.dev.domain.com

Tôi không thể PING máy chủ DEV chỉ với tên máy: PING DEVSQL

Máy chủ DEVSQL đáng lẽ phải là thành viên của cả hai miền, nhưng tên không phân giải trong DNS của miền mẹ ... điều gì đó đã xảy ra với tài khoản máy cho DEVSQL trong miền mẹ. Sau khi chúng tôi thêm DEVSQL vào DNS cho miền mẹ và "PING DEVSQL" hoạt động từ máy chủ QA từ xa, vấn đề này đã được chúng tôi giải quyết.

Tôi hi vọng cái này giúp được!


0

Ngoài cài đặt bảo mật, tôi phải mở một số cổng trên cả hai máy chủ để giao dịch chạy. Tôi đã phải mở cổng 59640 nhưng theo gợi ý sau đây, cổng 135 phải được mở. http://support.microsoft.com/kb/839279


0

Tôi gặp phải lỗi tương tự và tôi đã tìm cách giải quyết nó bằng cách định cấu hình MSDTC đúng cách trên máy chủ nguồn để cho phép gửi đi và cho phép DTC thông qua tường lửa cửa sổ.

Cho phép Điều phối viên giao dịch phân tán, đánh dấu miền, các tùy chọn riêng tư và công khai

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.