SQL Server Msg 7391 — Dağıtık İşlem Neden Başlamıyor?
7391 hatasının nedeni MS DTC, remote proc transaction promotion ayarı, güvenlik duvarı ve Kerberos delegation; dağıtık işlemi tamamen önlemenin yolları.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Msg 7391, Level 16, State 1, Line 1
The operation could not be performed because OLE DB provider "SQLNCLI11"
for linked server "ERP" was unable to begin a distributed transaction.Aynı altyapı arızasından kaynaklanan komşu sağlayıcı hataları:
Msg 7399: The OLE DB provider "MSOLEDBSQL" for linked server "ERP" reported an error.
Msg 7302: Cannot create an instance of OLE DB provider "SQLNCLI11" for linked server "ERP".
Msg 7411: Server 'ERP' is not configured for RPC.Bu hata, bir bağlı sunucuya (Linked Server) yapılan sorgunun iki aşamalı tamamlama (Two-Phase Commit / 2PC) gerektiren bir dağıtık işleme (Distributed Transaction) yükseltilmesi gerektiğinde, ancak Windows MS DTC (Distributed Transaction Coordinator) servisinin veya ağ katmanının bu koordinasyonu kuramaması durumunda ortaya çıkar.
▸Neden Bazen Çalışıyor, Bazen Patlıyor?
Mühendislerin en çok şaşırdığı durum şudur: Aynı SELECT * FROM ERP.db.dbo.tablo sorgusu normalde sorunsuz çalışırken, aniden Msg 7391 vermeye başlar.
Neden? Çünkü dağıtık işlem gereksinimi yalnızca sorgu açık bir yerel işlemin (Transaction) içindeyken tetiklenir:
- •Açık bir
BEGIN TRANSACTIONbloğu içinde uzak sunucuya erişilmesi. - •Bir Tetikleyici (Trigger) içinden uzak sunucuya sorgu gönderilmesi (Tetikleyiciler doğası gereği bir işlemin içindedir!).
- •
SET XACT_ABORT ONparametresi açıkken uzak prosedür çağrılması. - •Aynı transaction içinde iki farklı bağlı sunucuya dokunulması.
İşlem dışındaki bağımsız tekil bir SELECT sorgusu dağıtık işlem gerektirmez; ancak araya tek bir BEGIN TRAN girdiğinde SQL Server otomatik olarak MS DTC'yi devreye sokmaya çalışır ve hata patlar.
▸Teşhis Sırası ve Altyapı Kontrolleri
1. Bağlı Sunucu Tanımını ve RPC Ayarlarını İnceleyin
SELECT name, product, provider, data_source, is_rpc_out_enabled, is_remote_login_enabled
FROM sys.servers
WHERE is_linked = 1;SQLNCLI11 (SQL Server Native Client) artık Microsoft tarafından kullanımdan kaldırılmıştır (deprecated). Modern ortamlarda MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server) sağlayıcısı tercih edilmelidir.2. MS DTC Hizmetini ve Ağ Erişimini Denetleyin
Dağıtık işlem gerçekten gerekliyse şu zincirin her iki sunucuda da kusursuz çalışması şarttır:
- •Windows Hizmetlerinde Distributed Transaction Coordinator servisi çalışıyor (
Running) durumda olmalıdır. - •
dcomcnfg.exe(Bileşen Hizmetleri) altında: Network DTC Access, Allow Inbound, Allow Outbound kutucukları işaretli olmalıdır. - •RPC Dinamik Port Aralığı: Güvenlik duvarında sadece 135 portunu açmak yetmez; Windows RPC dinamik port aralığının (varsayılan 49152–65535) iki sunucu arasında çift yönlü açık olması gerekir.
- •Kerberos Çift Atlama (Double Hop) Tuzağı: İstemci → SQL Server A → SQL Server B zincirinde Windows Authentication kullanılıyorsa, SQL Server A'nın hizmet hesabının Active Directory üzerinde Kerberos Constrained Delegation yetkisine sahip olması şarttır; aksi halde NTLM ikinci sunucuya kimlik taşıyamaz ve DTC bağlantısı çöker.
▸Çözüm Yolları
1. En Hızlı Çözüm: Dağıtık İşlem Yükseltmesini Kapatın
Eğer uzak sunucuya yalnızca okuma veya bağımsız prosedür çağrısı yapıyorsanız, transaction promotion özelliğini kapatarak hatayı derhal susturabilirsiniz:
EXEC sp_serveroption 'ERP', 'remote proc transaction promotion', 'FALSE';FALSE yapıldığında, yerel sunucuda ROLLBACK TRANSACTION çalıştırılsa bile uzak sunucuda yürütülen DML geri alınmaz! Yerel ve uzak taraf arasındaki atomiklik garantisi kalkar. Finansal yazma işlemlerinde bunu bilinçsizce kapatmayın.2. Dağıtık Sorguyu OPENQUERY ile Yalıtın
OPENQUERY ifadesi sorguyu uzak sunucuda bağımsız olarak yürütür (pass-through) ve dağıtık işlem koordinatörüne ihtiyaç duymaz:
INSERT INTO dbo.YerelTablo
SELECT * FROM OPENQUERY(ERP, 'SELECT Id, Tutar FROM dbo.UzakFatura WHERE Durum = 1');3. Uzun Vadeli Mimari Çözüm: Bağlı Sunucuları Terk Edin
Bağlı sunucular (Linked Servers) iki bağımsız veritabanını sıkı sıkıya birbirine bağlayarak ağ gecikmelerini ve kilitleri birbirine bulaştırır. İki sunucu arasında veri aktarımı gerekiyorsa, bunu veritabanı motoru düzeyinde DTC ile çözmek yerine Asenkron Mesajlaşma (Kafka/RabbitMQ) veya ETL Boru Hatları ile çözmek kurumsal dayanıklılık standardıdır.
▸İlgili Hata Rehberleri & Hub Bağlantıları
- •SQL Server Transport-Level Error 233 (H-33) — Ağ ve soket kopmaları
- •SQL Server Foreign Key Constraint 547 (H-23) — Veri bütünlüğü kısıtları
- •SQL Server Hub — Bağlı sunucu ve dağıtık mimari standartları
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
18456 hatasında State numarası gerçek nedeni söyler. State 5, 8, 11, 18, 38 ve 40 için ayrı çözümler, ERRORLOG okuma komutları.
SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme
SQL Server 1205 hatasında deadlock grafiğini system_health oturumundan çıkarma, kurban seçimini anlama ve kalıcı önleme yöntemleri.
SQL Server Pool Timeout: Bağlantı Havuzu Tükenmesi Çözümü
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.