Her Zaman Açık bir kullanılabilirlik grubu için dağıtık işlemleri yapılandırın

Şunlar için geçerlidir: SQL Server

SQL Server 2017 (14.x) ve sonraki sürümler, erişilebilirlik grubundaki veritabanları dahil olmak üzere tüm dağıtık işlemleri destekler. Bu makale, dağıtık işlemler için erişilebilirlik grubunun nasıl yapılandırılacağını açıklar

Dağıtılmış işlemleri garanti altına almak için, erişilebilirlik grubu veritabanlarını dağıtılmış işlem kaynak yöneticileri olarak kaydedecek şekilde yapılandırılmalıdır.

Note

SQL Server 2016 (13.x) Service Pack 2 ve sonraki sürümler, erişilebilirlik gruplarında dağıtık işlemler için tam destek sağlar. SQL Server 2016 (13.x) Service Pack 1 ve daha önceki sürümlerde, kullanılabilirlik grubundaki veritabanı içeren veritabanları arası dağıtık işlemler (yani, aynı SQL Server örneğindeki veritabanları kullanılarak işlemler) desteklenmemektedir. SQL Server 2017 (14.x) bu sınırlamaya sahip değil.

SQL Server 2016 (13.x) sürümünde, yapılandırma adımları SQL Server 2017 (14.x) ile aynıdır.

Dağıtık bir işlemde, istemci uygulamaları Microsoft Dağıtılmış İşlem Düzenleyicisi (MSDTC veya DTC) ile birlikte çalışarak birden fazla veri kaynağı arasında işlemsel tutarlılığı garanti eder. DTC, desteklenen Windows Server tabanlı işletim sistemlerinde sunulan bir hizmettir. Dağıtık bir işlem için DTC, işlem koordinatörüdür. Genellikle, bir SQL Server örneği kaynak yöneticisidir. Bir veritabanı erişilebilirlik grubundaysa, her veritabanının kendi kaynak yöneticisi olması gerekir.

SQL Server, erişilebilirlik grubundaki veritabanları için dağıtık işlemleri engellemez - erişilebilirlik grubu dağıtık işlemler için yapılandırılmamış olsa bile. Ancak, bir erişilebilirlik grubu dağıtık işlemler için yapılandırılmadığında, bazı durumlarda failover başarılı olmayabilir. Özellikle, yeni birincil replika SQL Server örneği DTC'den işlem sonucunu alamayabilir. SQL Server örneğinin, devre sonrası DTC'den şüpheli işlemlerin sonucunu almasını sağlamak için, dağıtık işlemler için kullanılabilirlik grubunu yapılandırın.

DTC, veritabanı aynı zamanda bir Failover Kümesi üyesi olmadıkça erişilebilirlik grubu işleme dahil değildir. Bir kullanılabilirlik grubu içinde, replikalar arasındaki tutarlılık kullanılabilirlik grubu mantığı tarafından korunur: Birincil replika, ikincil replika günlük kayıtlarını kalıcı ve dayanıklı depolamaya yazdığını onaylayana kadar commit işlemini tamamlamaz ve çağırana commit işleminin tamamlandığını bildirmez. Ancak o zaman birincil işlemin tamamlandığını ilan eder. Asenkron modda, ikincilden onay gelmesini beklemeyiz ve açıkça az miktarda veri kaybı olasılığı vardır.

Prerequisites

Bir erişilebilirlik grubunu dağıtılmış işlemleri destekleyecek şekilde yapılandırmadan önce aşağıdaki önkoşulları karşılamanız gerekir:

  • Dağıtık işleme katılan tüm SQL Server örnekleri SQL Server 2016 (13.x) veya daha sonraki sürümlerde olmalıdır.

  • Kullanılabilirlik grupları Windows Server 2012 R2 veya daha sonraki sürümlerde çalışmalı olmalıdır. Windows Server 2012 R2 için güncelleştirmeyi KB3090973 yüklemeniz gerekir.

Dağıtık işlemler için bir erişilebilirlik grubu oluşturun

