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 SubscriptionStreamskullanı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 SubscriptionStreamsiç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 SubscriptionStreamsetmeye 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:

  1. Ç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.

  2. 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.

  3. 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.

  4. 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.

  5. Komut bölümünün sonuna (en sağ taraftaki) kaydırın ve bu -SubscriptionStreams 6 parametresini ekleyin.

  6. 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, SubscriptionStreams6 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 SubscriptionStreamskullanarak performans geliştirmeleri fark edebilirsiniz. İyileştirme varsa, iyileştirme nominal olabilir. kullanarak SubscriptionStreamspiyasadaki 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 SubscriptionStreamsSubscriptionStreamssenaryoları test edebilirsiniz.

kullanarak SubscriptionStreamsedinebileceğ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 SubscriptionStreamskullanmayın.
  • değerini SubscriptionStreams sunucudaki işlemci sayısına eşit olacak şekilde ayarlayın. Örneğin, sunucuda sekiz işlemci varsa değerini SubscriptionStreams 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 SubscriptionStreamsbelirttiğ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 bir UPDATE 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

  1. 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.

  2. 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.

  3. Dağıtım Aracısı bir oturum kullanmaya geçtiyse izlemeyi durdurun.

  4. 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.

  5. 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.

  6. 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.

  7. Object Id Engellenen oturumda ve engelleme oturumunda nesnesinin Proc öğesini bulun.

    Örnek engelleme betiğinde , Object IdProc engellenen oturumda şeklindedir 2000986455. Object IdProc engelleme oturumunda değeri şeklindedir1172459501.

  8. 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.
  9. Engellemeye neden olan dizini veya dizine alınan görünümü belirleyin. Bunu yapmak için şu adımları uygulayın:

    1. Engelleme betiğinde özelliğinin waitresourcedeğerini bulun.

      Örnek engelleme betiğinde değeri waitresource şeklindedir 72057594375700480.

    2. 9a Adımında elde ettiğiniz değerin değerine waitresource eşit olacak sütunu PARTITION_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
      
    3. 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.
  10. 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.