ไม่สามารถเริ่มธุรกรรมแบบกระจาย


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 Severs สองตัวคุยกันได้อย่างไร

คำถามที่เกี่ยวข้อง


สิ่งที่ฉันได้ทำคือการที่ไม่เกี่ยวข้อง แต่ผมจะโพสต์มันอยู่แล้ว

  1. ตรวจสอบให้แน่ใจว่าDistributed Transaction Coordinatorบริการทำงานบนเครื่องทั้งสองเครื่อง:

    ป้อนคำอธิบายภาพที่นี่

    ป้อนคำอธิบายภาพที่นี่

  2. ปิดใช้งานการรักษาความปลอดภัย MSDTC ทั้งหมดบนเครื่องทั้งสอง:

    ป้อนคำอธิบายภาพที่นี่

    ป้อนคำอธิบายภาพที่นี่

  3. เปิดตัวเลือกแบบสุ่มบนเซิร์ฟเวอร์ที่เชื่อมโยง:

ป้อนคำอธิบายภาพที่นี่

  1. สาปแช่งและสาบาน

  2. ทุบสิ่งต่างๆ

  3. ตรวจสอบว่า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
    

    บนเซิร์ฟเวอร์ทั้งสองเครื่อง


32
ดีใจที่ได้เห็นคุณไม่ได้ข้ามขั้นตอน "สาปแช่งและสาบาน" ที่สำคัญ!
jwl

11
@joelarson เฮ้บางครั้งผู้คนก็สนใจที่คุณทำตามทุกขั้นตอน ฉันไม่อยากให้ใครบอกว่าฉันไม่ได้ลองทำอะไร
Ian Boyd

5
ฉันรักโพสต์นี้ มันบ่งบอกทุกประสบการณ์ที่ฉันเคยมีกับ MSDTC
อ. เมอร์เรย์

5
ในกรณีของฉันหลังจากที่ฉันตั้งค่า "เปิดใช้งานการส่งเสริมธุรกรรมแบบกระจายสำหรับ RPC" เป็น False บนเซิร์ฟเวอร์ที่เชื่อมโยงก็ใช้งานได้ ลองดูสิ
Sarsaparilla

3
@HaiPhan การปิดการใช้ธุรกรรมแบบกระจายจะทำลายความสมบูรณ์ข้ามชาติ: หากคุณย้อนกลับการเปลี่ยนแปลงของคุณบนเซิร์ฟเวอร์ภายในหมายความว่าการเปลี่ยนแปลงจะยังคงมีอยู่บนเซิร์ฟเวอร์ระยะไกล อันตรายมาก.
เอียนบอยด์

คำตอบ:


31

พบว่า MSDTC บนเซิร์ฟเวอร์ระยะไกลเป็นโคลนของเซิร์ฟเวอร์ภายในเครื่อง

จาก Windows Application Events Log:

ประเภทเหตุการณ์: ข้อผิดพลาด
แหล่งที่มาของเหตุการณ์: MSDTC
ประเภทเหตุการณ์: CM
รหัสเหตุการณ์: 4101
วันที่: 9/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- restart SQL Server service 4- รีสตาร์ทบริการ SQL Agent เพื่อให้แน่ใจว่า 5- รีสตาร์ทบริการ "Distributed Transaction Coordinator" ... ฉันทำสิ่งนี้กับทั้งสองเครื่องแล้ว (เซิร์ฟเวอร์หลักและเซิร์ฟเวอร์ที่เชื่อมโยง) a ~ และไม่มีอะไรยังคงเป็นข้อผิดพลาดเหมือนเดิม
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
ยอดเยี่ยม. คุณรู้วิธีเขียนสคริปต์นี้หรือไม่? บนเซิร์ฟเวอร์ทั้งหมดของฉันอ็อบเจ็กต์เซิร์ฟเวอร์ที่เชื่อมโยงทั้งหมดมีการตั้งค่า Enable Promotion of Distributed Transactions ที่ตั้งค่าเป็น true และฉันยังไม่สามารถทราบได้ว่าใครเป็นผู้ทำ มันน่าเบื่อมากที่ต้องผ่านไป
WonderWorker

1
@WonderWorker ฉันเพิ่งเพิ่มสคริปต์ SQL ตัวอย่างที่คุณสามารถใช้ได้ลองดูสิ!
Steve Bauman