Dağıtık işlemleri destekleyecek bir erişilebilirlik grubu yapılandırın. Erişilebilirlik grubunu, her veritabanının bir kaynak yöneticisi olarak kayıt yapmasına izin verecek şekilde ayarlayın. Bu makale, her veritabanının DTC'de bir kaynak yöneticisi olacağı şekilde kullanılabilirlik grubunun nasıl yapılandırılacağını açıklar.

SQL Server 2016 (13.x) veya daha sonraki sürümlerde dağıtık işlemler için bir erişilebilirlik grubu oluşturabilirsiniz. Dağıtık işlemler için bir erişilebilirlik grubu oluşturmak için, erişilebilirlik grubu tanımına dahil DTC_SUPPORT = PER_DB edin. Aşağıdaki betik, dağıtık işlemler için bir erişilebilirlik grubu oluşturur.

CREATE AVAILABILITY
GROUP MyAG
WITH (DTC_SUPPORT = PER_DB)
FOR DATABASE DB1,
    DB2 REPLICA
ON 'Server1' WITH (
   ENDPOINT_URL = 'TCP://SERVER1.corp.com:5022',
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   FAILOVER_MODE = AUTOMATIC
),
'Server2' WITH (
   ENDPOINT_URL = 'TCP://SERVER2.corp.com:5022',
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   FAILOVER_MODE = AUTOMATIC
);

Note

Yukarıdaki betik, bir kullanılabilirlik grubunun basit bir örneğidir ve belirli bir üretim ortamı için tasarlanmamıştır.

Dağıtık işlemler için bir erişilebilirlik grubunu değiştirin

SQL Server 2017 (14.x) veya daha sonraki sürümlerde dağıtık işlemler için erişilebilirlik grubunu değiştirebilirsiniz. Dağıtık işlemler için kullanılabilirlik grubunu değiştirmek için, DTC_SUPPORT = PER_DBALTER AVAILABILITY GROUP betikte ekleyin. Örnek betik, erişilebilirlik grubunu dağıtık işlemleri desteklemek için değiştirir.

ALTER AVAILABILITY GROUP MyaAG
SET (DTC_SUPPORT = PER_DB);

Note

SQL Server 2016 (13.x) Service Pack 2 ve sonraki sürümlerde, dağıtık işlemler için bir erişilebilirlik grubunu değiştirebilirsiniz. Service Pack 2'den önceki SQL Server 2016 (13.x) sürümleri için, kullanılabilirlik grubunu DTC_SUPPORT = PER_DB ayarla birlikte bırakıp yeniden oluşturmanız gerekir.

Dağıtık işlemleri devre dışı bırakmak için aşağıdaki Transact-SQL komutunu kullanın:

ALTER AVAILABILITY GROUP MyaAG
SET (DTC_SUPPORT = NONE);

Dağıtık işlemler - teknik kavramlar

Dağıtık bir işlem iki veya daha fazla veritabanını kapsar. İşlem yöneticisi olarak DTC, SQL Server örnekleri ile diğer veri kaynakları arasındaki işlemi koordine eder. SQL Server veritabanı motorunun her örneği bir kaynak yöneticisi olarak çalışabilir. Bir erişilebilirlik grubu ile DTC_SUPPORT = PER_DByapılandırıldığında, veritabanları kaynak yöneticisi olarak çalışabilir. Daha fazla bilgi için MSDTC dokümantasyonuna bakınız.

Veritabanı motorunun tek bir örneğinde iki veya daha fazla veritabanı bulunan bir işlem aslında dağıtık bir işlemdir. Örnek, dağıtılmış işlemi dahili olarak yönetir; kullanıcıya, yerel bir işlem olarak çalışır. SQL Server 2017 (14.x), veritabanları DTC_SUPPORT = PER_DB ile yapılandırılmış bir kullanılabilirlik grubunda olduğunda, veritabanları arası tüm işlemleri DTC’ye yükseltir; buna SQL Server’ın tek bir örneği içindeki işlemler de dahildir.

