SQL Server'de Dağıtım Aracısı'nın SubscriptionStreams parametresini yapılandırma ve sorunlarını giderme
Özgün ürün sürümü: SQL Server (desteklenen tüm sürümler)
Özgün KB numarası: 953199
Bu makalede parametresi hakkında daha fazla bilgi, bu parametreyi SubscriptionStreams
kullanırken en iyi yöntemler ve ilişkili sorun giderme işlemleri sağlanır.
Giriş
parametresi SubscriptionStreams
, bağlantı sayısını denetlemek için kullanılabilir. Microsoft SQL Server'daki bir işlem çoğaltmasında, Dağıtım Aracısı'nın aboneye paralel olarak toplu değişiklikler uygulamak için kullandığı birden çok bağlantıyı etkinleştirmek için parametresini kullanabilirsiniz. Bu işlem çoğaltma aktarım hızını büyük ölçüde artırır. Aynı zamanda Dağıtım Aracısı, değişiklikleri uygulamak için tek bir bağlantı kullandığında olduğu gibi aynı işlem özelliklerinin birçoğuna da sahip olabilir. Bağlantılardan biri yürütülemezse veya işlenemezse, tüm bağlantılar geçerli toplu işlemi durdurur ve aracı başarısız toplu işlemleri yeniden denemek için tek bir akış kullanır. Bu yeniden deneme aşaması tamamlanmadan önce Abone'de geçici işlem tutarsızlıkları olabilir. Başarısız toplu işlemler başarıyla işlendikten sonra Abone işlem tutarlılığı durumuna geri getirilir.
parametresi SubscriptionStreams
için 2 veya daha büyük bir değer belirttiğinizde, işlemlerin Abone'den alınma sırası yayımcıda yapıldıklarından farklı olabilir. Bu davranış eşitleme sırasında kısıtlama ihlallerine neden oluyorsa, eşitleme sırasında kısıtlamaların uygulanmasını devre dışı bırakma seçeneğini kullanmalısınız NOT FOR REPLICATION
. Daha fazla bilgi için bkz. Eşitlemede Tetikleyicilerin ve Kısıtlamaların Denetim Davranışı.
SubscriptionStreams'i etkinleştirmeden önce dikkate alınması gereken faktörler
SubscriptionStreams
esas olarak Dağıtımcıdan Aboneye kadar olan gecikme süresiyle ilgilenir, bu nedenle için devam SubscriptionStreams
etmeye karar vermeden önce Dağıtımcıdan Aboneye kadar gerçekten gecikme süresiyle karşılaşdığınızdan emin olun. Çoğaltma İzleyicisi'ndeİzleyici Belirteçlerini kullanabilir veya SQLServer:Replication Dist gibi Performans İzleyicisi sayaçları kullanabilirsiniz.>Dist:Teslim Gecikme Süresi, gecikme süresi düzeyi hakkında bir fikir sahibi olmak için.
Dağıtımcıdan Aboneye gecikme süresi, aşağıdakiler gibi ancak bunlarla sınırlı olmamak üzere birçok nedenden kaynaklanabilir:
- Dağıtımcı veya Abone'de engelleme
- Dağıtımcı veya Abone'de yavaş disk sürücüleri, yavaş ağ bant genişliği ve eski istatistikler gibi herhangi bir performans sorunu
- Publisher'dan gelen toplu işlemler
- Publisher'dan gelen işlemlerin oranı çok yüksek
- Abone olunan veritabanında tetikleyiciler veya gereksiz dizinler
Veritabanı Yöneticisinin (DBA) bir çağrı alması ve onlara yardımcı olup olmayacağını SubscriptionStreams
test etmesi gerekir. Örneğin Abone'de engelleme olması durumunda eşzamanlı bağlantı sayısını artırmak işe yaramaz ancak durumu daha kötü hale getirebilir. Publisher'dan gelen işlem hızı çok yüksekse ve Dağıtım Aracısı için tek bir iş parçacığının gelen yükle başa çıkamadığını düşünüyorsanız, parametresinin SubscriptionStreams
>değerini =2 olarak artırmayı düşünebilirsiniz. Yavaş ağ ve yavaş disk durumlarında da yardımcı olabilir. İdeal olarak, bu parametre için en yüksek değer 64'tür, ancak önerilen değer (veya başlangıç için iyi bir değer) Hedef (Abone) üzerindeki fiziksel işlemci sayısına eşittir.
SubscriptionStreams parametresini yapılandırma
SubscriptionStreams
, Çoğaltma İzleyicisi'ndeki Dağıtım Aracısı Profili'nde görünmeyen parametrelerden biridir. sp_addsubscription (Transact-SQL) kullanarak @subscriptionstreams
bu aracı parametresi için bir değer belirtebilir veya aşağıdaki yordamı kullanarak bu parametreyi dağıtım aracısı işi komut bölümüne ekleyebilirsiniz:
Çoğaltma İzleyicisi'ni açın, Yayımcım'ı genişletin ve sol bölme penceresinde yayınınızı seçin. Sağ bölme penceresinde, Tüm Abonelikler bölümünün altında, bu yayının tüm abonelerinin listesini görürsünüz.
Parametresini
SubscriptionStreams
etkinleştirmek istediğiniz Aboneye sağ tıklayın ve Ayrıntıları Görüntüle'yi seçin. Dağıtım Aracısı oturum ayrıntılarını içeren yeni bir pencere açılır.Bu yeni pencerede, en üstteki menü çubuğunda Eylem'i ve ardından Dağıtım Aracısı İş Özellikleri'ni seçin. Bu, Dağıtım Aracısı için İş Özellikleri penceresini açar.
Sol bölme penceresinde Adımlar'ı ve ardından sağ bölme penceresinde Aracıyı Çalıştır'ı ve ardından Düzenle'yi seçin. Yeni bir pencere açılır.
Komut bölümünün sonuna (en sağ taraftaki) kaydırın ve bu -SubscriptionStreams 6 parametresini ekleyin.
Ayarları kaydedin ve Dağıtım Aracısı işini yeniden başlatın. Değişiklikleri uygulamak için Dağıtım Aracısı'nın yeniden başlatılması gerekir.
Not
Yukarıdaki örnekte, SubscriptionStreams
6 olarak ayarlanmıştır, yani Abone'de Dağıtım Aracısı için altı paralel bağlantı arıyoruz. Bu sayıyı ortamınıza ve testinize göre ayarlayabilirsiniz.
Akış sayısını belirleme
parametresini SubscriptionStreams
kullanarak performans geliştirmeleri fark edebilirsiniz. İyileştirme varsa, iyileştirme nominal olabilir. kullanarak SubscriptionStreams
piyasadaki her disk alt sisteminin ne tür bir performans geliştirmesi sağlayacağını belirlemek zordur. Bu nedenle, üretim ortamının simülasyonunu sağlayan bir test ortamı hazırlamanızı öneririz. Çeşitli yapılandırma değerlerini ve kullanmayan bir senaryo kullanarak kullanan SubscriptionStreams
SubscriptionStreams
senaryoları test edebilirsiniz.
kullanarak SubscriptionStreams
edinebileceğiniz performans iyileştirmelerini belirlemek için yayın ve abonelik üzerinde yük testi gerçekleştirmenizi öneririz.
Disk alt sisteminin beklenen aktarım hızını anlamak için performans temel testi gerçekleştirmelisiniz. Her testi gerçekleştirmeden önce, Publisher'da yük oluşturmak için birçok değişiklik uygulayın. Yükü oluştururken Dağıtım Aracısı'nın çalışmadığından emin olun. Çoğaltma yeterli gecikme süresine sahip olduğunda, aşağıdaki yapılandırmaların performansını test etmek için Dağıtım Aracısı'nı çalıştırın:
- parametresini
SubscriptionStreams
kullanmayın. - değerini
SubscriptionStreams
sunucudaki işlemci sayısına eşit olacak şekilde ayarlayın. Örneğin, sunucuda sekiz işlemci varsa değeriniSubscriptionStreams
8 olarak ayarlayın. - En uygun yapılandırmayı elde etmek için için
SubscriptionStreams
farklı değerler belirtin.
Testi gerçekleştirdiğinizde Dağıtım Aracısı'nın aşağıdaki performans sayaçlarını izleyebilirsiniz:
- Dağ: Teslim Edilen Cmd'ler/sn
- Dist: Teslim Gecikme Süresi
SubscriptionStreams parametresini belirttikten sonra Dağıtım Aracısı'nın davranışı
Dağıtım Aracısı, içinde SubscriptionStreams
belirttiğiniz oturum/bağlantı sayısını korur. Dağıtım Aracısı, abonedeki değişiklikleri uygulamak için bu oturumları kullanır.
Ancak, siz belirttikten SubscriptionStreams
ve Dağıtım Aracısı bir süre çalıştıktan sonra, Dağıtım Aracısı aboneye değişiklik uygulamak için yalnızca bir oturum kullanmaya geçebilir.
Dağıtım Aracısı'nın yalnızca bir oturum kullanmaya geçme nedenleri
Dağıtım Aracısı birçok nedenden dolayı yalnızca bir oturum kullanmaya geçebilir. En yaygın nedenler şunlardır:
Dağıtım Aracısı değişiklikleri uygularken oturumlardan biri hata oluşturur.
Örneğin, Dağıtım Aracısı bir oturum kullanarak bir alt tabloya satır ekler. Dağıtım Aracısı başka bir oturum kullanarak ilgili satırı üst tabloya eklemeden önce bu durum oluşursa, yabancı anahtar kısıtlama ihlali hata iletisi oluşturur.
Engelleyen izleyici iş parçacığı engellemeyi algılar. Engelleme aşağıdaki nedenlerden biri nedeniyle oluşabilir:
Dağıtım Aracısı, abonedeki bir tabloda farklı oturumlar
INSERT
kullanarak birUPDATE
ve işlemi gerçekleştirir. Tabloda benzersiz bir kümelenmemiş dizin varsa, Dağıtım Aracısı tablonun dizin anahtarlarını güncelleştirdiğinde iki oturum arasında engelleme oluşabilir.Abonede, Dağıtım Aracısı birden çok tabloda Veri İşleme Dili (DML) deyimlerini çalıştırır. Bu tablolarda dizine alınan bir görünüm tanımlanmışsa, dizinlenmiş görünüm paylaşılan dizin anahtarlarını güncelleştirdiğinde iki oturum arasında engelleme oluşabilir.
Dağıtım Aracısı, bir oturum kullanarak Abone'deki bir tabloda bir DML deyimi çalıştırır. DML tetikleyicileri bu tabloda tanımlanmıştır. DML tetikleyicileri, başka bir oturum kullanılarak güncelleştirilmekte olan başka bir tabloda DML deyimlerini çalıştırır. Bu durumda, iki oturum arasında engelleme oluşabilir.
Abone veritabanında aşağıdaki veritabanı nesnelerini kullanmamanızı kesinlikle öneririz:
- Yabancı anahtar kısıtlamaları
- Benzersiz kümelenmemiş dizinler
- Dizine alınan görünümler
- Oturumlar arasında engellemeye neden olabilecek DML tetikleyicileri
Dağıtım Aracısı'nın yalnızca bir oturum kullanarak geçiş yapıp yapmadığını belirleme
Bunu yapmak için aşağıdaki yöntemlerden birini kullanın:
Not
Dağıtım Aracısı'nın Yöntem 1'i kullanarak bir oturum kullanmaya geçmediğini onaylayabilirsiniz ancak Dağıtım Aracısı'nın bir oturum kullanmaya geçişini onaylamak için Yöntem 2 veya Yöntem 3'i kullanmanız gerekir.
Yöntem 1
Abonelik veritabanına bağlantı oturumları için Dinamik Yönetim Görünümü (DMV) sys.dm_exec_sessions sorgula. Yalnızca bir bağlantı oturumu görüyorsanız, Dağıtım Aracısı bir oturum kullanmaya geçmiş olabilir. Birden fazla bağlantı oturumu görürseniz Dağıtım Aracısı belirtilen sayıda oturumu kullanmaya devam eder.
Dağıtım Aracısı'nın bir oturum kullanmaya geçtiğini onaylamak için Yöntem 2 veya Yöntem 3'i kullanın.
Yöntem 2
Dağıtım veritabanında tablo msdistribution_history sütununu
comments
sorgulayın. Sorgunun sonucu aşağıdaki girdiyi içeriyorsa, Dağıtım Aracısı bir oturum kullanmaya geçmiş olur:İşlem çok akışlı modda son toplu işlemi tamamlayamadı, tek bağlantı moduna sıfırlandı ve işlemi yeniden deneniyor.
Yöntem 3
Dağıtım Aracısı'nın çıkış dosyasını inceleyin. Çıkış dosyası Yöntem 2 ile aynı hata iletisini içeriyorsa Dağıtım Aracısı yalnızca bir oturum kullanmaya geçti.
Aşağıdaki çıkış dosyası bir örnektir:
Date/Time 100 transaction(s) with 1181 command(s) were delivered. Date/Time 100 transaction(s) with 2672 command(s) were delivered. Date/Time Bucket 6 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 1 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 3 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 0 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 5 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 2 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 7 aborted the wait for Ready To Commit event, deadlock found between spid 117 and 114 Date/Time Bucket 4 aborted the wait for Ready To Commit event, due to thread shutdown event ... Date/Time Number of subscription streams has been reset from 8 to 1, state 4. Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Disconnecting from Subscriber SQLInstance Date/Time Connecting to Subscriber SQLInstance Date/Time The process failed to complete last batch in multi-streaming mode, it has been reset to single connection mode and is retrying the operation. Date/Time 21 transaction(s) with 390 command(s) were delivered.
Yalnızca bir oturum kullanmaya geçiş yapılan Dağıtım Aracısı sorunlarını giderme
Engellenen işlem raporu olayını ve Özel durum olayını yakalamak için abonede SQL Server Profiler çalıştırın. Bu olaylar, Dağıtım Aracısı değişiklikleri uyguladığında oluşan engelleme ve hataları kaydeder.
Not
Özel durum olayı, sorunla ilişkili olabilecek herhangi bir hata türünden kaynaklanabilir. Örneğin, hatanın nedeni yabancı anahtar kısıtlama ihlali olabilir.
Dağıtım Aracısını izlemek için Dağıtım Aracısı'nın yalnızca bir oturum kullanarak geçiş yapıp yapmadığını belirleme bölümündeki yöntemlerden birini kullanın.
Dağıtım Aracısı bir oturum kullanmaya geçtiyse izlemeyi durdurun.
Dağıtım Aracısı'nın çıkış dosyasından veya tablo msdistribution_history sütunundan
start_time
aşağıdaki girdinin zaman damgasını alın:İşlem çok akışlı modda son toplu işlemi tamamlayamadı, tek bağlantı moduna sıfırlandı ve işlemi yeniden deneniyor.
Aboneden izleme (.trc) dosyasını açın. 4. Adımda elde ettiğiniz zaman damgasıyla aynı veya buna çok yakın olan bir engelleme betiği veya özel durum olayı bulun.
Bir özel durum fark ederseniz, nedenini belirlemek için özel durumun ayrıntılarını inceleyin. Örneğin, özel durum bir yabancı anahtar kısıtlama ihlalinden kaynaklanabilir. Öyleyse, Abone veritabanındaki yabancı anahtar kısıtlamasını kaldırmanızı öneririz.
Engelleyici bir betik fark ederseniz, sorun engellemeden kaynaklanır. Aşağıda örnek bir engelleme betiği verilmiştir:
<blocked-process-report monitorLoop="41589"> <blocked-process> <process id="process3a6d438" taskpriority="0" logused="24592" waitresource="KEY: 6:72057594375700480 (0100e420fa5a)" waittime="9937" ownerId="568644832" transactionname="user_transaction" lasttranstarted="2008-05-05T04:55:04.430" XDES="0xa5619e370" lockMode="X" schedulerid="11" kpid="6104" status="suspended" spid="58" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2008-05-05T04:55:04.553" lastbatchcompleted="2008-05-05T04:55:04.430" clientapp=<DistributionAgentProgram> hostname=<servername> hostpid="3980" loginname=<SQLAgentAcct> isolationlevel="read committed (2)" xactid="568644832" currentdb="6" lockTimeout="4294967295" clientoption1="671090784" clientoption2="128056"> <executionStack> <frame line="5" stmtstart="642" stmtend="1600" sqlhandle="0x0300060057a14477a8c6dd00609a00000100000000000000"/> </executionStack> <inputbuf> Proc [Database Id = 6 Object Id = 2000986455] </inputbuf> </process> </blocked-process> <blocking-process> <process status="sleeping" spid="68" sbid="0" ecid="0" priority="0" transcount="1" lastbatchstarted="2008-05-05T04:55:04.570" lastbatchcompleted="2008-05-05T04:55:05.103" clientapp=<DistributionAgentProgram> hostname=<servername> hostpid="3980" loginname=<SQLAgentAcct> isolationlevel="read committed (2)" xactid="568644998" currentdb="6" lockTimeout="4294967295" clientoption1="671090784" clientoption2="128056"> <executionStack/> <inputbuf> Proc [Database Id = 6 Object Id = 1172459501] </inputbuf> </process> </blocking-process> </blocked-process-report>
Engelleyici betik, engellenen bir oturumu ve bir engelleme oturumunu kaydeder. Engellenen oturum etiketinden
<blocked-process>
başlar. Engelleme oturumu etiketinden<blocking-process>
başlar.Object Id
Engellenen oturumda ve engelleme oturumunda nesnesininProc
öğesini bulun.Örnek engelleme betiğinde ,
Object Id
Proc
engellenen oturumda şeklindedir2000986455
.Object Id
Proc
engelleme oturumunda değeri şeklindedir1172459501
.Abonelik veritabanında, 7. Adımda elde ettiğiniz Nesne Kimliklerine eşit olacak sütunu
object_id
belirterek sys.objects görünümünü sorgular. Bunu yaptığınızda, nesne adlarını belirleyebilirsiniz.Örneğin, abonelik veritabanı bağlamında aşağıdaki sorguyu çalıştırın:
USE <SubDBName> GO SELECT name FROM sys.objects WHERE object_id = 1172459501 OR object_id = 2000986455
Not
- Yer tutucusu
<SubDBName>
abonelik veritabanının adını temsil eder. - Genellikle, bu nesneler çoğaltmada kullanılan saklı yordamlardır.
- Yer tutucusu
Engellemeye neden olan dizini veya dizine alınan görünümü belirleyin. Bunu yapmak için şu adımları uygulayın:
Engelleme betiğinde özelliğinin
waitresource
değerini bulun.Örnek engelleme betiğinde değeri
waitresource
şeklindedir72057594375700480
.9a Adımında elde ettiğiniz değerin değerine
waitresource
eşit olacak sütunuPARTITION_ID
belirterek nesne kimliğini ve dizin kimliğini almak için sys.partitions görünümünü sorgular.Örneğin, aşağıdaki sorguyu çalıştırın:
SELECT object_id, index_id FROM SYS.PARTITIONS WHERE PARTITION_ID=72057594375700480
Abonelik veritabanında sys.indexes görünümünü sorgulayarak 9b. Adımda elde ettiğiniz nesne kimliğini ve dizin kimliğini kullanarak dizini belirleyin.
Örneğin, aşağıdaki sorguyu çalıştırın:
USE <SubDBName> GO SELECT name, type_desc, is_unique FROM sys.indexes WHERE object_id = <objID> and index_id = <idxID>
Not
- Yer tutucusu
<objID>
, 9b. Adımda aldığınız nesne kimliğini temsil eder. - Yer tutucu
<idxID>
, 9b. Adımda aldığınız dizin kimliğini temsil eder.
- Yer tutucusu
Engellemenin nedeni dizine alınan bir görünümse, dizine alınan görünümü bırakmanızı öneririz. Engellemeye benzersiz bir kümelenmemiş dizin neden oluyorsa, dizini bırakmanızı ve ardından benzersiz olmayan bir dizini yeniden oluşturmanızı öneririz.
Engelleyen izleyici iş parçacığının açıklaması
Dağıtım Aracısı, oturumlar arasındaki engellemeyi algılayan bir engelleme izleyici iş parçacığı tutar. Engelleyen izleyici iş parçacığı oturumlar arasında engelleme algılarsa Dağıtım Aracısı, Dağıtım Aracısı'nın daha önce uygulayamadığı geçerli komut grubunu yeniden uygulamak için bir oturum kullanmaya geçer.
Engelleyen izleyici iş parçacığı hakkında daha fazla bilgi için İzleyici İş Parçacığını Engelleme'yi gözden geçirin.
Dağıtım Aracısı birden çok oturumu nasıl sürdürür?
Dağıtım Aracısı'nın birden çok oturumu sürdürebilmesi için önce Dağıtım Aracısı'nın, abonede uygulanmamış komutlar için dağıtım veritabanını yeniden sorgulamak üzere saklı yordamı sp_MSget_repl_commands
yürütmesi gerekir. Ardından Dağıtım Aracısı'nın birden çok oturumu sürdürebilmesi için önce Abone'de tüm bu komutları uygulaması gerekir. Gizli çoğaltma ortamında Dağıtım Aracısı birden çok oturumu sürdürebilmesi için önce Dağıtım Aracısı abonede birçok komut uygulaması gerektiğinden, Dağıtım Aracısı birden çok oturumu sürdüremez.
İşlemin tamamını izlemek için Dağıtım Aracısı'nın çıkış dosyasını inceleyin.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin