Aylık arşivler: Aralık 2009

SQL Server Replication – Subscriber Expire & Deactivate Olması

SQL Server Data Replication içinde tanımlı abonelikler (subscription) belirlenmiş olan transaction saklama süresi (retention period) içinde senkronize edilmezse otomatik olarak pasif moda çekilebilir veya expire edilebilir. Transactional Replication yönteminde maximum distribution retention period (sp_adddistributiondb prosedürü için @max_distretention parametresi) ve publication retention period (sp_addpublication prosedürü için @retention parametresi) olmak üzere iki temel parametre kullanılır. Okumaya devam et

SQL Server Replication – Kayıt atlama

SQL Server Replication nasıl ayarlanır ?

SQL Server replication uygulaması doğası gereği replikasyona dahil edilmiş nesneler üzerinde yapılan tüm değişiklikleri SQL ifadeleri olarak Log Reader Agent aracılığıyla Distribution veritabanına aktarır. Distribution Agent de bu komutları subscriber’lara gönderir. Yanlışlıkla yaptığımız bir Bulk Insert işlemi sonucu aktarılacak liste uzayacaktır. Bu da gerisinde gelen bazı önemli bilgilerin aboneye aktarılmasını geciktirebilir. Uzun listeyi yok etmek isteyebiliriz. SQL Server Replication İlgili Notlar makalesinde yazdığımız gibi eğer replicationda o anda bir hata oluşmuşsa ve o hatayı çözemiyorsak replicationun o hatayı atlayıp kuruktaki listeye devam etmesini sağlamak için -SkipErrors parametresini kullanabiliriz. Distribution Agent için tanımlanan bu parametre aracılığıyla sözkonusu hatadaki transactionlar aboneye gönderilmez. Örneğin o anda 2601 (Cannot insert duplicate key row in object ‘%.*ls’ with unique index ‘%.*ls’.) ve 2627 (Violation of %ls constraint ‘%.*ls’. Cannot insert duplicate key in object ‘%.*ls’.) hataların oluştuğunu düşünelim. Bu hataları aşağıdaki gibi atlayabiliriz.
-SkipErrors 2601;2627
Bu yönteme alternatif olarak SQL Server 2005 ile birlikte gelen sp_setsubscriptionxactseqno prosedürü de aynı amaç için kullanılabilir. Bu prosedürün ilk yöntemden farkı non-SQL Server Subscriber’lar için kullanılamıyor olması ve parametre olarak xact_seqno (transaction sequence number) değerini almasıdır. xact_seqno listedeki her transactiona ait
log sequence number (LSN) değerini belirtir. Distribution Agent, Subscriber tarafında en son hangi transaction setini COMMIT etmişse ona ait xact_seqno değerini MSdistribution_history tablosundaki xact_seqno alanına yazar. Bir sonraki transferde bu değerden büyük xact_seqno’lara ait transactionları aboneye gönderir. Veritabanı yöneticisi olarak replikasyonun en son hangi xact_seqno değerinde kaldığını sp_setsubscriptionxactseqno prosedürüyle güncelleyebiliriz.
sp_setsubscriptionxactseqno [ @publisher= ] ‘publisher’, [ @publisher_db= ] ‘publisher_db’, [ @publication= ] ‘publication’, [ @xact_seqno= ] xact_seqno
Bu prosedür sadece transactional replication türünde çalışır.
O andaki hatalı xact_seqno değerlerini bulmak için sp_helpsubscriptionerrors prosedürü kullanılabilir.
sp_setsubscriptionxactseqno yordamına alternatif olarak MSrepl_commands tablosundan kayıt silme yöntemi kullanılabilir. Distribution veritabanının altında bulunan bu tablo replike edilecek komutları içerir. Aşağıdaki gibi xact_seqno değeri verilerek bir transaction set silinebilir.

DELETE FROM MSrepl_commands
WHERE xact_seqno= 0x0008A2500000045A00DE