Uygulamada, dağıtık bir işlem yerel işlem gibi yönetilir. İşlemin sonunda uygulama, işlemin işlenmesini veya geri alınmasını ister. İşlem yöneticisi, dağıtık bir taahhüdü farklı şekilde yönetmelidir; böylece ağ arızasının bazı kaynak yöneticilerinin başarılı bir şekilde taahhüt etmesi, diğerlerinin ise işlemi geri alması riskini en aza indirebilir. Bu, işleme işlemini iki aşamalı işleme olarak bilinen iki aşamada (hazırlama aşaması ve işleme aşaması) yöneterek elde edilir.

  • Hazırlama aşaması

    İşlem yöneticisi bir işleme isteği aldığında, işlemde yer alan tüm kaynak yöneticilerine bir hazırlama komutu gönderir. Her kaynak yöneticisi işlemi dayanıklı kılmak için gereken her şeyi yapar ve işlem için log görüntülerini tutan tüm tamponlar diske atılır. Her kaynak yöneticisi hazırlık aşamasını tamamladığında, hazırlık aşamasının başarısı veya başarısızlığı işlem yöneticisine geri döner.

  • İşleme aşaması

    İşlem yöneticisi tüm kaynak yöneticilerinden başarılı hazırlıklar alırsa, her kaynak yöneticisine işleme komutları gönderir. Kaynak yöneticileri daha sonra işlemeyi tamamlayabilir. Tüm kaynak yöneticileri başarılı bir işleme raporlarsa, işlem yöneticisi uygulamaya bir başarı bildirimi gönderir. Herhangi bir kaynak yöneticisi hazırlanma hatası bildirdiyse, işlem yöneticisi her kaynak yöneticisine bir geri alma komutu gönderir ve uygulamaya işlemenin başarısız olduğunu gösterir.

Ayrıntılı adımlar

Aşağıdaki liste, uygulamanın dağıtık işlemleri tamamlamak için DTC ile nasıl çalıştığını açıklar.

  1. SQL Server örneği DTC işleminde kayıt olur. Bu, işlemde birden fazla kaynak yöneticisi olduğunda veya istemci bir işlemin DTC işlemine terfi edilmesini talep ettiğinde olabilir.
  2. İstemci, DTC işlemi kapsamında SQL Server örneğinde bazı işlemler gerçekleştirir.
  3. İstemci, DTC işlemi için commit veya abort komutu verir.
    • Müşteri iptal yaparsa, işlem hemen iptal edilir.
    • İstemci commit yaparsa, DTC işlemdeki tüm kaynak yöneticilerinden işlemi hazırlamalarını isteerek iki aşamalı commit protokolünü başlatır.
  4. DTC, tüm kaynak yöneticileri hazırlık aşamasını başarıyla onayladıktan sonra tüm kaynak yöneticilerine işlemi yapmaları için bilgi verir. Başarılı onay almayı engelleyen bir şey varsa, DTC işlemi iptal eder.

Dağıtık işlemler için kullanılabilirlik grubu yapılandırmanın etkileri

Dağıtık bir işlemde yer alan her varlığa kaynak yöneticisi denir. Kaynak yöneticilerine örnekler şunlardır:

  • Bir SQL Server örneği.
  • Dağıtık işlemler için yapılandırılmış bir erişilebilirlik grubundaki bir veritabanı.
  • DTC hizmeti - aynı zamanda bir işlem yöneticisi de olabilir.
  • Diğer veri kaynakları.

Dağıtık işlemlere katılmak için SQL Server'ın bir örneği DTC ile kayıt olur. Normalde SQL Server örneği yerel sunucudaki DTC'ye dahil olur. Her SQL Server örneği, benzersiz bir kaynak yöneticisi tanımlayıcısına (RMID) sahip bir kaynak yöneticisi oluşturur ve bunu DTC ile kaydeder. Varsayılan yapılandırmada, SQL Server'ın bir örneğindeki tüm veritabanları aynı RMID'i kullanır.

Bir veritabanı erişilebilirlik grubundayken, veritabanının okuma-yazma kopyası - veya birincil replikası - farklı bir SQL Server örneğine taşınabilir. Bu hareket sırasında dağıtık işlemleri desteklemek için her veritabanı ayrı bir kaynak yöneticisi olarak hareket etmeli ve benzersiz bir RMID'e sahip olmalıdır. Bir erişilebilirlik grubu DTC_SUPPORT = PER_DBolduğunda, SQL Server her veritabanı için bir kaynak yöneticisi oluşturur ve benzersiz bir RMID kullanarak DTC'ye kayıt yapar. Bu yapılandırmada veritabanı, DTC işlemleri için bir kaynak yöneticisidir.

