Bu yazıda SQL Server Replication ile ilgili forumlarda veya site üzerinden gelmiş olan sorulara verdiğim yanıtları ve deneyimlerimi paylaşıyor olacağım.
1 – “Error 14114: (NULL) is not configured as a distributor” hatası
Bu hatanın alınmasının nedeni local sunucunun remote server olarak tanımlanmamış olmasıdır. Nitekim select @@servername ifadesi null döndürecektir. EÄŸer sysservers tablosunda kayıt var ise sp_dropserver ‘SunucuAdi’,'droplogins’ ifadesi çalıştırılıp ilgili sunucu kaydı silinir. Ardından aÅŸağıdaki gibi yerel sunucu eklenir;
sp_addserver ‘YerelSunucuAdi’, ‘local’
Daha sonra servis yeniden başlatılır.
2 – Replike edilen bir tabloya yeni bir kolon eklemek veya var olan bir kolonu çıkarmak veya kolonun tipini deÄŸiÅŸtirdiÄŸimizde o tablonun replike ediliÄŸi otomatik abonelerin yeniden initialize edilmesi gerekir. Bu durumda abonedeki tablo drop edilir yeniden create edilip ardından bulk insert yapılır.
3 – Bazı durumlarda distributor tarafındaki UPDATE iÅŸlemi Subscriber tarafında DELETE / INSERT olarak uygulanabilir. Bunun nedeni deÄŸiÅŸen alanın üzerinde unique constraint olmasıdır. Konuyla ilgili olarak aÅŸağıdaki sayfa incelenebilir.
http://support.microsoft.com/kb/238254
4 – Snapshot folder olarak share edilmiÅŸ bir alanın verilmemesi veya Subscriber’ların eriÅŸmeyeceÄŸi bir alanın verilmesi ancak push subscription’a destek verir. Network path vermek daha mantıklı olacaktır.Network pathin verilmesi durumunda bu share folderin pull subscription gibi diÄŸer makinelerde çalışan agentler tarafından eriÅŸilebiliyor olması gerekir.
5 – Bir aboneyi yaratırken manual mi yoksa otomatik mi Initialize edileceÄŸi belirtilir. EÄŸer manual olarak set edilmiÅŸ bir abone ise o anda veya daha sonra kaynak sunucunun o sunucuyu ilklendirilmesi saÄŸlanamaz. Reinitialize etmek için o aboneyi drop edip yeniden create etmek lazım. EÄŸer otomatik olarak set edilmiÅŸse Replication » Publications bölümü altındaki aboneyi saÄŸ tıklayıp Reinitialize menüsünü seçtiÄŸimizde yeniden ilklendirilmiÅŸ olur. EÄŸer manual yöntemini tercih etmiÅŸsek replike edilecek tabloları ve replikasyon prosedürelerini aboneler üzerinde oluÅŸturmak lazım. ÖrneÄŸin üzerinde replikasyon prosedürlerinin yaratılmadığı aboneyi senkronize etmek istediÄŸimizde Could not find stored procedure ’sp_MSins… gibi bir hata alırız. Replikasyon prosedürlerine ait scripti oluÅŸturmak için publish edilmiÅŸ olan database üzerinde
sp_scriptpublicationcustomprocs [ @publication = ] ‘publication_name’
prosedürü kullanılır. Bu prosedür her tablolar için çalışacak olan INSERT, UPDATE ve DELETE prosedürlerinin içeriğini oluşturur. Üretilen SQL scripti abone üzerinde çalıştırmak yeterli olacaktır.
6 – Manual initialization iÅŸleminde dikkat edilmesi gereken en önemli konu kaynak veritabanı üzerinde önceki kayıtlarda yani abonede olmayan kayıtlarda bir deÄŸiÅŸiklik olursa abonede o kayıt olmadığı için UPDATE / DELETE iÅŸlemi hata verecektir. “‘The row was not found at the Subscriber when applying the replicated command.’” hata mesajıyla karşılaşılır. Bu kayıt abonede oluÅŸturulmadığı sürece yani bu hata giderilmediÄŸi sürece replikasyon o noktada takılıp devam etmeyecektir.
EÄŸer replikasyonun yapıldığı sistemler SQL Server ise aboneler üzerinde her tablo için “sp_MS…” ile baÅŸlayan INSERT/DELETE/UPDATE procedure’leri oluÅŸturulur. Bu prosedürlerin aldığı parametreler o tablonun o anda replikasyona dahil edilmiÅŸ olan kolonlarına göre oluÅŸturulur. EÄŸer daha sonradan tabloların ÅŸemaları deÄŸiÅŸirse veya replikasyonda kolon ekleme/çıkarma olursa bu prosedürleri yeniden abonelerde oluÅŸturmak gerekir. EÄŸer replikasyon heterojen sistemler arasında yapılırsa yani SQL Server – Oracle arasında yapılırsa o zaman subscriber olan Oracle üzerinde bu prosedürler oluÅŸturulmaz (“Heterogeneous Database Replication“). Normal UPDATE, DELETE, INSERT SQL cümleleri gönderilir. Abonelere gönderilecek komutlar MSrepl_commands ve MSrepl_transactions tablolarında binary formatında tutulur.
7 – Replikasyon iÅŸleminde Distribution hataları atlamak.
Replikasyon, Publisher’da meydana gelen her transaction Distributor’a gönderilir. O da ilgili Subscriber’a gönderir. Bu süreçte INSERT / UPDATE / DELETE iÅŸlemlerinde birinde hata meydana gelirse o iÅŸlem rollback edilir veya sonraki transactionlar iÅŸlenmez. Bu ÅŸekilde herhangi bir hatanın meydana gelmesi durumunda o hatayı görmemezden gelip sonraki transactionların abonelerde uygulaması için “Distribution Agent” için -SkipErrors parametresi kullanılabilir. Bu parametreye o hata veya hataların numaraları girilerek o hataların görmemezlikten gelinmesi saÄŸlanabilir. Bunun için “Publisher and Distributor Properties” penceresindeki Distributor sekmesinde Agent Profiles tıklanarak yeni bir profil tanımlanır. Replikasyon agent’lerin çalıştığı default profile göre hatanın olması durumunda sistem devam etmez. SkipErrors deÄŸerinin karşısında mevcut hata numaralarının yazıldığı bir profil yaratılır ve servis yeniden baÅŸlatılarak bu profilin devreye girmesi saÄŸlanır. Hata giderildikten sonra yeniden default profile kullanılabilir.
8 – Replikasyonda sadece replikasyona dahil edilmiÅŸ kolonlarla ilgili transactionlar abonelere gönderilir. ÖrneÄŸin AdSoyad ve Sehir kolonlarının bulunduÄŸu kaynak tablosunda sadece AdSoyad kolonu replike ediliyorsa sadece Sehir kolonu update edildiÄŸi zaman aboneye herhangi bir update cümlesi gönderilmez aynı ÅŸekilde AdSoyad ve Sehir aynı anda update edilirse sadece AdSoyad kolonun update bilgisi aboneye ulaşır. Replikasyonun güzel yanı replikasyona dahil edilmiÅŸ kolonlar içerisinden gerçekten update edilmiÅŸ olanları abonelere gönderir. ÖrneÄŸin tabloda Sehir=’Ankara’ ve AdSoyad=’Ahmet’ olan kayıt için
UPDATE Musteri SET Sehir=’İstanbul’,AdSoyad=’Ahmet’ WHERE MusteriId=1
sorgusunu çalıştırdığımızda abonelere sadece
UPDATE Musteri SET Sehir=’İstanbul’ WHERE MusteriId=1
sorgusu gönderilecektir. Aynı update cümlesini çalıştırdığımızda abonelere herhangi bir güncelleme emri gönderilmeyecektir.
9 – Article’larda bir deÄŸiÅŸiklik yapıldığı zaman yani replikasyona yeni bir kolon eklendiÄŸi veya var olan bir kolon çıkarıldığı zaman tüm subscription’lar reinitialize olacak ÅŸekilde iÅŸaretlenir. Onları yeniden ilklendirmek gerekir. Bu durum automatic initialization destekli subscription’lar için geçerli. Bu durumda reinitialization iÅŸlemi bir sonraki Snapshot Agent ve Distribution Agent’lerin çalışmasıyla gerçekleÅŸir. Manual initialization destekli olan aboneleri manual olarak ilklendirmek gerekir.
10- Snapshot dosyaları nelerdir
İlklendirme iÅŸlemi için gerekli olan Snapshot dosyaları ÅŸunlardır; schema (.sch); data (.bcp); constraint ve index’ler (.dri); constraint’ler (.idx); trigger’ler (.trg):sıkıştırılmış snapshot dosyaları (.cab). Bu ilklendirme dosyaları transactional publication için sp_browsesnapshotfolder prosedürü, merge publication için sp_browsemergesnapshotfolder prosedürü kullanılarak görülebilir. Bu prosedürler publisher üzerinde çalıştırılır.
11 – Replikasyona dahil edilmiÅŸ olan bir kolonu kaldırmak istediÄŸimizde “ALTER TABLE DROP COLUMN failed because is currently replicated.” gibi bir hatayla karşılaşırız. Bunu çözmenin en doÄŸru yolu replikasyonu durdurmak, sözkonusu kolonu replikasyonda çıkarıp ardından DROP etmektir.
12 – “SQL Server Enterprise Manager could not configure ‘TESTSERVER’ as the Distributor for ‘TESTSERVER’. Error 21112: ‘-PollingInterval’ is not a valid parameter for the Log Reader Agent” hatası sunucunun Turkish collation kullanıyor olmasından kaynaklanmaktadır. Bu hatayı gidermek için en az SQL Server 2000 Service Pack 1 kurmak lazım. Daha fazla bilgi için aÅŸağıdaki adres incelenebilir.
http://support.microsoft.com/kb/295325
13 – “Message 20554 Severity 10 “The agent is suspect. No activity reported within the last 10 minutes.” hatası replication agent’in SQL Server Enterprise Manager’e uzun süre durumunu haberdar edemeyiÅŸinden kaynaklanır. Bu hata sistem için sıkıntı yaratmaz. Bu hatayla karşılaşıldığı zaman sözkonusu agenti stop etmeyip servisin o anki iÅŸini bitirmesini beklemeliyiz. Agent stop edilirse o andaki iÅŸlemler rollback edilerek yeniden baÅŸlatılır.
14 – “The process is running and is waiting for a response from one of the backend connections” hatası nedir ?
Bazı durumlarda Log Reader bu veya buna benzer bir mesaj verebilir. Bu bir hata olmayıp sistemin o an için meşgul olduğu karşı abonelerin tam olarak COMMIT edilmeyi beklediğini anlatır. Örneğin msrepl_transaction tablosunda işlenecek veya işlemin transcationlar fazla olduğu zaman böyle bir uyarı verilir. Veya snapshot data aboneye yansıtıldıktan sonra tablolara ait indexler çalıştırıldığı zaman da bu uyarı verilir. Bunun için sunucunun işlemini beklemekte fayda vardır. Bir süre sonra normale geçecektir. Bu hata mesajını kısa sürede elde etmemek için Agent için daha yüksek timeout değerine sahip bir profil oluşturulabilir.
15 – “The system cannot find the file specified….” hatası
Bu hatayı genellikle snapshot agent çalışmaya baÅŸlarken hata verir. Bunun sebebi “C:\Program Files\Microsoft SQL Server\80\COM\” klasörünün altında replikasyon ile ilgili exe dosyalarının eksik olması olabilir.SP3 yeniden kurulabileceÄŸi gibi baÅŸka bir makineden ilgili exe ve dll dosyaları da kopyalanabilir.




Åžubat 9th, 2011 at 17:06
Merhabalar,
Yazınızda okudum da 7. maddenin sonunda servisin restrat edilmesi demişsiniz.Ben yeni bir aget profile tanımladıktan sonra sadece SQL server servicesini restart edersem replikasyoın kaldıgı yerden devam eder mi?
Åžubat 11th, 2011 at 14:04
Merhaba İsmail,
aslında sadece Distributor Agent’i yeniden baÅŸlatmak yeterli olacaktır ama benim tavsiyem SQL Server Agent’i yeniden baÅŸlatmak olacaktır.
Åžubat 11th, 2011 at 23:53
cevabınız için cok tskr ederim o zaman relikasyonun durdugu anlarda hatayı bulup eklemek sorunu çözer tekrar tskr ederim