6

ตกลงดังนั้นบริการจึงเริ่มต้นมีเส้นทางอีเธอร์เน็ตระหว่างพวกเขาการแก้ปัญหาชื่อเซิร์ฟเวอร์ที่เชื่อมโยงทำงานและคุณปิดใช้งานการตรวจสอบธุรกรรม

ลำไส้ของฉันบอกว่ามีปัญหาไฟร์วอลล์ แต่มีบางสิ่งที่ต้องคำนึงถึง ...

  1. เครื่องอยู่ในโดเมนเดียวกันหรือไม่ (ใช่ไม่ควรสำคัญกับการรับรองความถูกต้องที่ปิดใช้งาน)
  2. ไฟร์วอลล์ทำงานบนเครื่องหรือไม่ DTC อาจสร้างความเจ็บปวดให้กับไฟร์วอลล์เนื่องจากใช้พอร์ตหลายพอร์ตโปรดดูที่http://support.microsoft.com/kb/306843 ในขณะนี้ฉันจะปิดการใช้งานไฟร์วอลล์เพื่อระบุปัญหา
  3. DTC ping พูดว่าอะไร? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. บัญชีใดที่บริการ SQL ทำงานเป็น?


1

หากเซิร์ฟเวอร์ปลายทางของคุณอยู่บนคลาวด์หรือศูนย์ข้อมูลอื่นจำเป็นต้องเพิ่มโฮสต์รายการของบริการ MSDTC (เซิร์ฟเวอร์ปลายทาง)ในเซิร์ฟเวอร์ต้นทางของคุณ

ลองใช้วิธีนี้หากปัญหาไม่ได้รับการแก้ไขหลังจากเปิดใช้งานการตั้งค่า MSDTC


1

สำหรับฉันมันเกี่ยวข้องกับการตั้งค่าไฟร์วอลล์ ไปที่การตั้งค่าไฟร์วอลล์ของคุณอนุญาตให้ใช้บริการ DTC และใช้งานได้ป้อนคำอธิบายภาพที่นี่


0

การผจญภัยครั้งสุดท้ายของฉันกับ MSDTC และข้อผิดพลาดนี้ในวันนี้กลายเป็นปัญหา DNS คุณมาถูกทางแล้วที่ถามว่าเครื่องอยู่ในโดเมนเดียวกันหรือไม่ EBarr รายการที่ยอดเยี่ยมสำหรับปัญหานี้!

สถานการณ์ของฉัน: ฉันต้องการเซิร์ฟเวอร์ในโดเมนลูกเพื่อให้สามารถเรียกใช้ธุรกรรมแบบกระจายกับเซิร์ฟเวอร์ในโดเมนหลักผ่านไฟร์วอลล์ ฉันใช้เซิร์ฟเวอร์ที่เชื่อมโยงมาหลายปีแล้วดังนั้นฉันจึงมีการตั้งค่าปกติทั้งหมดใน SQL สำหรับเซิร์ฟเวอร์ที่เชื่อมโยงและใน MSDTC ที่ Ian บันทึกไว้ข้างต้นอย่างดี ฉันตั้งค่า MSDTC ด้วยช่วงของพอร์ต TCP (5,000-5200) เพื่อใช้บนเซิร์ฟเวอร์ทั้งสองและจัดให้มีรูไฟร์วอลล์ระหว่างกล่องสำหรับพอร์ต 1433 และ 5000-5200 ที่ควรจะได้ผล เซิร์ฟเวอร์ที่เชื่อมโยงทดสอบตกลงและฉันสามารถสอบถามเซิร์ฟเวอร์ SQL ระยะไกลผ่านเซิร์ฟเวอร์ที่เชื่อมโยงได้อย่างดี แต่ฉันไม่สามารถอนุญาตให้ทำธุรกรรมแบบกระจายได้ ฉันสามารถเห็นการเชื่อมต่อบนเซิร์ฟเวอร์ QA จากเซิร์ฟเวอร์ DEV แต่มีบางอย่างไม่ทำให้การเดินทางกลับ

ฉันสามารถปิงเซิร์ฟเวอร์ 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

อนุญาตผู้ประสานงานธุรกรรมแบบกระจายติ๊กโดเมนตัวเลือกส่วนตัวและสาธารณะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.