Important

DTC, dağıtık işlem başına 32 kayıt sınırına sahiptir. Bir erişilebilirlik grubundaki her veritabanı ayrı ayrı DTC ile kayıt olduğundan, işleminiz 32'den fazla veritabanı içeriyorsa, SQL Server 33. veritabanını listeye almaya çalıştığında aşağıdaki hata alabilirsiniz:

Enlist operation failed: 0x8004d101(XACT_E_TOOMANY_ENLISTMENTS). SQL Server couldn't register with Microsoft Distributed Transaction Coordinator (MSDTC) as a resource manager for this transaction. The transaction might have been stopped by the client or the resource manager.

SQL Server'daki dağıtılmış işlemler hakkında daha fazla ayrıntı için bkz . Dağıtılmış işlemler

Çözülmemiş işlemleri yönetin

RMID değişikliği sırasında var olan aktif işlemlerin sonucu bir failover sonrası geri alınamaz. Bunun nedeni, kayıt için kullanılan RMID SQL Server ile kurtarma için kullanılan RMID SQL Server'ın farklı olmasıdır. RMID değişikliği aşağıdaki durumlarda gerçekleşebilir:

  • Bir kullanılabilirlik grubu için DTC_SUPPORT değiştirin.
  • Bir veritabanını erişilebilirlik grubundan ekleyin veya çıkarın.
  • Kullanılabilirlik grubunu kaldırın.

Önceki durumlarda, birincil replika yeni bir SQL Server örneğine geçerse, örnek işlem sonucunu belirlemek için DTC ile iletişime geçmeye çalışır. DTC sonucu döndüremez çünkü veritabanının kurtarma sırasında şüpheli işlemlerin sonucunu almak için kullandığı RMID daha önce kaydedilmemişti. Bu nedenle veritabanı ŞÜPHELİ durumuna girer.

Yeni SQL Server hata günlüğünde aşağıdaki örnek gibi bir giriş bulunur:

Microsoft Distributed Transaction Coordinator (MSDTC)
failed to reenlist citing that the database RMID does
not match the RMID [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
associated with the transaction.  Please manually resolve
the transaction.

SQL Server detected a DTC/KTM in-doubt transaction with UOW
{yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy}.Please resolve it
following the guideline for Troubleshooting DTC Transactions.

Önceki örnek, DTC'nin yük devretme sonrasında oluşturulan işlemde veritabanını yeni birincil replikadan yeniden kaydedemediğini göstermektedir. SQL Server örneği, dağıtık işlemin sonucunu belirleyemediği için veritabanını şüpheli olarak işaretliyor. İşlem, bir iş birimi (UOW) olarak işaretlenir ve bir GUID ile adlandırılır. Veritabanını kurtarmak için işlemi manuel olarak ya onaylamanız ya da geri almanız gerekir.

Warning

Bir işlemi manuel olarak commit edip geri aldığınızda, bu uygulamayı etkileyebilir. Commit veya geri alma işleminin uygulama gereksinimlerinizle tutarlı olduğunu doğrulayın.

Aşağıdaki betiklerden sadece birini çalıştırın:

  • İşlemi onaylamak için aşağıdaki betiği güncelleyin ve çalıştırın; yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy yer tutucusunu önceki hata mesajındaki kararsız işlem UOW’si ile değiştirin ve ardından çalıştırın:

    KILL 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' WITH COMMIT;
    
  • İşlemi geri döndürmek için aşağıdaki betiği güncelleyin ve çalıştırın - yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy öğesini önceki hata iletisindeki kararsız işlem UOW’siyle değiştirin ve çalıştırın:

    KILL 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' WITH ROLLBACK;
    

İşlemi kabul ettikten veya geri aldıktan sonra, veritabanını çevrimiçi hale getirmek için bunu kullanabilirsin ALTER DATABASE . Aşağıdaki betiği güncelleyin ve çalıştırın - veritabanı adını şüpheli veritabanının adı olarak ayarlayın:

ALTER DATABASE [DB1] SET ONLINE;

Şüpheli işlemlerin çözümü hakkında daha fazla bilgi için Manuel İşlemleri Çözme bölümünü inceleyebilirsiniz.