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. Read the rest of this entry »
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
B sunucusu üzerinde linked server olarak tanımlanmış A sunucusunda DB1 isimli veritabanında oluşturduğumuz T1 tablosuna linked server konulu makalemizde anlattığımız gibi 4 parçalı tanımlayıcı (4-parts identifier) kullanarak aşağıdaki gibi ulaşabiliriz.
Linkedserver.database.schema_name.object_name
A.DB1.dbo.T1
Fakat A sunucu üzerinde oluşturduğumuz geçici tablolara (temporary tables) erişmek bu kadar kolay olmamaktadır. Örneğin sunucu üzerinde oluşturduğumuz ##T1 isimli global geçici tabloya erişmek için SELECT * FROM A.tempdb.dbo.##T1 yazım biçimiyle erişebileceğimizi düşünürken aşağıdaki hatayla karşılıyoruz.
Database name ‘tempdb’ ignored, referencing object in tempdb.
Oysa aÅŸağıdaki gibi tempdb altındaki nesnelere baktığımızda tabloyu görebiliyoruz fakat tempdb’nin yapısından dolayı nesnelere eriÅŸemiyoruz.
SELECT * FROM A.tempdb.sys.sysobjects WHERE type = 'U'
Bunun için en iyi yöntem OPENQUERY fonksiyonunu kullanmaktır.
SELECT * INTO #t1 FROM OPENQUERY(A, 'SELECT * FROM ##T')
OPENQUERY fonksiyonuyla ilgili daha geniş bilgi için SQL Server Linked Server (Bağlı Sunucu) yazısı okunabilir.
Önceki yazıda SQL Server’in desteklediÄŸi mantıksal tablo birleÅŸtirme iÅŸleminden (Table Join) bahsetmiÅŸtik. Bu yazıda da biraz iÅŸin mutafağına geçerek birleÅŸtirme iÅŸlemin hangi fiziksel yöntemlerle yapıldığını özetlemeye çalışacağız. Read the rest of this entry »
Bu makalede genelde iliÅŸkisel veritabanı [Relational Database] sistemlerinin özelde SQL Server’in temel konularından biri olan JOIN seçeneklerini özetleyeceÄŸiz. SQL Server ne tür JOIN seçenekleri sunuyor, bu seçeneklerin birbirinden farkı nedir, olay sadece syntax farklılığı mıdır, performans cephesinden neler oluyor . . . bu soruları yanıtlayacağız. Table veya view gibi kaynakları birbirine baÄŸlayan JOIN ifadeleri bu kaynaklara uygulanmış SELECT, INSERT…SELECT, SELECT…INTO, UPDATE ve DELETE iÅŸlemlerinde FROM deyimiyle birlikte kullanılır. Read the rest of this entry »
SQL Server’in önemli özelliklerinden bir olan Linked Server (baÄŸlı sunucu), SQL Server’in OLE DB/ODBC veri kaynakları aracılığıyla farklı kaynaklar (Oracle, Access, Excel, Text …) üzerindeki verilere eriÅŸmemize, onlar üzerinde komutlar çalıştırmasına, dağıtık sorguları yönetme imkan tanır. Bir linked server tanımlamak için bir OLE DB provider ve bir OLE DB data source belirtilir. OLE DB provider, Microsoft Data Access Components (MDAC)’ın bir bileÅŸeni olup veri kaynağıyla iletiÅŸimi saÄŸlayan ve onu yönetme imkanı sunan kütüphanedir (DLL dosyası). Data Source ise baÄŸlantı kurulacak veri tabanını temsil eder. Her veritabanı için farklı OLE DB provider kullanılır. ÖrneÄŸin SQL Server tabanlı bir veritabanına eriÅŸmek için Microsoft OLE DB Provider for SQL Server OLE DB provider kullanılır. Aynı ÅŸekilde .mdb dosyaları için Microsoft OLE DB Provider for Jet, Oracle veritabanına baÄŸlanmak için Microsoft OLE DB Provider for Oracle veri saÄŸlayıcısı kullanılır. Read the rest of this entry »
Suspect moduna düşmek veya başka nedenlerden dolayı replikasyonu kaldıramadan yeniden restore edilmiş veya attach edilmiş bir veritabanında replikasyonu kaldırıp yeniden kurmaya çalıştığımızda aşağıdaki hata mesajıyla karşılabiliriz.
TITLE: Microsoft.SqlServer.ConnectionInfo
——————————
SQL Server could not disable publishing and distribution on ‘Veri Tabanı Adı’.
——————————
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
——————————
Invalid object name ‘dbo.syssubscriptions’.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Changed database context to ‘master’. (Microsoft SQL Server, Error: 208)
Read the rest of this entry »
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. Read the rest of this entry »
SQL Server içerisindeki Data Import / Export bölümünü veya SSIS aracını kullanarak Oracle’dan SQL Server’e veri aktarma aÅŸamasında kolonlara görmek istediÄŸimizde aÅŸağıdaki uyarıyla karşılaÅŸabiliriz.
Could not connect source component.
Warning 0×80202066: Source – VB_PERMISSIONS [1]: Cannot retrieve the column code page info from the OLE DB provider. If the component supports the “DefaultCodePage” property, the code page from that property will be used. Change the value of the property if the current string code page values are incorrect. If the component does not support the property, the code page from the component’s locale ID will be used.
Bu mesaj bir hata mesajı olayıp sadece kullanıcıyı doğru karakter setinin kullanılmadığı konusunda uyarmaktadır. Bundan kurtulmanın yolu şudur;
OLE DB Source component’in bulunduÄŸu Data-Flow içerisine girilir.
OLE DB Source component’e ait Properties penceresi açtırılır. Bunun için bileÅŸen saÄŸ tıklanarak Properties menüsü kullanılabileceÄŸi gibi bir kere tıklanarak F4 tuÅŸu da kullanılabilir.
Properties penceresinde AlwaysUseDefaultCodePage özelliği True olarak set edilir.
VS.NET’te hazırladığımız Integration Services projesindeki DTSX paketlerini belli periyotlarda çalışması için SQL Server Agent üzerinde Job tanımlarız. Job içerisinde SSIS paketini çağırdığımızda özellikle paket içerisinde tanımlanmış olan veritabanı baÄŸlantısı, dosya iÅŸlemleri gibi bazı kaynaklara eriÅŸimin gerçekleÅŸmediÄŸine ÅŸahit oluruz. Read the rest of this entry »




Recent Comments