SQL Server Replication – Yeni Tablo Ekleme

Merkez ve şubeler arasında transactional replication yapılmaktadır. Bu replikasyon aracılığıyla birçok tablo şubelerden merkeze aktarılmaktadır. Fakat sonraki günlerde ihtiyaç doğrultusunda replike edilen dataya yeni bir nesne(article) daha ekleme ihtiyacı doğdu. Mevcut publication içerisine yeni bir article eklediğimizde varsayılan olarak senkronizasyonu yeniden sağlamak lazım yani başından bu yan tüm tabloların bulunduğu yeni bir snapshot oluşturup bunu şube(-lere) yansıtmak lazım.
Fakat her eklemede tüm snapshot’un yeniden alınması istenilen bir durum değildir. Hangi nesneler replikasyona dahil edildiyse sadece onlara ait snapshot’un oluşturulması daha doğru olacaktır. Bu sayfada bu işlemin nasıl yapılacağını örneklendireceğiz. Sehir isimli tabloyı MerkezData isimli publication’a dahil etmek için sp_addarticle prosedürü kullanılır.

EXEC sp_addarticle @publication='MerkezData', @article='Sehir',@source_table='Sehir'

Bu komutu çalıştırdığımızda aşağıdaki gibi bir hata mesajıyla karşılaşırız.
Msg 20607, Level 16, State 1, Procedure sp_MSreinit_article, Line 99
Cannot make the change because a snapshot is already generated. Set @force_invalidate_snapshot to 1 to force the change and invalidate the existing snapshot.

Bu mesajın sebebi hali hazırda bir snapshot oluşturulmuş olmasıdır. Yeni tablo eklemekle birlikte mevcut snapshot’u kullanamayacağımız için @force_invalidate_snapshot=1 seçeneğini kullanarak yeni geçerli bir snapshot’un oluşturulmasını sağlamalıyız. Kodu aşağıdaki gibi düzenlediğimizde yayına Sehir tablosu eklenmiş olacak ve abonelere yansıtılmak üzere yeni bir snapshot oluşturulmuş olacaktır.

EXEC sp_addarticle @publication='MerkezData', @article='Sehir',@source_table='Sehir',@force_invalidate_snapshot=1

Bu işlemden sonra Snapshot Agent servisi yeniden başlatıldığı zaman hem daha önceki tabloların hem de Sehir tablosunun şema ve data scriptleri oluşturulur ve aboneye gönderilir. Oysa bizim istediğimiz durum sadece “Sehir” tablosunun snapshot’unu almasıdır. Bu amaçla kontrol etmemiz gereken yer mevcut publication’ın immediate_sync ve allow_anonymous özellikleridir. sp_helppublication prosedürünü kullanarak mevcut publication hakkında bilgi alınabilir.
EXEC sp_helppublication ‘MerkezData’
Bu komutun sonucunda immediate_sync özelliğinin 1 olduğu yani enabled olduğu görülür.Bu özelliğin aktif olması her yeni tablo eklendiğinde tüm publication için snapshot alınmasını sağlar. Bu özellik genellikle anonymous subscription’a izin vermek için kullanılır. Bu tür aboneler CreatePublication aracını kullanarak mevcut yayına abone olurlar. Bu iki özelliği aşağıdaki gibi false moduna çekelim.

EXEC sp_changepublication
	@publication = 'MerkezData',
	@property = N'allow_anonymous',
	@value = 'false'
GO
EXEC sp_changepublication
	@publication = 'MerkezData',
	@property = N'immediate_sync',
	@value = 'false'
GO

Şimdi Sehir tablosunu yayına alıp ilgili aboneyle ilişkilendirelim.

EXEC sp_addarticle
	@publication='MerkezData',
	@article='Sehir',
	@source_table='Sehir'
GO
EXEC sp_addsubscription
	@publication = 'MerkezData',
	@article = 'Sehir',
	@subscriber = 'DW',
	@destination_db = 'XXX'

sp_addsubscription yordamına alternatif olarak sp_refreshsubscriptions yordamı kullanılabilir.

EXEC sp_refreshsubscriptions @publication = N'MerkezData'

sp_refreshsubscriptions yordamı tanımlı tüm subscriber’lar için eklenmiş yeni tablolara subscription ekler. Yani tüm abonelere bu yeni tabloya abone eder.
Bu işlemden sonra Snapshot Agent servisi yeniden başlatıldığı zaman sadece Sehir tablosunun snapshot’u oluşturulur ve abonelere yansıtılır.
Aynı şekilde Sehir tablosunu Replikasyonda çıkarmak için aşağıdaki prosedürler kullanılır;

EXEC sp_dropsubscription
	@publication = N'MerkezData',
	@article = N'Sehir',
	@subscriber = N'DW'
GO
EXEC sp_droparticle
	@publication='MerkezData',
	@article='Sehir'

Yayınlanan yayınların abonelik durumlarını görmek için sp_helpsubscription yordamı kullanılabilir.
Kaynak : replicationanswers.com

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir