<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Yazılım geliştirme günlüğü</title>
	<atom:link href="http://www.ahmetkaymaz.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ahmetkaymaz.com</link>
	<description>C#, VB.NET, ASP.NET, SQL Server, Kitap, Yazılım tasarımıyla ilgili notlar</description>
	<pubDate>Fri, 02 Jan 2009 09:53:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>Olmert&#8217;in insafına kalmadı Gazze</title>
		<link>http://www.ahmetkaymaz.com/2008/12/30/olmertin-insafina-kalmadi-gazze/</link>
		<comments>http://www.ahmetkaymaz.com/2008/12/30/olmertin-insafina-kalmadi-gazze/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 21:10:07 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[Günlük Yaşam]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=231</guid>
		<description><![CDATA[Bizi soracak olursanız biz çok öfkeliyiz..
Kimsin sen Kim?
Adının içinde yanlışlıkla mertlik geçen kan heykeli adam &#8230;
Kimsin sen&#8230;
Seni çekiç suyuyla mı beslediler&#8230;
Asitli diken kundağında mı büyüdün.
Evinizin penceresi hep merhametsizliğe mi baktı küçükken.
Annen saçlarını çamurla mı yıkadı&#8230;
Sınıfta en arka sırada oturup, tahtaya kalaşnikofla mı kalktın..
En sevdiğin hayvan yılan mıydı senin&#8230;
Rezil mi olurdun arkadaşlarına bir kuşu öldürmeyince&#8230;
Defterin köpeklerle [...]]]></description>
			<content:encoded><![CDATA[<p>Bizi soracak olursanız biz çok öfkeliyiz..</p>
<p>Kimsin sen Kim?<br />
Adının içinde yanlışlıkla mertlik geçen kan heykeli adam &#8230;<br />
Kimsin sen&#8230;<br />
Seni çekiç suyuyla mı beslediler&#8230;<br />
Asitli diken kundağında mı büyüdün.<br />
Evinizin penceresi hep merhametsizliğe mi baktı küçükken.<br />
Annen saçlarını çamurla mı yıkadı&#8230;<br />
Sınıfta en arka sırada oturup, tahtaya kalaşnikofla mı kalktın..<br />
En sevdiğin hayvan yılan mıydı senin&#8230;<br />
Rezil mi olurdun arkadaşlarına bir kuşu öldürmeyince&#8230;<br />
Defterin köpeklerle mi kaplıydı.<br />
Seni Rahibe terasalar mı kutsadı&#8230;<br />
<span id="more-231"></span><br />
Kimsin sen Kim?<br />
Saçlarının arasında mıydı bitlenmiş bombalar&#8230;<br />
Vicdansızlık ormanının tanrısız kralı mıydın.<br />
Isırgan otlarını mı dişledi ateş yutan ağzın&#8230;<br />
İnsan olmayacaksan niye giydin bu şehrin ölümünü&#8230;<br />
Düğününde sırtlanlar mı çekti fotograflarını<br />
Eve giderken ekmek yerine kurt mu kaptın mermi fırınlarından&#8230;</p>
<p>Bizi soracak olursanız biz çok öfkeliyiz&#8230;<br />
Olmertin insafına kalmadı Gazze&#8230;<br />
Olmertin insafına tenezzül etmeyen Gazze&#8217;li çocukların ruhuna düğüm düğüm cennet sessizliği diliyoruz&#8230;</p>
<p>Bırakalım Olmertin ikinci adını Allah koysun&#8230;<br />
Allah koysun&#8230;</p>
<p>Bizi soracak olursanız biz Olmertin insan olmadığını düşünmeye devam ediyoruz.. </p>
<p><i>Esra Elönü</i></p>
<p><!--IHH Banner BASLA--><br />
<a href="http://www.ihh.org.tr/" target="_blank"><br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/Filistine_Yardim.jpg" align="center" border="0"></a><br />
<!--IHH Banner BITIR--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/12/30/olmertin-insafina-kalmadi-gazze/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Yeni Nesil Veri Programlama Modeli (ADO.NET 3.5)</title>
		<link>http://www.ahmetkaymaz.com/2008/02/28/object-relational-mapping-adonet-entity-framework/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/28/object-relational-mapping-adonet-entity-framework/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 07:07:31 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<category><![CDATA[ADO.NET Entity Framework]]></category>

		<category><![CDATA[Object Relational Mapping]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=233</guid>
		<description><![CDATA[Microsoft firması .NET Framework 3.0 ile birlikte ADO.NET&#8217;in yeni bir versiyonunu yayınlamadı. .NET Framework 3.5 ile birlikte yeni eklentiler kazandırılmış ADO.NET 3.5 sürümü yayınlandı.
Microsoft, ADO.NET 3.5 sürümleriyle birlikte veritabanı uygulama mimarisinde büyük kolaylık sağlayan Object Relational Mapping (O/R Mapping) yöntemini destekleyecek önemli adımlar attı. Bu amaçla ADO.NET Entity Framework aracı geliştirildi. Konunun ayrıntılarına geçmeden önce [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft firması .NET Framework 3.0 ile birlikte ADO.NET&#8217;in yeni bir versiyonunu yayınlamadı. .NET Framework 3.5 ile birlikte yeni eklentiler kazandırılmış ADO.NET 3.5 sürümü yayınlandı.<br />
Microsoft, ADO.NET 3.5 sürümleriyle birlikte veritabanı uygulama mimarisinde büyük kolaylık sağlayan <b>Object Relational Mapping (O/R Mapping)</b> yöntemini destekleyecek önemli adımlar attı. Bu amaçla <b>ADO.NET Entity Framework</b> aracı geliştirildi. Konunun ayrıntılarına geçmeden önce bu kavramları tanımlayalım ve neden yeni bir yaklaşıma ihtiyaç duyulduğunu açıklayalım.<span id="more-233"></span></p>
<p>Günümüzde özellikle veritabanına dayalı uygulamalar, katmanlı mimari (multi-tier architecture) üzerine kurulur. Bu konsept dahilinde uygulamalar, <b>veri (data)</b>, <b>iş (business logic)</b> ve <b>sunum (presentation)</b> olmak üç temel katmandan oluşur. Tasarım sürecinde ilk sırada bulunan veri katmanı oluşturulurken çeşitli veri modelleri kullanılır. &#8220;<i>Verileri mantıksal düzeyde düzenlemek için kullanılan kavramlar, yapılar ve işlemler bütününe <b>veri modeli</b> denir.</i>&#8221;<br />
70&#8242;lı yıllardan bu yana Veritabanı Yönetim Sistemleri&#8217;nin (Database Management System – DBMS [VTYS]) değişmesiyle birlikte çeşitli veri modelleri geliştirildi:</p>
<ul>
<li>Sıradüzensel veri modeli (Hierarchical data model)
<li>Ağ veri modeli (Network data model)
<li>İlişkisel veri modeli (Relational data model)
<li>Nesneye yönelik veri modeli (Object oriented data model)
</ul>
<p>Her VTYS&#8217;nin kendine özgü veri modeli bulunur. Veri modeli kullanılarak veritabanının kavramsal ve dış şemaları oluşturulur. Burada bu modellerle ilgili kavramları tanımlayacağız ve VTYS&#8217;den bağımsız tasarım yapmamızı sağlayan ER modelini ayrıntılı ele elacağız. </p>
<p><u><b>Entity Relationship (ER) Modeling</b></u></p>
<p>Günümüzde bir veritabanı uygulamasının başarılı olmasını sağlayacak ilk parametre, iyi bir veritabanı tasarımına sahip olmasıdır. Bir uygulama geliştirileceği zaman öncelikle bu uygulamanın ne tür bir uygulama olduğu ve ne tür verileri içereceği belirlenir. Veritabanı tasarımı, bu soruların yanıtları doğrultusunda şekillenir. İlişkisel veritabanı sistemlerinde veritabanı tasarımının ilk adımı veri modellemedir.<br />
Veri modelleme, veritabanı verilerinin ve bunların arasındaki ilişkinin organizasyon içindeki herkesin rahatlıkla anlayabileceği metin ve şekillerle ifade edilmesidir. Bilindiği gibi organizasyon içindeki <i>kullanıcı</i>, <i>tasarımcı</i> ve <i>programcı</i> gibi teknik veya teknik olmayan kişilerin veriye bakış açıları ve veriyi tanımlamaları farklılık arzeder. Hazırlanacak olan veritabanı tasarımında bu kişilerin hepsinin rolü olduğu için bu kişiler arasında ortak bir dil oluşturmak gerekir. Bu dilin temeli hiç şüphesiz gerçek dünya varlıklarıdır. Veritabanını kullanacak olan kullanıcı, tasarlayacak olan tasarımcı ve kodlayacak programcı ihtiyacını ancak gerçek varlıklar (nesneler) üzerinden daha kolay anlatabilir. Fakat gerçek dünyada varlıklar daha karmaşık özellik ve yeteneklere sahip olduğu için bu varlıklar üzerinden ifade edilmiş yapıyı, veri modellemesi aracılığıyla daha anlaşılır hale getirmek gerekir. Buradaki amaç, organizasyon içindeki herkesin gördüğü zaman kolaylıkla anlayabileceği ve veritabanı yapısını gözünde canlandırabileceği bir veri modeli çıkarmak ve bu model üzerinden organizasyon ihtiyaçlarını doğru şekilde karşılayacak fiziksel bir veritabanı tasarımına zemin hazırlamaktır.<br />
Veritabanı modellemenin üç türü vardır. Bu türler aynı zamanda veritabanı model veya tasarımın aşamalarını da bildirir.</p>
<p><b>Kavramsal tasarım (Conceptual design):</b> Veri tabanının hangi verileri içereceğinin ve bu veriler arasındaki ilişkilerin belirlendiği aşamadır. Bu aşamanın en önemli özelliği veritabanı nesneleri herhangi bir VTYS şemasına bağlı kalınmadan modellenir. Bu aşamada organizasyon içindeki herkes aktif olabilir. Kavramsal modelleme, mantıksal modellemenin çözümlenmesini ve tasarımını kolaylaştırmak için atılmış bir adımdır.</p>
<p><b>Mantıksal tasarım (Logical design):</b> VTYS&#8217;nin tanımlandığı aşamadır. Kavramsal tasarımda modellenen yapı, karar verilmiş olan VTYS&#8217;ye uygun şemaya dönüştürülür. Veritabanında kullanılacak veri türleri, tablo üzerindeki anahlarlar, tablo satırlarının birbirleriyle ilişkileri bu aşamada belirlenir. Bu aşamada daha çok tasarımcı ve programcı rol oynar.</p>
<p><b>Fiziksel tasarım (Physical design):</b> Verilerin hangi disk veya başka fiziksel depolama sistemlerinde nasıl tutulacağı, ne tür işlemci yapılarının kullanılacağı, aygıtların verilere hangi yol ve kurallar dahilinde ulaşacağı ve bunların doğrultusunda VTYS yazılımın hangi işletim sistemi üzerinde koşacağı belirlenir. Daha çok veritabanı programcısının aktif rol oynadığı bu aşamada oraya çıkan modelin daha önce organizasyon elemanlarıyla birlikte karar verilmiş olan kavramsal ve mantıksal modelle olan uyumluluğu test edilir. Kısaca, kavramsal ve mantıksal tasarım aşamasında, veritabanı şemasına karar verildiğini, fiziksel tasarım aşamasında da veritabanının fiziksel yapısına karar verildiğini söyleyebiliriz. </p>
<p>Bu aşamalardan sonraki süreç, uygulama programının yazılarak kullanıcıların belirlenmiş yetkiler ölçüsünde veriye ulaşmasıdır.</p>
<p>Kendisi soyut bir yapı olan veri modeli, ANSI-SPARC mimarisine göre <b>kavramsal (conceptual)</b>, <b>dış (external)</b> ve <b>iç (internal)</b> olmak üzere üç seviyeli soyutlama derecesine sahiptir. Bu seviyeler, veri ortamının organizasyon içindeki kişiler tarafından görünen görünümü temsil eder. <b>Dış seviye</b>, veritabanının kullanıcıya olan görüntüsü ifade eder. Her kullanıcının özgül bakışı ve bilgisi doğrultusunda birçok dış görünüm oluşturulabilir. Bu görünümler kullanıcı programları veya doğrudan SQL cümleleriyle oluşturulur. Daha çok veritabanı sahiplerinin hazırladığı ve veritabanının üst düzeyde soyutlanmış hali olan <b>kavramsal seviye</b>, veritabanının kuş bakışı görüntüsünü temsil eder. Bu seviyede veritabanında hangi verilerin saklandığı ve bu veriler arasındaki ilişki görünür. Kavramsal modelde veritabanı yazılım ve donanımla ilgili bilgi bulunmaz yani VTYS&#8217;den bağımsız bir görüntü sunar. <b>İç seviye</b> ise VTYS&#8217;ye bağımlı olup veritabanının VTYS&#8217;ye göre hazırlanmış şemasını belirtir. Veritabanının en alt düzeyde soyutlanmış olan bu seviyede verilerin veritabanın nasıl saklandığı ifade edilir. Aynı zamanda fiziksel seviye olarak ta bilinir.</p>
<p>Veritabanı tasarımı konusunda bu kadar giriş yapmamız yeterli olacaktır. Asıl konumuz; kavramsal tasarım aşamasında en çok kullanılan yöntem olan <b>Varlık-İlişki (Entity-Relationship, ER)</b> modelidir. ER modeli, kavramsal veri modelini herhangi bir VTYS şemasına bağlı kalmadan ana hatlarıyla ER diyagramı üzerinde şematik olarak gösterme tekniğidir. Bu teknik, organizasyon içerisindeki teknik veya teknik olmayan kişiler arasında verinin farklı görünümlerini ortak bir kalıba dönüştürür ve veritabanı uygulamalarının daha kolay geliştirilmesini sağlar. ER çizenekleri için, genellikle UML gösterimleri kullanılır. </p>
<p>ER yönteminin çıkış amacı tasarımcıların oluşturduğu nesne modelini, nesne kavramını anlamayan ilişkisel veritabanı yönetim sistemlerine kolaylıkla uyarlayabilmektir.<br />
ER modeli, teknik olarak <b>varlıklar (entities)</b> ve <b>ilişkiler (relationships)</b> koleksiyonundan oluşur. ER modelinin temelinde bu bölümün de anahtar kelimesi olan <b>varlık</b> bileşeni bulunur. Varlık ifadesi, Yazılım Mühendisliği literatüründe gerçek dünyadaki anlamıyla kullanılır. Yani soyut veya somut olarak var olan ve benzerlerinden ayırt edilebilen her şeye varlık denilir. Örneğin gerçek dünyada <i>insanoğlu</i>, <i>araba</i>, <i>devlet</i> nesneleri varlık olarak nitelendirildiği gibi nesne tabanlı programlamada sınıflar, veritabanı yönetim sisteminde de tablolar varlık olarak nitelendirilir. Her varlık, kendisini diğer varlıklardan ayırteden <b>öznitelik (attribute)</b> olarak bilinen karakteristiklere sahiptir. Veritabanındaki tablolar, satır ve sütunlardan oluşur. Tablo satırlarının her biri bir tek varlığı temsil eder. Varlığın her bir niteliği bir sütunda temsil edilir. Örneğin bir elektronik ticaret projesinde &#8220;Musteri&#8221; bir varlık, müşterinin &#8220;AdSoyad&#8221; bilgisi, bu varlığa ait bir nitelik olarak tanımlanabilir. &#8220;AdSoyad&#8221; bilgisinin &#8220;Murat Şensoy&#8221; olarak belirlenmesi bu niteliğin değeridir (<b>data value</b>). Özniteliğin alabileceği veya aldığı değerler <b>etki alanı (domain)</b> olarak tanımlanır.</p>
<p>VTYS&#8217;ler varlık kümesi ve onların arasındaki etkileşimden oluşur. Varlıklar arasındaki etkileşim, varlık ilişkisi olarak tanımlanır. Varlıklar arasında üç tür ilişki kurulur:</p>
<p><b>Birden çoğa ilişki (one-to-many relationship):</b> Bir tablonun bir kaydına karşılık ikinci tabloda birden fazla kaydın olmasıdır. &#8220;Siparis&#8221; ve &#8220;Musteri&#8221; tabloları arasındaki ilişkidir. Bir sipariş, sadece bir müşteriye ait olabilir fakat bir müşterinin birden fazla siparişi olabilir. Bu ilişki 1:M ile temsil edilir.</p>
<p><b>Çoktan çoğa ilişki (many-to-many relationship):</b> Bir tablonun birden fazla kaydı, diğer tablonun birden fazla kaydıyla ilişkilidir. M:N ile temsil edilen bu ilişki genellikle üçüncü bir tablo üzerinde oluşturulur. &#8220;Ogrenci&#8221; ve &#8220;Kurs&#8221; tablolarını örnek olarak verebiliriz. Bir öğrenci birden fazla kursa katılabilir aynı şekilde bir kursa birden fazla öğrenci katılabilir. Bu ilişki &#8220;OgrenciKurs&#8221; tablosunda tutulur.</p>
<p><b>Birden bire ilişki (one-to-one relationship):</b> Bir müşterinin bir şifresi var ve her bir şifre bir müşteriye aittir. Bu durum, bir tablo ilişkisinden ziyade ikinci tablonun birinci tablonun uzantısı olmasıdır.</p>
<p>Tasarım aşamasında varlık ve onlara ait öznitelikler belirlendikten sonra varlıklar arasındaki ilişkiler belirlenir ve öğe ilişki çizeneği çıkarılır (<i>entity relationship diagramming -  öğe ilişki çizeneği</i>). Bu çizelgede veritabanı varlıkları, varlıkların türleri, varlıklar arası ilişkiler ve ilişki kuralları gösterilir. ER diyagramı hazırlayabilmek için <i>Microsoft Visio, Sybase Power Designer</i> gibi araçlar kullanılır. Aşağıdaki çizelgede üç tablonun yapısı ve ilişkileri gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_1.jpg"></p>
<p>Sonuç olarak ER tekniğinin, veritabanı oluşturulmadan önce veritabanı tasarımını kolaylaştırmak amacıyla veritabanının hangi varlıklardan oluştuğunu ve bu varlıkların nasıl ilişkilendirildiğini çeşitli şemalarla belirtme yöntemi olduğunu söyleyebiliriz. ER modelinin en önemli özelliği bu mantıksal tasarımı VTYS şemasına bağlı kalınmadan yapmasıdır. </p>
<p>VTYS tarafında, tasarımcılar tarafından oluşturulmuş olan nesne modelini VTYS&#8217;de saklamak için aracı olarak ER modelini kullanıyoruz. Bu ek işlem, şu anki VTYS&#8217;lerin nesne yönelimli (Object Oriented) olmamasından kaynaklanmaktadır. Aynı sorun kullanıcılarla veritabanı arasında iletişim sağlayacak veritabanı uygulamaları yazılırken de yaşanır. Özellikle nesne yönelimli bir programlama dili kullanıldığı zaman class, inheritance, property, method gibi OOP varlıkları VTYS tarafından desteklenmediği için iş katmanında OOP ve ilişkisel veritabanı özellikleri iç içe kullanılır. Uygulamaların iş katmanındaki bu iş yükünü azaltmak amacıyla <b>O/R Mapping</b> isimli nesne-ilişki eşleştirme yöntemi kullanılır.</p>
<p><b><u>Nesne-İlişkili Haritalama (Object-Relational Mapping - O/R Mapping)</u></b></p>
<p>Günümüzde en çok kullanılan veri modeli, ilişkisel veri modelidir. Aynı şekilde uygulamaların iş katmanı yazılırken en çok nesne odaklı programlama modeli tercih edilir. Uzun yıllardır kullanılan bu iki yöntem, uygulama geliştiriciler için ciddi kolaylıklar sağlamıştır. Bununla birlikte bu iki yöntemin kullanıldığı geniş çaplı kurumsal uygulamaların en önemli sorunu, bu uygulamaların tasarım ve geliştirme süreçlerinin yönetimi zor ve zaman alıcı bir hal almasıdır. Özellikle iş katmanında veritabanı sorgulama işlemlerinde yoğun bir şekilde SQL dilinin kullanılıyor olması ve uygulama kodlarının veritabanı şemasına bağlı kalması, uygulama geliştiricilerinin veritabanı tarafında çok zamanını almaktadır. Veritabanında yeni bir kolon ekleme, kolon değiştirme gibi tablonun şemasının değişmesi durumunda uygulamanın iş katmanındaki veri erişim kodlarının yeniden gözden geçirilmesi gerekir. Bir veritabanı uygulamasında, kodun üçte birinin veri erişimiyle ilgili olduğunu göz önünde bulundurduğumuzda veri erişim katmanında her modül için <i>sorgulama, ekleme, güncelleme, silme</i> gibi işlemleri yeniden kodlamak birçok yazılım mühendisi için sıkıcı ve zaman alıcı olabilmektedir. </p>
<p>Ayrıca iş katmanında nesne odaklı programlama tercih edildiği halde veriye nesnesel olmayan yöntemlerle erişilir. Yani veritabanında veri tutmaya yarayan tabloları, uygulama geliştirme tarafında gerçek varlıkları temsil etmek için kullandığımız nesnelerle ifade edememekteyiz. Aynı şekilde uygulama tarafında oluşturulmuş bir nesneyi de veritabanı tarafında uygun bir şekilde temsil edememekteyiz. Bu işlemleri yapabilmek için diğer veri modeli olan ve gerçek dünyayı daha iyi modelleyebilecek &#8220;nesneye yönelik veri modeli&#8221;nin gelişmiş olması lazım. Şu ana kadar bu modeli desteklemek amacıyla Nesne Yönelimli VTYS (Object Oriented DBMS - OODBMS) üzerinde çalışmalar yapılmışsa da ciddi sonuçlar elde edilemedi. Bu yüzden sözkonusu sorunları aşmak için şimdilik yapabileceğimiz ancak yöntemin iyileştirilmesi olacaktır. Bu amaçla ilişkisel veritabanı ile nesneler arasında bağlantı kurma ve eşleştirme yapma yöntemi olarak bilinen <b>Nesne/İlişkisel Eşleme (O/R Mapping-ORM)</b> modeli kullanılır. Bu model, uygulamaların iş katmanında kod yazımını kısaltarak veritabanı işlemlerinin daha kısa sürede geliştirilmesini, veritabanı işlemlerinde OOP yeteneklerinin kullanılmasını sağlar ve sonuçta yazılım bakımını kolaylaştırır. Bu cümleleri biraz daha detaylandıralım.</p>
<p>ORM yöntemi, en çok tercih ettiğimiz nesne odaklı programlama modeli ile ilişkisel veritabanı modeli arasında ilişki kurup ilişkisel veritabanındaki öğelerin, nesne odaklı dildeki nesnelere nasıl karşılık geleceğini yönetir. Tabloları sınıflara (class), satırları nesnelere (instance), kolonları bu nesnelerin özniteliklerine (attribute) bağlar, oluşturulan sınıf yordamları, tablo seviyesinde, nesne yordamları da satır seviyesinde işlemler yapmak için kullanılır. Böylece verileri sorgularken, güncellerken, eklerken, silerken nesnesel ifadeler kullanmamıza olanak tanır. VTYS tarafındaki öğelere karşılık gelen uygulama nesnelerine <b>alan nesnesi (domain object)</b> denilir. Bu kalıcı sınıflar, uygulama tarafında, <b>veri erişim katmanı (persistence layer)</b> olarak isimlendirilen alanda yaşar.</p>
<p>Bir anlamda uygulamayı, veritabanından soyutlamış olan ORM yaklaşımı, veri işleme katmanını daha hızlı oluşturmamızı, veritabanı işlemlerinde daha az SQL kodu yazmamızı ama bununla birlikte verileri en az SQL kadar güçlü bir yöntemle sorgulamamızı ve performans açısından otomatik ön bellekleme yapılmasını sağlar. Ayrıca veritabanı şemasında yapılan bir değişiklikte (<i>veri erişim katmanındaki sınıflar doğrudan veritabanına bağlı olmadığı için</i>) veri erişim kodlarını gözden geçirmek yerine daha önce oluşturulmuş olan xml tabanlı nesne-tablo eşleştirme dosyasının düzenlenmesi yeterli olacaktır. </p>
<p>O/R Mapping yönteminde kullanılmak üzere birçok araç geliştirilmiştir bunların en popüleri ilk olarak Java platformu için çıkarılmış ama daha sonra .NET sürümü de geliştirilmiş olan açık kaynak <b>NHibernate</b> ürünüdür (<a href="http://www.hibernate.org" target="_blank">www.hibernate.org</a>). Bunun dışında başta <b>LLBLGen</b> ürünü olmak üzere .NET platformunda kullanılacak birçok O/R Mapping aracı bulunmaktadır. Günümüzde birçok yazılım evi, uygulamalara ait ORM kodu üreten framework&#8217;ler geliştirmiştir. Bu araçlar kullanılarak sorgulama cümleleri elle yazılmak yerine otomatik olarak üretilir ve veri erişim katmanı kısa sürede oluşturulmuş olur. Dolayısıyla yazılım mühendisinin veri erişim ve sorgulama için ayıracağı kodlama zamanını iş katmanındaki algoritmaya ayırması, o alana odaklanması, veri erişim katmanını düşünmemesi sağlanmış olur.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_2.jpg"></p>
<p>Bir diğer konu da ugulamalar içerisinde veritabanı işlemleriyle ilgili kodların çalıştırılma yönteminin ne olacağıdır. Bu yöntemin ne olacağı yazılım uzmanları arasında birçok tartışma konusu olmuştur. .NET Framework&#8217;ün ilk sürümlerinde iş katmanında dinamik SQL yerine SQL yordamlarının (stored procedure) kullanılması tavsiye edilmiştir. Bu yöntemin daha fazla güvenlik ve hız kazandırdığı dile getirildi. Ancak günümüzde bu yöntemin güvenli olduğu kabul edilse de performans ve kullanım konusunda fikir birliği sağlanamamıştır. Stored procedure yerine dinamik SQL kullanılmasını tavsiye edenlerin dayanağı; stored procedure&#8217;lerin versiyonlama, taşınma ve kurulumun kolay olmaması ve büyük ölçekli kurumsal uygulamalarda iş kurallarının genişlemesiyle birlikte yönetimi ve bakımı zorlaşacak çok sayıda procedure yazmak zorunda kalınmasıdır. Aslında asıl sorun iş katmanı ve veri katmanı sınırlarının iç içe geçmesi ve ilk paragraflarda bahsettiğimiz gibi uygulama geliştiricinin veri katmanında çok zaman harcamasıdır. Veritabanının doğası gereği görevi veri arama, tarama olduğu için kod güvenliği, matematiksel işlemler, koşula dayalı işlemler gibi ek faaliyetlerle uğraşmaması gerekir. Bununla birlikte farklı türden veritabanı üzerinde çalışma ihtimali olan paket haline getirilecek bir ürün için iş kurallarını stored procedure üzerinde oluşturmak uyarlama sürecini zorlaştıracak, zaman kaybına neden olacaktır. Stored procedure&#8217;lere alternatif olarak dinamik SQL yapısının kullanılması da uygulamayı, veritabanı şemasına bağımlı hale getirecektir. Bu yüzden O/R Mapping yöntemini kullanarak iş katmanını SQL kodlarından temizleyip bu katmanın sadece iş mantığı algoritmasını içermesini ve uygulama geliştiricinin de sadece o katmana odaklanmasını, T-SQL ile boğuşmak yerine sadece OOP destekli dil ile işlemlerini yürütmesi sağlanmalıdır. ORM yöntemini tercih ettiğimizde aşağıdaki gibi bir T-SQL cümlesi veya stored procedure yerine</p>
<pre name="code" class="sql">UPDATE Musteri SET AdSoyad='Murat Şensoy'
WHERE MusteriId = 10</pre>
<p>aşağıdaki gibi bir kod yazmış olacağız.</p>
<pre name="code" class="c#">Musteri.AdSoyad = "Murat Şensoy"
oRm.Save(Musteri)</pre>
<p>Görüldüğü gibi CRUD (<i>create, read, update, delete</i>) işlemlerini OOP kurallarına göre yazmış oluyoruz. Böylece iş katmanını kodlayan yazılımcının yöntem alışkanlığı bozulmamış olmaktadır.</p>
<p>O/R Mapping modelinin geliştirme sürecinde kolaylık sağlamasına karşılık çalışma zamanında klasik yöntemle kıyaslandığında performans konusunda yeterince iyi olduğunu söyleyemeyiz. Bunun nedenlerini şu şekilde sıralayabiliriz:</p>
<ul>
<li>ORM, uygulama mimarisine veri erişim isminde yeni bir katman ekler.</li>
<li>Veri katmanı, veritabanına doğrudan erişemez.</li>
<li>SQL dilinin kompleks sorgu oluşturma ve çözmedeki gücünden yararlanılmaz.</li>
<li>ORM, uygulamanın veritabanı bağımsız olmasını sağladığı için o anda kullanılan VTYS&#8217;nin yeteneklerinden yararlanılamaz.</li>
</ul>
<p>Sonuç olarak O/R Mapping yönteminin zorunlu bir yöntem olmadığını ancak kompleks iş katmanına sahip büyük ölçekli kurumsal uygulamalarda veri erişim katmanını daha az kodla ve kısa sürede üretmeye yardımcı olduğu ve sonuçta yazılım mühendisinin üzerindeki yükü hafiflettiği için tercih nedeni olabileceğini söyleyebiliriz. Bu yöntemi kullanıp kullanmamak birazcık ta &#8220;<i>uygulama içerisinde klasik veri sorgulama ifadelerini (select, insert, update, delete) SQL ile manual mi oluşturacağız yoksa bunlar otomatik mi oluşturulmalı?</i>&#8221; sorusuna vereceğimiz yanıta bağlıdır.<br />
Tanımını, avantaj ve dejavantajını verdiğimiz ORM yönteminin .NET cephesindeki durumunu inceleyelim.</p>
<p><b><u>ADO.NET Entity Framework</u></b></p>
<p>Microsoft, ADO.NET 2.0 ile birlikte sunduğu <b>ObjectSpaces (OS.Net)</b> ürünüyle O/R Mapping çözümüne ilk adımını atmış oldu. ADO.NET 3.5 ile birlikte ObjectSpaces ürününü yeniden düzenleyerek bu bölümde işleyeceğimiz <b>ADO.NET Entity Framework</b> isimli eklentiyi geliştirerek O/R Mapping alanındaki adımlarını daha da belirginleştirdi. </p>
<p>Entity Framework eklentisi, sadece bir O/R mapping aracı veya bir code generator olmanın ötesinde bunları da içinde barındıran ve uygulama içerisindeki varlıkları ve ilişkilerini sorgulamamızı sağlayan servisler bütünüdür. Entity Framework&#8217;ün servisleri aşağıdaki şekilde gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_3.jpg"></p>
<p>ADO.NET Entity Framework&#8217;ün bir parçası olarak Framework ortamında ER modelinin oluşturulması için <b>Varlık Veri Modeli (Entity Data Model-EDM)</b> isimli konsept sunulmaktadır. EDM&#8217;yi veritabanı şemasını kavramsal ve mantıksal boyutta gösteren ve ilgili ORM haritasını oluşturan bir araç olarak değerlendirebiliriz. EDM, varlıklarla ilgili şemayı XML belgelerinde (CSDL, SSDL, MSL) saklar. Bu üç dosya, Entity Framework&#8217;ün üç temel boyutu olan kavramsal (<i>conceptual</i>), mantıksal (<i>logical</i>) ve haritalama (<i>mapping</i>) modelleriyle ilgili bilgileri içerir.</p>
<p><b>CSDL (Conceptual Schema Definition Language):</b> Varlıkların ve onlara ait ilişkilerin tanımlandığı dosya olup uygulamanın çekirdek veri modelini (core data model) teşkil eder. Uygulama katmanında varlıklar (nesneler), CSDL şeması referans alınarak oluşturulur. Bu şema, kavramsal şema formatına sahiptir.</p>
<p><b>SSDL (Store Schema Definition Language):</b> Veri kaynağı olarak kullanılacak veritabanına ait üstveri (metadata) bilgisini içerir. Mantıksal model için oluşturulan bu dosya, varlıklarla veri kaynağı arasındaki iletişimi kurar.</p>
<p><b>MSL (Mapping Specification Language):</b> CSDL dosyasındaki varlıkları SSDL dosyasında belirtilmiş tablolarla eşleştirir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/ER_Model_4.jpg"></p>
<p><b>Entity Client</b>, <i>SQLClient, OracleClient</i> gibi ADO.NET&#8217;in bir yönetilebilir veri sağlayıcısı (managed provider) olup EDM tarafından tanımlanmış olan veriye erişmeyi sağlar. Diğer sağlayıcılar gibi bunun da <i>EntityCommand, EntityConnection</i> ve <i>EntityTransaction</i> bileşenleri bulunur.</p>
<p>Object Services bileşeni, veri nesneleri üzerinde CRUD (<i>Create, Read, Update, Delete</i>) işlemleri için gerekli sorguları oluşturur. Bu sorgulama servisi, &#8220;Entity SQL&#8221; ve &#8220;LINQ to Entities&#8221; türü sorgulama destekler. <b>Entity SQL (eSQL)</b> ismindeki sorgulama dili, T-SQL&#8217; dilinden türemiş olup EDM modelindeki varlıkları ve aralarındaki ilişkileri sorgulamak için kullanılır. <b>LINQ to Entities</b> bileşeni de daha sonra yazılarda anlatacağımız LINQ teknolojisinin varlıkları sorgulamak için sunduğu bir sağlayıcıdır.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/28/object-relational-mapping-adonet-entity-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL&#8217;de Özet Tarih Tablosu / Date dimension table</title>
		<link>http://www.ahmetkaymaz.com/2008/02/27/sqlde-ozet-tarih-tablosu-date-dimension-table/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/27/sqlde-ozet-tarih-tablosu-date-dimension-table/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 06:40:09 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[C#, VB.NET, ASP.NET]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=232</guid>
		<description><![CDATA[Bu blogda doğrudan yeni teknolojileri anlatmak yerine eski ve yeni teknolojileri gözetmeksizin günlük hayatta, projelerde ihtiyaç duyulan yöntemleri, ipuçlarını, konuları, örnekleri, yazılım geliştirme sürecinde dikkat edilmesi gereken konuları vermeye çalışıyoruz. Yazılım mühendisliğiyle ve C# veya VB.NET programlama dilleriyle ilgili detaylı konuları yakın zamanda çıkacak olan kitaplarımda vermeye çalıştım. Bu küçük yazıda da özellikle veri ambarı [...]]]></description>
			<content:encoded><![CDATA[<p>Bu blogda doğrudan yeni teknolojileri anlatmak yerine eski ve yeni teknolojileri gözetmeksizin günlük hayatta, projelerde ihtiyaç duyulan yöntemleri, ipuçlarını, konuları, örnekleri, yazılım geliştirme sürecinde dikkat edilmesi gereken konuları vermeye çalışıyoruz. Yazılım mühendisliğiyle ve C# veya VB.NET programlama dilleriyle ilgili detaylı konuları yakın zamanda çıkacak olan kitaplarımda vermeye çalıştım. Bu küçük yazıda da özellikle veri ambarı raporlama sistemlerinde işlerimizi kolaylaştıracak Tarih tablosunun içeriğini vereceğiz. &#8220;Date dimension table&#8221; olarak isimlendirilen bu tablo tüm data warehouse sistemlerinde ortak olup sistemin kullanım amacına uygun olarak farklı detaylar içerir. Belli tarih aralığının detaylarını içeren bu tablo çalışma anında tarihsel hesaplamaların neden olacağı performans ve zaman kaybını engeller. Bu tablo aynı zamanda OLTP uygulamalarında lookup olarak ta kullanılabilir.<br />
<span id="more-232"></span></p>
<p>Örnek verdiğimiz aşağıda tabloda bir tarihin, tarih formatı, hafta ve ay bilgisi, haftanın, ayın ve yılın kaçıncı günü olduğu, haftasonuna denk gelip gelmediği gibi bilgiler verilmektedir.</p>
<pre name="code" class="sql">CREATE TABLE L_Tarih(
	Bugun int NOT NULL, --YYYYMMDD formatında tarih. Tablonun primary key'i.
	FormatliBugun char(10) NULL,--DD.MM.YYYY formatında tarih
	GunAd char(10) NULL,
	AyAd char(10) NULL,
	TarihAd varchar(50) NULL,--'10 Aralık 2007 Pazartesi' gibi
	BuYil char(4) NULL,--Sene bilgisi
	BuAy char(6) NULL,--Yıl ve ay bilgisi. YYYYMM
	BuHafta char(6) NULL,--Yıl ve hafta bilgisi. YYYYWW
	Dun char(10) NULL,
	GecenHaftaBugun char(10) NULL,
	GecenAyBugun char(10) NULL,
	GecenYil char(4) NULL,
	GecenYilBugun char(10) NULL,
	GecenYilBuHafta char(6) NULL,
	GecenYilBuAy char(6) NULL,
	HaftaIlkGun char(10) NULL,--Bugünün bulunduğu haftanın başı
	HaftaSonGun char(10) NULL,--Bugünün bulunduğu haftanın sonu
	AyIlkGun char(10) NULL,
	AySonGun char(10) NULL,
	HaftaGunNo int NULL,--Haftanın kaçıncı günü
	AyGunNo int NULL,--Ayın kaçıncı günü
	YilGunNo int,--Yılın kaçıncı günü
	AyGunSayi int NULL,
	YilIlkGun char(10) NULL,
	YilSonGun char(10) NULL,
	HaftaSonu bit NULL--Haftasonu olup olmadığını belirtir
)</pre>
<p>Şeması bu şekilde olan tabloya aşağıdaki script&#8217;i çalıştırarak iki tarih aralığındaki tarih detaylarını yazdıralım.</p>
<pre name="code" class="sql">DECLARE @IlkTarih DATETIME
DECLARE @SonTarih DATETIME

SET @IlkTarih = '01-01-2007'
SET @SonTarih = '31-12-2008'

DECLARE @Bugun INT, @FormatliBugun CHAR(10), @GunAd CHAR(10), @AyAd CHAR(10),
	@TarihAd VARCHAR(50), @BuYil CHAR(4), @BuAy CHAR(6), @BuHafta CHAR(6),
	@Dun CHAR(10), @GecenHaftaBugun CHAR(10), @GecenAyBugun CHAR(10),
	@GecenYil CHAR(4), @GecenYilBugun CHAR(10),@GecenYilBuHafta CHAR(6),
	@GecenYilBuAy CHAR(6),@HaftaGunNo INT, @AyGunNo INT,@YilGunNo INT,
	@HaftaIlkGun CHAR(10), @HaftaSonGun CHAR(10),@AyGunSayi INT,
	@AyIlkGun CHAR(10), @AySonGun CHAR(10), @YilIlkGun CHAR(10),
	@YilSonGun CHAR(10), @HaftaSonu BIT

WHILE @IlkTarih <= @SonTarih
BEGIN
	SET @Bugun=CONVERT(VARCHAR(8), @IlkTarih, 112)
	SET @FormatliBugun=CONVERT(VARCHAR(10), @IlkTarih, 104)
	SET @GunAd=DATENAME(dw, @IlkTarih)
	SET @AyAd=DATENAME(mm, @IlkTarih)
	SET @TarihAd=CAST(DATEPART(dd, @IlkTarih) AS CHAR(2)) +' '+ DATENAME(mm, @IlkTarih) + ' '
			+ CAST(DATEPART(yy, @IlkTarih) AS CHAR(4))+' '+ @GunAd
	SET @BuYil=DATENAME(yy, @IlkTarih)
	SET @BuAy=LEFT(@Bugun,6)
	SET @BuHafta=CAST(DATEPART(ww, @IlkTarih) as CHAR(2))
	--Tek hane ise başına "0" ekleyelim
	SET @BuHafta=@BuYil+REPLICATE('0', 2 - LEN(@BuHafta))+@BuHafta
	SET @Dun= CONVERT(VARCHAR(8),DATEADD(dd,-1, @IlkTarih),112)
	SET @GecenHaftaBugun=CONVERT(VARCHAR(8),DATEADD(dd,-7, @IlkTarih),112)
	SET @GecenAyBugun=CONVERT(VARCHAR(8),DATEADD(mm,-1, @IlkTarih),112)
	SET @GecenYil=CONVERT(VARCHAR(8),DATEADD(yy,-1, @IlkTarih),112)
	SET @GecenYilBugun=CONVERT(VARCHAR(8),DATEADD(dd,-365, @IlkTarih),112)
	SET @GecenYilBuHafta=CAST(DATEPART(ww, @GecenYilBugun) as CHAR(2))
	--Tek hane ise başına "0" ekleyelim
	SET @GecenYilBuHafta=@GecenYil+REPLICATE('0', 2 - LEN(@GecenYilBuHafta))+@GecenYilBuHafta
	SET @GecenYilBuAy=LEFT(@GecenYilBugun,6)
	--Tarihin bulunduğu haftanın ilk günü
	SET @HaftaIlkGun=CONVERT(VARCHAR(8),DATEADD(dd,-(DATEPART(dw, @IlkTarih) - 1),@IlkTarih),112)
	--Tarihin bulunduğu haftanın son günü
	SET @HaftaSonGun=CONVERT(VARCHAR(8),DATEADD(dd,-(DATEPART(dw, @IlkTarih) - 7),@IlkTarih),112)
	--Ayın ilk günü
	SET @AyIlkGun=@BuAy+'01'
	--Ayın son günü
	SET @AySonGun=CONVERT(VARCHAR(8),DATEADD(d, -DAY(DATEADD(m,1,@IlkTarih)),DATEADD(m,1,@IlkTarih)),112)
	SET @YilIlkGun=@BuYil+'0101'
	SET @YilSonGun=@BuYil+'0131'
	--Ayın kaç gün olduğunu hesaplayalım
	SET @AyGunSayi=DAY(DATEADD(d, -DAY(DATEADD(m,1,@IlkTarih)),DATEADD(m,1,@IlkTarih)))
	--Tarihin haftanın kaçıncı günü olduğunu hesaplayalım
	SET @HaftaGunNo=DATEPART(dw , @IlkTarih)
	--Tarihin ayın kaçıncı günü olduğunu hesaplayalım
	SET @AyGunNo=DATEPART(day , @IlkTarih)
	--Tarihin yılın kaçıncı günü olduğunu hesaplayalım
	SET @YilGunNo=DATEPART(dy , @IlkTarih)

	--Tarihin haftasonu olup olmadığını bulalım
	SET @HaftaSonu= CASE WHEN @HaftaGunNo IN (6,7) THEN 1 ELSE 0 END

	--Elde ettiğimiz bilgileri lookup tablosuna aktaralım
	INSERT L_Tarih (Bugun, FormatliBugun, GunAd, AyAd, TarihAd,
			BuYil,BuAy,BuHafta,Dun,GecenHaftaBugun,GecenAyBugun,
			GecenYil,GecenYilBugun,GecenYilBuHafta,GecenYilBuAy,
			HaftaIlkGun,HaftaSonGun,AyIlkGun,AySonGun,HaftaGunNo,
			AyGunNo,YilGunNo,AyGunSayi,YilIlkGun,YilSonGun,HaftaSonu)
	VALUES(@Bugun, @FormatliBugun, @GunAd, @AyAd, @TarihAd,
			@BuYil,@BuAy,@BuHafta,@Dun,@GecenHaftaBugun,@GecenAyBugun,
			@GecenYil,@GecenYilBugun,@GecenYilBuHafta,@GecenYilBuAy,
			@HaftaIlkGun,@HaftaSonGun,@AyIlkGun,@AySonGun,@HaftaGunNo,
			@AyGunNo,@YilGunNo,@AyGunSayi,@YilIlkGun,@YilSonGun,@HaftaSonu)

	--Döngü içerisinde bir sonraki güne geçelim
	SET @IlkTarih = DATEADD(dd, 1, @IlkTarih)
END</pre>
<p>Bu scriptleri dili Türkçe olan bir kullanıcıyla çalıştırdığımızda tarih tablosu Türkçe formatına göre oluşturulur. L_Tarih tablosuna 2007 ve 2008 yıllarına ait tarih bilgileri eklenmiş olur.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Tarih_Lookup_Tablosu.jpg"></p>
<p>Bu tablo üzerinde bazı sorgular çalıştıralım. 2008 yılında hangi günden kaç adet bulunduğunu sorgulayalım.</p>
<pre name="code" class="sql">SELECT Max(HaftaGunNo) [Gün Numarası],GunAd [Gün Adı], COUNT(*) Adet
FROM L_Tarih WHERE BuYil = 2008
GROUP BY GunAd ORDER BY 1</pre>
<table>
<tr>
<td><b>Gün Numarası</b></td>
<td><b>Gün Adı</b></td>
<td><b>Adet</b></td>
</tr>
<tr>
<td>1</td>
<td>Pazartesi</td>
<td>52</td>
</tr>
<tr>
<td>2</td>
<td>Salı</td>
<td>53</td>
</tr>
<tr>
<td>3</td>
<td>Çarşamba</td>
<td>53</td>
</tr>
<tr>
<td>4</td>
<td>Perşembe</td>
<td>52</td>
</tr>
<tr>
<td>5</td>
<td>Cuma</td>
<td>52</td>
</tr>
<tr>
<td>6</td>
<td>Cumartesi</td>
<td>52</td>
</tr>
<tr>
<td>7</td>
<td>Pazar</td>
<td>52</td>
</tr>
</table>
<p>Görüldüğü gibi 2008 yılında 53 adet Salı ve Çarşamba günü bulunmaktadır. Aynı şekilde 2008 yılında ayların kaçar güne sahip olduğunu sorgulayalım.</p>
<pre name="code" class="sql">SELECT BuAy [Ay], Max(AyAd) [Ay Adı], COUNT(Bugun) [Gün Sayısı]
FROM L_Tarih WHERE BuYil = 2008
GROUP BY BuAy ORDER BY 1</pre>
<table>
<tr>
<td><b>Ay</b></td>
<td><b>Ay Adı</b></td>
<td><b>Gün Sayısı</b></td>
</tr>
<tr>
<td>200801</td>
<td>Ocak</td>
<td>31</td>
</tr>
<tr>
<td>200802</td>
<td>Şubat</td>
<td>29</td>
</tr>
<tr>
<td>200803</td>
<td>Mart</td>
<td>31</td>
</tr>
<tr>
<td>200804</td>
<td>Nisan</td>
<td>30</td>
</tr>
<tr>
<td>200805</td>
<td>Mayıs</td>
<td>31</td>
</tr>
<tr>
<td>200806</td>
<td>Haziran</td>
<td>30</td>
</tr>
<tr>
<td>200807</td>
<td>Temmuz</td>
<td>31</td>
</tr>
<tr>
<td>200808</td>
<td>Ağustos</td>
<td>31</td>
</tr>
<tr>
<td>200809</td>
<td>Eylül</td>
<td>30</td>
</tr>
<tr>
<td>200810</td>
<td>Ekim</td>
<td>31</td>
</tr>
<tr>
<td>200811</td>
<td>Kasım</td>
<td>30</td>
</tr>
<tr>
<td>200812</td>
<td>Aralık</td>
<td>31</td>
</tr>
</table>
<p>Bu tür tablolar OLAP uygulamalarında özetleme seviyeleri olarak kullanılır. Örneğin özellikle reel büyüme değerleri için haftalık, aylık, yıllık karşılaştırmalar herhangi bir tarih hesaplaması yapılmadan kolayca buradaki veriler kullanılabilir. Örneğin satış, sipatiş tablolarıyla JOIN edilerek farklı zaman dilimine göre satış veya sipariş analizleri yapılabilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/27/sqlde-ozet-tarih-tablosu-date-dimension-table/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server&#8217;da FTP ve e-Mail İşlemi</title>
		<link>http://www.ahmetkaymaz.com/2008/02/20/sql-serverda-ftp-mail-gonderme/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/20/sql-serverda-ftp-mail-gonderme/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 13:16:32 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=230</guid>
		<description><![CDATA[SQL Server üzerinde otomatik sorgular hazırlayıp sorgu sonuçlarını raporla ilgili kişilere mail olarak atmak veya ftp aracılığıyla belirlenmiş bir alana aktarmak özellikle kurumsal uygulamalarda ihtiyaç duyulan bir durumdur. Bu yazıda SQL Server üzerinde mail ve ftp işlemi nasıl yapılacağını örneklendireceğiz.
FTP ile dosya alma veya gönderme
Ne yazık ki T-SQL aracılığıyla doğrudan ftp işlemini yönetilememektedir. Bu işlemi [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server üzerinde otomatik sorgular hazırlayıp sorgu sonuçlarını raporla ilgili kişilere mail olarak atmak veya ftp aracılığıyla belirlenmiş bir alana aktarmak özellikle kurumsal uygulamalarda ihtiyaç duyulan bir durumdur. Bu yazıda SQL Server üzerinde mail ve ftp işlemi nasıl yapılacağını örneklendireceğiz.<span id="more-230"></span></p>
<p><u><b>FTP ile dosya alma veya gönderme</b></u></p>
<p>Ne yazık ki T-SQL aracılığıyla doğrudan ftp işlemini yönetilememektedir. Bu işlemi yapabilmek için T-SQL&#8217;in Ms-Dos Komut istemine komut gönderen harici <b>master..xp_cmdshell</b> yordamı kullanılır. Bu yordam iki parametre alır, ilk parametre işletim sistemi tarafından yürütülecek komutu, ikinci parametre ise yürütme sonucunda istemciye herhangi bir dönüş mesajının döndürülüp döndürülmeyeceğini belirtir.</p>
<p><i>xp_cmdshell {&#8217;command_string&#8217;} [, no_output]</i></p>
<p>FTP işlemi nihayetine System32 klasörünün altında bulunan FTP.EXE aracılığıyla yapıldığı için bu xp_cmdshell yordamına ftp.exe komutunu parametre olarak göndermemiz yeterli olacaktır. Peki FTP için gerekli güvenlik ve dosya bilgileri nasıl gönderilecek. Bunun en güzel çözümü ftp komutlarının harici bir dosyaya yazılması ve bu dosyasının FTP.EXE programına &#8220;-s&#8221; parametresiyle gönderilmesidir. C:\FtpIslem.txt dosyası oluşturup aşağıdaki gibi sunucu bilgilerini ve sunucu üzerinde çalıştırılacak (put, push) komutları yazıyoruz.</p>
<p><code>open ftp.ahmetkaymaz.com -> <i>Sunucu Adı</i><br />
admin -> <i>Kullanıcı Adı</i><br />
123 -> <i>Şifre</i><br />
cd /Blog/Upload/Image/ -> <i>Logon olduktan sonra konumlanacak klasör</i><br />
put C:\Resim1.jpg -> <i>İstemcideki dosyayı sunucuya gönder</i><br />
quit -><i>Çıkış komutu</i></code></p>
<p>Şimdi Query Analyzer tarafına geçip aşağıdaki gibi T-SQL komutunu çalıştıralım.</p>
<pre name="code" class="sql">EXEC master..xp_cmdshell "ftp -s:C:\FtpIslem.txt"</pre>
<p>İhtiyaç duyulduğu durumda bu yordamın sonucu bir tabloya da aktarılabilir. Bunun için aşağıdaki gibi procedure çalıştırılır ve sonuçlar geçici veya kalıcı bir tabloya aktarılır.</p>
<pre name="code" class="sql">CREATE TABLE Sonuc (SatirId int identity(1,1), Aciklama varchar(100))
INSERT Sonuc
EXEC master..xp_cmdshell "FTP -s:C:\FtpIslem.txt"</pre>
<p>Eğer FTP işlemini DTS içerisinde yapmak istersek DTS, download işlemi için hazır bir nesne sunar.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_1.jpg" /></p>
<p>FTP Task nesnesini kullanarak güvenlik bilgilerini ve karşıdan hangi dosyanın indirileceği seçilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_2.jpg" /></p>
<p>DTS içerisinde FTP tabanlı upload işlemi için yine xp_cmdshell yordamı kullanılır. DTS tasarım ekranındaki &#8220;Execute Process Task&#8221; aracı kullanılarak FTP.EXE&#8217;nin çalıştırılması sağlanır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_3.jpg" /></p>
<p>SQL Server 2005 ile birlikte DTS&#8217;lerin yerini almış olan SQL Server Integration Services (SSIS) aracılığıyla FTP işlemini gerçekleştirmek için daha da kolaylaştırıldı. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_4.jpg" /></p>
<p>&#8220;FTP Task&#8221; aracı hem dosya gönderme hem de alma işlemini sağlar. Öncelikle bu işlem için bir &#8220;FTP Connection&#8221; nesnesi tanımlanır. Bu nesnenin özelliklerine ftp güvenlik bilgileri girilir. Ardından aynı şekilde &#8220;FTP Task Editor&#8221; aracında ne tür bir işlemin yapılacağı girilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_5.jpg" /></p>
<p>Uzaktaki dosyaların yereldeki hangi klasöre yükleneceği ve yereldeki hangi dosyaların sunucuya gönderileceği &#8220;File Connection Manager Editor&#8221; aracılığıyla tanımlanır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_FTP_6.jpg" /></p>
<p><u><b>SQL Server üzerinde mail işlemi</b></u></p>
<p>SQL Server üzerinde mail göndermek veya okumak için kurulumla birlikte standart olarak gelen SQL Mail aracı veya third party bir araç kullanılabilir. SQL Mail aracı, mail almak ve göndermek için aşağıdaki yordamlar tarafından kullanılan bir T-SQL arabirimi sunar.<br />
xp_startmail<br />
xp_sendmail<br />
xp_findnextmsg<br />
xp_readmail<br />
xp_deletemail<br />
sp_processmail<br />
xp_stopmail</p>
<p>Bu yordamlar harici yordamlar olup sqlmap.dll bileşeni içerisinde bulunur. SQL Mail, MAPI (Messaging Application Programming Interface) tabanlı bir uygulama olup bulunduğu sunucunun MAPI uyumlu bir istemci olarak yapılandırılmasını ister. </p>
<p>SQL Mail servisini başlatmak için sunucu üzerinde bu işlemler için kullanılanacak e-mail adresiyle ilişkili bir mail profilinin oluşturulması gerekir. Sunucu üzerindeki profil oluşturmak veya var olan profilleri düzeltmek için Denetim Masası&#8217;ndaki (Control Panel) Mail ikonu kullanılır. Bu ikon Microsoft Outlook ile birlikte oluşturulur. Ardından Enterprise Manager içinde sunucunun altındaki Support Services bölümünden SQL Mail çift tıklanarak varolan profillerden biri seçilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_Mail_1.jpg" /></p>
<p>Aynı şekilde SQL Agent aracının Properties bölümünden agent&#8217;in ilişkili olacağı profil de seçilir. Böylece SQL Server üzerinde otomatik olarak işlenen Job&#8217;ların sonucuna dair ilgili profil üzerinde ilgili kişilere mail atılabilir. SQL Mail, SQL Agent servisi başladığında otomatik olarak başlatılır. Veya SQL Mail oturumunu manual başlatmak için <b>xp_startmail</b> yordamı kullanılır. Burada dikkat edilmesi gereken konu SQL Mail içerisinde mevcut profillerin doğru görüntülenmesi için SQL Server ve SQL Agent servisinin bir domain veya local account ile başlatılması gerekir. Mevcut bir profili test etmek için SQL Mail&#8217;in Properties menüsü kullanılabileceği gibi <b>master.dbo.xp_test_mapi_profile</b> yordamı da kullanılabilir. Test işlemleri başarılı olduktan sonra xp_sendmail yordamını kullanarak bir mailing denemesi yapabiliriz.</p>
<pre name="code" class="sql">EXEC xp_sendmail @recipients='ahmet.kaymaz@ahmetkaymaz.com;blog@ahmetkaymaz.com', @subject='ALISVERIS veritabanı yedeği başarıyla alındı.'</pre>
<p><b>xp_sendmail</b> yordamı birçok parametreye sahiptir. SQL Mail&#8217;i kullandığımız diğer alan ise SQL Server üzerinde tanımlı operatörlerdir. SQL Agent&#8217;in çalıştırdığı Job&#8217;ların sonucunu operatörleri bildirmek için SQL Mail alt yapısı kullanılır. SQL Server Agent bölümünün altındaki Operators alanında bir operatör tanımlayalım. Operatör için e-mail adresi, cep telefonu gibi bilgiler girilir. Aşağıdaki şekilde </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_Mail_3.jpg" /></p>
<p>Outlook Express mail profili oluşturmayı desteklemediği için SQL Mail için kullanılamaz. SQL Mail 2000 için en az Microsoft Outlook 98 veya 2000 sürümlerinin istemci olarak kullanılıyor olması lazım. Bununla birlikte SQL Mail, Lotus Notes veya Novell Groupwise gibi third-party sunucularla birlikte de kullanılabilir. </p>
<p>xp_sendmail yordamının SQL Server 2005&#8242;ten sonraki sürümlerde kaldırılması muhtemel. Bu yüzden SQL Server 2005 ile birlikte gelmiş olan <b>Database Mail</b> servisinin kullanılması tavsiye edilir.</p>
<p>Görüldüğü gibi SQL Mail bileşeni biraz uğraştırıcı ve yönetimi zor bir hizmet sunmaktadır. Ayrıca SQL Mail ile halıhazırda HTML formatında mail de atılamamaktadır. Başka bir alternatif ise SQL Mail kullanmadan yine Microsoft ürünü olan <b>CDO for NT Server (CDONTS)</b> veya <b>CDO for Windows 2000 (CDOSYS)</b> bileşenlerini kullanmaktır. Bu bileşenler sp_OA (SQL Server OLE Automation) stored procedure&#8217;leri aracılığıyla T-SQL içerisinde kullanılabilir. Bu bileşenler özellikler web tabanlı uygulamalarda mail atmak için tercih edilen basit SMTP bileşenleridir. Microsoft Internet Information Server (IIS) 4.0 ve üstü versiyonlar varsayılan olarak CDONTS bileşenini install eder. Aşağıdaki T-SQL yordamda CDONTS nesnesi yaratılmış ve Send() yordamına parametreler set edilmiştir.</p>
<pre name="code" class="sql">CREATE PROCEDURE xp_CDOMailGonder(
	@Kimden varchar(100),
	@Kime varchar(255),
	@Baslik varchar(255),
	@Mesaj varchar(500)
) AS

DECLARE @Obj int, @OLESonuc int

--CDONTS.NewMail nesnesini oluşturalım
EXECUTE @OLESonuc = sp_OACreate 'CDONTS.NewMail', @Obj OUT

--Nesnenin Send yordamını çağıralım
execute @OLESonuc = sp_OAMethod @Obj, 'Send', Null, @Kimden, @Kime, @Baslik, @Mesaj, 0

--Destroy CDO nesnesini yok edelim
EXECUTE @OLESonuc = sp_OADestroy @Obj

return @OLESonuc</pre>
<p>Bu yordamı çağıralım.</p>
<pre name="code" class="sql">xp_CDOMailGonder 'ahmet.kaymaz@ahmetkaymaz.com','mehmet@hotmail.com','Başlık','Açıklama'</pre>
<p>SQL Mail yerine CDONTS bileşenini kullandığımızda Microsoft Outlook gibi mail istemciye ve Microsoft Exchange sunucusuna ihtiyacımız olmayacaktır. Fakat SQL Mail gibi herhangi bir profilin bağlı olduğu mail hesabına ait mailler okunamaz. SQL Mail&#8217;de mailleri okumak için <b>xp_readmail</b> yordamı kullanılır. Ayrıca CDONTS.NewMail yalnızca local smtp sunucuları destekler uzataki bir SMTP sunucusunu relay olarak kullanamayız. Son olarak Windows Server 2003 ve üstü işlem sistemlerinde CDONTS bileşeninin desteklenmeyeceğini göz önünde bulundurmalıyız.</p>
<pre name="code" class="sql">CREATE PROCEDURE xp_CDOSYSMailGonder
	@Kimden  varchar(500) ,
	@Kime varchar(500) ,
	@Baslik varchar(500),
	@Mesaj varchar(4000) ,
	@SmtpSunucu varchar(25),
	@MesajTip varchar(10)
as
declare @Obj int
declare @OLESonuc int
declare @source varchar(255)
declare @description varchar(500)
declare @output varchar(1000)

exec @OLESonuc = sp_OACreate 'CDO.Message', @Obj out
exec @OLESonuc = sp_OASetProperty @Obj,
'configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").value','2'

exec @OLESonuc = sp_OASetProperty @Obj,
  'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").value',
  @SmtpSunucu 

exec @OLESonuc = sp_OAMethod @Obj, 'configuration.fields.update', null
exec @OLESonuc = sp_OASetProperty @Obj, 'to', @Kime
exec @OLESonuc = sp_OASetProperty @Obj, 'from', @Kimden
exec @OLESonuc = sp_OASetProperty @Obj, 'subject', @Baslik

-- Html e-mail için 'htmlbody' düz metin için 'textbody' özelliği kullanılır

exec @OLESonuc = sp_OASetProperty @Obj, @MesajTip, @Mesaj
exec @OLESonuc = sp_OAMethod @Obj, 'send', null

exec @OLESonuc = sp_oadestroy @Obj</pre>
<p>Bu stored procedure&#8217;i çağıralım.</p>
<pre name="code" class="sql">exec xp_CDOSYSMailGonder
	@Kimden='ahmet.kaymaz@ahmetkaymaz.com',
	@Kime ='sqlblog@ahmetkaymaz.com',
	@Baslik ='Yeni Mail',
	@Mesaj ='<font color=blue>HTML formatında mail.</font>',
	@SmtpSunucu ='192.1.1.120',
	@MesajTip ='HTMLBody'</pre>
<p>Son iki yöntemin özelliği Microsoft&#8217;a ait SMTP bileşenlerini kullanıyor olmamızdır. Bilindiği gibi dışarıdan herhangi bir bileşeni T-SQL içerisinde kullanmak için sp_OAXXX yordamları kullanılır. Bu yordamları kullanarak nesne oluşturulur ve nesnelerin yordam ve özellikleri dışarıdan çağrılabilir. Dolayısıyla yine bu yordamları kullanarak sadece CDONTS veya CDOSYS bileşenlerini kullanmak zorunda değiliz herhangi başka bir SMTP componentini de kullanabiliriz. Bu noktada kişisel olarak uygulamalarda bu iki nesneden kaçınarak <a href="http://www.sqldev.net/xp/xpsmtp.htm">http://www.sqldev.net/xp/xpsmtp.htm</a> sitesinden indirilebilecek olan XPSMTP.DLL - SQL Server SMTP Mail XP bileşenini tercih ediyorum. Sqldev sitesinden indirilecek olan <b>XPSMTP80.DLL</b><br />
dosyası sunucuya register edilir. Register işleminden sonra ilgili database altında <b>xp_smtp_sendmail</b> yordamı oluşturulur. Sitede anlatılan parametreleri kullanarak kolayca mailing işlemi yapılabilir.</p>
<p>SQL Server üzerinde mail atmak için kullanılabilecek diğer bileşen de bir çok yazılımcının özellikle web uygulamalarında tercih ettiği <a href="http://dimac.net/">JMAIL</a> componentidir. Bu componentin sınıf yapısı http://dimac.net/ adresinden öğrenbilebilir. JMAIL&#8217;in kullanımı da örneklendirelim.</p>
<pre name="code" class="sql">CREATE PROCEDURE xp_JMailMailGonder
	@Kimden varchar(255),
	@Kime varchar(255),
	@Attachment varchar(255) = '', -- Attach edilecek dosyanın konumu
	@Baslik varchar(255),
	@Mesaj varchar(1000),
	@MesajDosya varchar(1000) = '', -- Mailin içeriğinin bulunduğu dosya
	@SmtpSunucu varchar(100)
as

DECLARE @Obj int
DECLARE @Sonuc int
DECLARE @Sonuc1 int
DECLARE @Sonuc2 varchar(255)

EXEC @Sonuc = sp_OACreate 'jmail.Message', @Obj out

EXEC @Sonuc = sp_OAMethod @Obj, 'AddHeader', NULL, 'App-Sender',@Kimden

EXEC @Sonuc = sp_OASetProperty @Obj, 'From', @Kimden

EXEC @Sonuc = sp_OAMethod @Obj, 'AddRecipient', NULL, @Kime,''
--Son parametre gönderilen kişinin adını belirtir

IF @Attachment <> ''
	BEGIN
		EXEC @Sonuc = sp_OAMethod @Obj, 'AddAttachment', @Sonuc1 out, @Attachment, TRUE
	END

EXEC @Sonuc = sp_OASetProperty @Obj, 'Subject', @Baslik

IF @MesajDosya <> ''
	BEGIN
		EXEC @Sonuc = sp_OAMethod @Obj, 'AppENDBodyFromFile', NULL, @MesajDosya
	END
ELSE
	BEGIN
		EXEC @Sonuc = sp_OASetProperty @Obj, 'Body', @Mesaj
	END

EXEC @Sonuc = sp_OASetProperty @Obj, 'ContentType', 'text/html'

EXEC @Sonuc = sp_OASetProperty @Obj, 'Charset', 'ISO-8859-9'

EXEC @Sonuc = sp_OAMethod @obj, 'SEND', @Sonuc2 out, @SmtpSunucu

RETURN 0</pre>
<p>Bu yordam her EXEC satırından @Sonuc değişkeninin &#8220;IF @Sonuc <> 0 RETURN 1&#8243; şeklinde bir kontrol eklenerek o satırın hata döndürmediği kontrol edilebilir. Sonuçta eğer procedure 1 döndürürse hata oluştuğu 0 döndürürse işlemin başarı olduğu anlamına gelir. Yordamı aşağıdaki gibi kullanabiliriz.</p>
<p><u><b>SQL Server 2005 Database Mail</b></u></p>
<p>Yazının girişinde SQL Mail özelliğinin SQL Server 2005&#8242;ten sonraki sürümlerde kaldırılacağını bunun yerine Database Mail aracının geliştirildiğini söylemiştik. Database Mail, SQL Mail gibi herhangi bir Outlook veya Exchange Server&#8217;e ihtiyaç duymadan sunucu üzerinden mail atmamıza sağlar. Aynı zamanda birden fazla SMTP sunucuyu da parametre olarak kabul eder. Management Studio içerisinde bağlı olunan sunucuda Management bölümünün altında Database Mail aracını sağ tıklayıp yapılandırmaya başlayabiliriz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_Mail_4.jpg" /></p>
<p>&#8220;Database Mail Configuration Wizard&#8221; aracının ilk ekranında profil yönetimi sunulur. Bu ekranda yeni bir profil oluşturulabilir veya var olan profiller düzenlenebilir. Profil altında bir veya daha fazla mail hesabı tanımlaması yapılır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_Mail_5.jpg" /></p>
<p>Yapılan ayarların doğru çalışıp çalışmadığını da Database Mail aracını sağ tıklayarak test edebiliriz. SQL Agent servisini oluşturulmuş olan profillerle ilişkilendirebiliriz. Böylece Job&#8217;ların başarılı veya başarısız olması durumunda profildeki kişi veya kişiler haberdar edilir. SQL Agent&#8217;in bilgilendirme ayarları için servisi sağlayıp Properties penceresine girelim.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Server_Mail_6.jpg" /></p>
<p>T-SQL içerisinde Database Mail ile ilgili kullanılabilecek başlıca yordamlar şunlardır;<br />
sp_send_dbmail<br />
sysmail_add_account_sp<br />
sysmail_add_profile_sp<br />
sysmail_delete_account_sp<br />
sysmail_delete_profile_sp<br />
sysmail_start_sp<br />
sysmail_stop_sp</p>
<p>Bu yordamlar msdb veritabanının altında bulunmaktadır. Örneğin aşağıdaki script Ahmet Kaymaz profilini kullanarak listedeki kişilere mail atar.</p>
<pre name="code" class="sql">EXEC msdb.dbo.sp_send_dbmail
	@recipients=N'ahmet@ahmetkaymaz.com',
	@subject = 'Mail başlığı',
	@body= 'Mailin içeriği',
	@profile_name = 'Ahmet Kaymaz'</pre>
<p>Gönderilmiş olan mailler msdb.dbo.sysmail_allitems tablosunda tutular.</p>
<p>SQL Server 2005&#8242;te SQL Mail ve Database Mail özellikleri varsayılan olarak kapalı durumdadır. Bunları &#8220;SQL Server Surface Area Configuration&#8221; aracını kullanarak enable edebiliriz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/20/sql-serverda-ftp-mail-gonderme/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;8. Öfkeli Adam&#8221; Olabilmek</title>
		<link>http://www.ahmetkaymaz.com/2008/02/11/12-ofkeli-adam-12-angry-men/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/11/12-ofkeli-adam-12-angry-men/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 21:17:52 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[Günlük Yaşam]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=228</guid>
		<description><![CDATA[12 Angry Men / 12 Öfkeli Adam

 12 Angry Men, Sidney Lumet tarafından yönetilmiş ve görünürde Henry Fonda&#8217;nın başrolde oynadığı 1957 yapımı bir kült filmdir. &#8220;18 yaşındaki bir Latin genç, babasının ölümünden sorumlu tutularak mahkemeye çıkartılır. Duruşmayı takip eden 12 jüri üyesi tanıkların da ifadelerine başvurduktan sonra, gencin suçlu olduğuna kanaat getirirler. Karar açıklanacağı zaman [...]]]></description>
			<content:encoded><![CDATA[<p><b>12 Angry Men / 12 Öfkeli Adam</b><br />
<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/12_Angry_Men_1.jpg" align="left"> 12 Angry Men, Sidney Lumet tarafından yönetilmiş ve görünürde Henry Fonda&#8217;nın başrolde oynadığı 1957 yapımı bir kült filmdir. <i>&#8220;18 yaşındaki bir Latin genç, babasının ölümünden sorumlu tutularak mahkemeye çıkartılır. Duruşmayı takip eden 12 jüri üyesi tanıkların da ifadelerine başvurduktan sonra, gencin suçlu olduğuna kanaat getirirler. Karar açıklanacağı zaman 11 üye, onun suçlu olduğunu ve idam edilmesini savunurken Bay Davis, karara karşı çıkar ve herkesi kararlarını yeniden değerlendirmeye davet eder. Çünkü jüri, bu kararı kesin delillere göre değil, kişisel düşüncelerine ve bazı dış etkenlere göre vermiştir.&#8221;</i><span id="more-228"></span></p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/12_Angry_Men_5.jpg"></p>
<p>12 Öfkeli Adam, yönetmen Sidney Lumet&#8217;in ilk filmi olmasına rağmen farklı bir teknik kullanması ve oyuncuların etkileyici performası sayesinde sinema dünyasının klasikleri arasına girmiştir. Bu filmde 12 adam 1 odada 1 hayat üzerinden Amerika&#8217;nın hukuk sistemini tartışmaktadır. Bir kişi hariç tüm jüri, İspanyol-Amerikalı genç için &#8220;suçludur&#8221; kararını verir. Fakat 8.jüri olan Bay Davis (Henry Fonda) bu karara karşı çıkar ve bu küçük odada genç sanığı önemsemeyip biran önce evine işine dönmek için sabırsızlanan 11 jürinin ahlaki ve vicdani boyutlarını sorgulamalarını sağlar. 12 Öfkeli Adam filmi, sürü psikolojine, önyargılara ve ezberciliğe karşı cesaret, sabır ve zekayla nasıl savaşılacağının bir örneğidir. Seyirciyi 90 dakika boyunca o küçük odada bir koltuğa oturtan ve sonunda karar konusunda seyirciye sorumluluk yükleyen bir filmdir. Ayrıca milyon dolarları harcamadan, etkileyici bir senaryo sayesinde klasik filmlerinin de yapılabileceğinin bir göstergesidir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/12_Angry_Men_2.jpg"></p>
<p>Arşive eklenmesi ve önyargıların, şüpheciliğin etkili olduğu ülkemizde örnek olması açısından şiddetle tavsiye edilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/12_Angry_Men_3.jpg"></p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/12_Angry_Men_4.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/11/12-ofkeli-adam-12-angry-men/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2005 Database Snapshot</title>
		<link>http://www.ahmetkaymaz.com/2008/02/08/sql-server-database-snapshot/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/08/sql-server-database-snapshot/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 15:05:54 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=226</guid>
		<description><![CDATA[SQL Server 2005 ile gelen yeniliklerden biri olan &#8220;database snapshot&#8221;, veritabanının herhangi bir andaki salt-okunur kopyasının alınmasıdır. Bu işlemin normal kopyalamadan farkı sadece değişiklik yapılmış kayıtları fiziksel olarak almasıdır. İstemcilerden snapshot&#8217;a bir istek geldiği zaman sorgulanan kayıt değişmişse sorgunun sonucu snapshot&#8217;tan gelir değişmemişse orijinal veritabanından gelir. Snapshot&#8217;un normal kopyalama gibi veritabanını olduğu gibi fiziksel kopyalamamsı [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server 2005 ile gelen yeniliklerden biri olan &#8220;database snapshot&#8221;, veritabanının herhangi bir andaki salt-okunur kopyasının alınmasıdır. Bu işlemin normal kopyalamadan farkı sadece değişiklik yapılmış kayıtları fiziksel olarak almasıdır. İstemcilerden snapshot&#8217;a bir istek geldiği zaman sorgulanan kayıt değişmişse sorgunun sonucu snapshot&#8217;tan gelir değişmemişse orijinal veritabanından gelir. Snapshot&#8217;un normal kopyalama gibi veritabanını olduğu gibi fiziksel kopyalamamsı kopyalama sürecinin daha hızlı olmasını ve daha az kaynak harcamasını sağlamaktadır. Snapshot&#8217;un temel amacı değişmiş kayıtların orijinal hallerini saklayıp gerektiğinde düzeltmektir. İstemci sorgularının doğrudan snapshot üzerinden yapılması değişmemiş kayıtlar için ana veritabanına gidip gelindiği için performans sorunu yaşatacaktır.<span id="more-226"></span></p>
<p>Snapshot&#8217;ların normal kopyalamadan diğer farkı da bunların ana veritabanına bağlı yaşamalarıdır. Ana veritabanı erişilemez olduğu durumda ona bağlı snapshot&#8217;lar da erişilmez olur. Aynı zamanda snapshot, doğrudan  peer to peer transactional replikasyon gibi çalışmadığı için bir failover çözümü (high availability) olarak kullanılamaz. Database Snapshot, SQL Server 2005 Enterprise Edition ve üst sürümler tarafından desteklenmektedir ve snapshot üzerinden bir backup alınamaz. Son not olarak snapshot&#8217;un FAT32 dosya sistemi ve RAW partition&#8217;lar üzerinde oluşturulamayacağını da yazıp snapshot&#8217;un nasıl oluşturulacağını bakalım.</p>
<p>Database snapshot oluşturmak için T-SQL&#8217;de aşağıdaki gibi basit bir komut yapısı kullanılır.</p>
<pre name="code" class="sql">CREATE DATABASE Kaynak_ss_20080115 ON (
NAME = Kaynak,
FILENAME = 'C:\Kaynak_20080115.ss')
AS SNAPSHOT OF Kaynak;</pre>
<p>Bu script, 15/01/2008 tarihi itibariyle Kaynak veritabanının fotoğrafını çekip C:\Kaynak_20080115.ss dosyasını aktarır. Snapshot nihayetinde bir database olduğu için management studio içerisinde diğer databaseler üzerinde gezindiğimiz gibi bunun üzerinde de gezinebilir. Oluşturulmuş snapshot&#8217;lar Databases bölümündeki &#8220;Database Snapshots&#8221; bölümünde listelenir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Snapshot_2.jpg" /></p>
<p>Şu an itibariyle snapshot dosyasının içeriği boş durumdadır. Aşağıdaki gibi snapshot üzerinde bir sorgulama yaptığımızda otomatik olarak orijinal veritabanından okunma yapmış oluruz. </p>
<pre name="code" class="sql">SELECT * FROM Kaynak_ss_20080115.dbo.Musteri</pre>
<p>Snapshot bir ve daha fazla sparse file (seyrek dosyas) kullanır. Sparse file NTFS&#8217;in bir özelliği olup sadece veri yazılan kısımlarının diskte yer kapladığı dosyadır. Yani sparse file başlangıçta herhangi bir data içermez ve henüz data için disk üzerinde herhangi bir yer kaplamaz. Snapshot&#8217;un bağlı olduğu orijinal veritabanı ne kadar çok güncellenirse sparse file o kadar büyümeye başlar. MSDN&#8217;den alınmış aşağıdaki şekilde bu süreci göstermektedir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Snapshot_3.jpg" /></p>
<p>Herhangi bir geri dönme durumunda snapshot ile orijinal database&#8217;i JOIN edip orijinal database&#8217;i update edebiliriz. Tanımlı bir snapshot&#8217;tan doğrudan restore işlemini yapmak için aşağıdaki tanım kullanılır.</p>
<pre name="code" class="sql">RESTORE DATABASE Kaynak
FROM DATABASE_SNAPSHOT= 'Kaynak_ss_20080115'</pre>
<p>Eğer bu işlem esnasında &#8220;<i>Database cannot be reverted. Either the primary or the snapshot names are improperly specified, all other snapshots have not been dropped, or there are missing files.</i>&#8221; hatası oluşursa restore edilecek snapshot dışındaki snapshotların silinmesi gerekir.</p>
<p>Snapshot&#8217;u silmek için DROP komutu kullanılır.</p>
<pre name="code" class="sql">DROP DATABASE <Snapshot Adı></pre>
<p>Snapshot&#8217;ların kendine özgü üst-veri (metadata) bilgisi bulunmaz. Orijinal veritabanına ait üst-veri bilgileri taşırlar. Nitekim herhangi bir snapshot veritabanının veri ve log dosyalarını sorguladığımızda o snapshot&#8217;un bağlı olduğu orijinal veritabanının bilgileri gelir.</p>
<pre name="code" class="sql">USE <Snapshot Adı> SELECT * FROM sys.database_files </pre>
<p>Önceki yazıda ifade ettiğimiz gibi database mirroring&#8217;de yedek sunucunun NORECOVERY modunda olması bir dezavantaj olarak karşımıza çıkmaktadır. Fakat mirroring ile birlikte snapshot&#8217;un kullanılması yedek sunucunun readonly olarak hizmet vermesini sağlar.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Snapshot_1.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/08/sql-server-database-snapshot/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2005 Database Mirroring</title>
		<link>http://www.ahmetkaymaz.com/2008/02/03/sql-server-2005-database-mirroring/</link>
		<comments>http://www.ahmetkaymaz.com/2008/02/03/sql-server-2005-database-mirroring/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 13:46:43 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=225</guid>
		<description><![CDATA[SQL Server 2005, sistemin sürekliliği için sunduğu yöntemlerden biri de Database Mirroring yöntemidir. Service Pack 1 ile birlikte sunulmuş olan bu yöntem iki sunucu arasında log transaction kayıtlarını taşıyarak bu sunucuların senkronize olmasını sağlar. Database Mirroring, standard, enterprise veya developer sürümleri tarafından desteklenir. Bu yazıda bu modelin nasıl kurulacağını örneklendireceğiz.
Database Mirroring modelini önemli kılan özellikleri [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server 2005, sistemin sürekliliği için sunduğu yöntemlerden biri de Database Mirroring yöntemidir. Service Pack 1 ile birlikte sunulmuş olan bu yöntem iki sunucu arasında log transaction kayıtlarını taşıyarak bu sunucuların senkronize olmasını sağlar. Database Mirroring, standard, enterprise veya developer sürümleri tarafından desteklenir. Bu yazıda bu modelin nasıl kurulacağını örneklendireceğiz.<span id="more-225"></span></p>
<p>Database Mirroring modelini önemli kılan özellikleri şunlardır;</p>
<ul>
<li>Tam yedekleme yaparak ikinci sunucunun daima hazır olmasını sağlar.(Hot standby)</li>
<li>Sistemde bir hatanın oluşması durumunda otomatik geçiş (automatic failover) zamanın kısa olmasıdır.</li>
<li>Database failover&#8217;da veri kaybının yok denecek kadar az olması</li>
<li>Standart sunucular ve depolama aygıtlarıyla birlikte çalışır.</li>
</ul>
<p>Database mirroring modelinde principal (ana veritabanı), mirror (yedek veritabanı) ve witness (şahit sunucu) olmak üzere aktör bulunur. Principal ve mirror sunucuları zorunlu witness sunucusu ise seçmeli olarak kurulur. Principal rolündeki sunucu merkezi sistem olup ana transactionların çalıştırıldığı yerdir. Bu sunucu üzerinde çalışan her transaction mirror servisi tarafından mirror rolündeki yedek sunucu üzerinde de çalıştırılır. Böylece her iki sunucu veri ve şema anlamında eşleşmiş olur. Witness rolündeki sunucu ana ve yedek sunucuların ayakta olup olmadığını kontrol eden, ana sunucu devre dışı olduğu zaman sistemi yedek sunucuya otomatik olarak geçiren bağımsız bir sunucudur. Herhangi bir SQL Server sürümünü witness sunucu olarak kullanabiliriz. Witness sunucu birden fazla mirroring oturumuna destek verebilir. Aşağıdaki şekilde bu temel kavramlar ve gerektiğinde automatic failover sürecinin nasıl gerçekleşeceği gösterilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Mirroring_1.jpg" /></p>
<p>Database mirroring modelinde sadece bir principal ve ona ait bir mirror veritabanı/sunucu olabilir. </p>
<p>Database mirroring işlemi veritabanı bazında yapılır. Hangi veritabanının yedeği alınacaksa öncelikle recovery modelini full olarak işaretlemeliyiz. Diğer önemli adım diğer yöntemlerde olduğu gibi SQL Server Agent kullanıcı yetkilerini uygun şekilde düzenlemeliyiz. Örnek senaryomuzda aynı makine üzerinde koşan üç sunucuyu kullanacağız.<br />
Principal: AHMETKAYMAZ\AHMETKAYMAZ1<br />
Mirror:  AHMETKAYMAZ\AHMETKAYMAZ2<br />
Witness: AHMETKAYMAZ</p>
<p>AHMETKAYMAZ1 sunucu üzerindeki KAYNAK veritabanını AHMETKAYMAZ2 üzerinde yedekleyeceğiz. Bunun için ilk adım olarak kaynak veritabanının full backup&#8217;ını alıp karşı makineye restore etmemiz gerekir. Yedek alma işlemini Management Studio üzerinden yapabileceğimiz gibi T-SQL Script ile de yapabiliriz.</p>
<pre name="code" class="sql">BACKUP DATABASE Kaynak TO DISK='C:\Kaynak_full.BAK'</pre>
<p>İkinci adım olarak bu full backup karşı makineye restore edeceğiz. Aynı şekilde işlemi Management Studio üzerinden yapabileceğimiz gibi T-SQL script ile de yapabiliriz. Bizim senaryoda tüm sunucular aynı makine üzerinde olduğu için ikinci sunucuda mdf ve ldf dosyalarına farklı bir konum vermek gerekir.</p>
<pre name="code" class="sql">RESTORE DATABASE Kaynak
	FROM DISK='C:\Kaynak_full.BAK' WITH NORECOVERY,
		MOVE 'Kaynak' TO 'C:\Kaynak.mdf',
		MOVE 'Kaynak_Log' TO 'C:\Kaynak.ldf'</pre>
<p>Database Mirroring modelinde başlangıç adımı olarak kaynak veritabanına ait full backup&#8217;tan sonra bir log backup&#8217;ın yedek sunucuya restore edilmesi gerekir. Bunun için full backup sonrası bir log backup alalım.</p>
<pre name="code" class="sql">Backup Log Kaynak to Disk='C:\Kaynak_log.bak'</pre>
<p>Bu log backup yedek sunucuya restore edelim.</p>
<pre name="code" class="sql">Restore Log Kaynak from Disk='C:\Kaynak_log.bak' with NORECOVERY</pre>
<p>Burada dikkat edilemesi gereken konu yedekler yedek sunucuya NORECOVERY seçeneğiyle restore edilmesidir. Bu da çalışma anında yedek sunucu üzerinde sorgulama yapılamayacağı anlamına geliyor. Bu özellike mirroring&#8217;in diğer yöntemlere göre bir dejavantajı olarak karşımızı çıkmaktadır.</p>
<p>Modeldeki sunucuların rollerini tanımlamadan önce Endpoint&#8217;leri tanımlamamız gerekir. SQL Server 2005&#8242;te <b>EndPoint (Uç Nokta)</b> kavramı harici kaynaklar ile SQL Server arasındaki iletişimi güvenlik kılmak için oluşturulan bir yönetim mekanizmasıdır. Endpoint, uzaktan erişilen sunucunun içerdeki bir yordamı güvenli bir şekilde çağırmasını sağlar.</p>
<p>SQL Server üzerinde TCP ve HTTP olmak üzere iki tür endpoint yaratılabilir. TCP endpoint&#8217;ler, database mirroring iletişimi için kullanılırken HTTP point&#8217;ler SOAP tabanlı talepler için kullanılır. SQL Server 2005&#8242;in XML web servisi desteği HTTP endpoint&#8217;ler aracılığıyla gerçekleşir. Sunucu üzerindeki Http dinleyicisi (Http Listener - HTTP.sys) gelen talepleri SQL Server üzerinde tanımlı endpoint&#8217;lere iletir. Endpoint&#8217;ler aracılığıyla SQL Server 2005 üzerindeki bir function veya stored procedure&#8217;in http üzerinde gelen talepleri yanıtlanması sağlanmıştır. Bir endpoint oluşturulurken başlangıç durumu (<i>Started, Stoped veya Disabled</i>), hangi iletişim protokolü (Tcp, Http) üzerinden servis vereceği, dışarıdan erişim için url adresi ve portu, endpoint&#8217;in yer aldığı veritabanı gibi bilgiler başta belirtilir. Endpoint nesneleri diğer nesneler gibi CREATE, ALTER, DROP ifadeleriyle yönetilir. Endpoint&#8217;lerle ilgili ek parametreler için &#8220;CREATE ENDPOINT&#8221; ifadesini bakılabilir. Her Bir SQL Server sunucu için tek bir database mirroring endpoint&#8217;i oluşturulabilir. Konumuza tekrar dönecek olursak ana sunucu için Kaynak veritabanı üzerinde bir endpoint tanımlayalım.</p>
<pre name="code" class="sql">Create Endpoint Mirroring_Endpoint
	State= Started as TCP (Listener_Port=5001)
	For Database_Mirroring (Role=Partner);</pre>
<p>Aynı komutu yedek sunucu üzerinde de çalıştıralım. Burada dikkat edilmesi gereken konu mirror, principal ve witness noktaları aynı sunucu üzerinde tanımlı olacaksa her birinin hizmet verdiği portun farklı olması gerekir. Bu yüzden principal için 5001, mirror için 5002 ve witness için 5003 portunu girelim. Witness rolündeki sunucu için yukarıdaki komutu (Role=Partner) ifadesini (Role=Witness) ile değiştirerek çalıştıralım.</p>
<pre name="code" class="sql">Create Endpoint Mirroring_Endpoint
	State= Started as TCP (Listener_Port=5003)
	For Database_Mirroring (Role=Witness);</pre>
<p>Bu ifadeyle birlikte her sunucu üzerinde o sunucunun rolüne uygun olarak 5001 portunda hizmet veren bir endpoint tanımlanmış oldu. Bir endpoint&#8217;in aynı anda mirror, principal ve witness olarak çalışabilmesi için yukarıdaki komutta (Role=ALL) olarak tanımlanmalıdır. Sunucu üzerinde tanımlı endpoint bilgileri <b>sys.endpoints, sys.database_mirroring_endpoints, sys.http_endpoints, sys.tcp_endpoints, sys.soap_endpoints</b> katalog tablolarında tutulur. Tanımlı olan endpoint&#8217;i kaldırmak için aşağıdaki satır kullanılır.</p>
<pre name="code" class="sql">Drop Endpoint <EndPoint Adı></pre>
<p>Sonraki adım olarak sunucuların dışarıdan gelecek istekleri dinleyecek protokol ve portlarını tanımlıyoruz. Sunucular üzerinde database mirroring oturumlarını başlatmak için aşağıdaki komut kullanılır. Öncelikle yedek sunucu üzerinde database mirroring session açalım. Yedek sunucuda aşağıdaki satırı çalıştıralım.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak]
SET PARTNER = N'TCP://Ahmetkaymaz:5001'</pre>
<p>Ardından ana sunucuya geçip bu sunucu üzerinde oturumu başlatalım.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak]
Set Partner= 'TCP://Ahmetkaymaz:5002';</pre>
<p>Eğer bu işlemler esnasında <i>Database &#8220;Kaynak&#8221; is not configured for database mirroring.</i> hata mesajıyla karşılaşırsak işlemleri buradaki sıralamaya uygun yapmadığımız anlamına gelir.</p>
<p>Üçüncü adım olarak witness server üzerinde oturumu başlatalım. Ana sunucu üzerinde aşağıdaki komutu çalıştırarak mirroring modelinde kimin şahitlik yapacağını bildirelim.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak]
SET WITNESS = N'TCP://Ahmetkaymaz:5003'</pre>
<p>Bu komutla birlikte Kaynak veritabanını ve diğer sunucuları database mirroring için yapılandırmış olduk.</p>
<p>Eğer bu aşamada <i>&#8220;Database mirroring is disabled by default. Database mirroring is currently provided for evaluation purposes only and is not to be used in production environments . . .&#8221;</i> hata mesajı alınırsa sunucunun üzerinde SP1&#8242;in kurulu olmadığı anlamına gelir. SQL Server 2005 RTM sürümü (9.0.1399) varsayılan olarak database mirroring işlemine kapalıdır. Eğer <i>&#8220;Database Mirroring Transport is disabled in the endpoint configuration.&#8221;</i> hata mesajı oluşursa sunucu üzerinde mirroring endpoint&#8217;lerin yaratılmadığı anlamına gelir.</p>
<p>Sunucular üzerinde mirroring oturumlarını açtığımız için otomatik olarak mirroring işlemi başlatılmış olur. Nitekim Management Studio içerisinde ana ve yedek sunucuların durumları aşağıdaki gibi görünür.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Mirroring_2.jpg" /></p>
<p>Database mirroring geçici olarak durdurmak için aşağıdaki komut yapısı kullanılır.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak] SET PARTNER SUSPEND</pre>
<p>Süreci kaldığı yerden devam ettirmek için aşağıdaki komut yapısı kullanılır.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak] SET PARTNER RESUME</pre>
<p>Bundan böyle ana veritabanı üzerinde yapılan değişiklikler otomatik olarak yedek sunucuya da gönderilir. Witness sunucu kısa aralıklar her iki sunucunun ayakta olup olmadığını denetler. Herhangi bir şekilde ana sunucunun erişilmemesi durumunda yedek sunucuyu devreye sokar ve ona principal rolünü verir. Özellikle Witness sunucunun erişilmedi durumlarda otomatik geçişini manual yapmak gerekebilir. Bunun için birinci sunucuda aşağıdaki komut satırı kullanılır.</p>
<pre name="code" class="sql">ALTER DATABASE Kaynak SET PARTNER FAILOVER</pre>
<p>Bu durumda ana veritabanı ikinci sunucu üzerine geçirilmiş olur. Nitekim Management Studio içerisinden baktığımızda rollerin değiştiğini görebiliriz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Mirroring_3.jpg" /></p>
<p>Aynı senaryoyu birinci sunucunun SQL Server servisini durdurarak ta gerçekleştirebilirdik. </p>
<p>Burada failover işlemini principal veritabanı üzerinde başlattık. Fakat bazı durumlarda bu veritabanı erişilemiyor olabilir. Bu durumda failover işlemini mirror veritabanı üzerinden başlatmak daha doğru olacaktır. Bunun için de aşağıdaki komut satırı kullanılır.</p>
<pre name="code" class="sql">ALTER DATABASE Kaynak SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS</pre>
<p>Aslında eğer ortada bir witness sunucu varsa telaşlanmamıza gerek yok çünkü ana veritabanının failure olması durumunda yedek sunucu otomatik olarak tetiklenecektir. Eğer witness sunucu yoksa veya aktif değilse o zaman geçiş işlemini önceki iki komutla manual yapmak gerekir. </p>
<p>Şu ana kadar komut sistemiyle anlattığımız tüm işlemler Management Studio aracında görsel olarak daha kolayca hazırlanabilir. Bunun için yapılması gereken şey backup ve restore işlemlerini yaptıktan sonra ana veritabanını sağ tıklayıp &#8220;Tasks » Mirror&#8221; menüsüyle Properties penceresindeki Mirroring bölümünü açmaktır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Mirroring_4.jpg" /></p>
<p>Bu bölümde database mirroring ayarları, durumu görülebilir ve gerekirse durdurma, başlatma, failover gibi işlemler buradan yapılır. Bu penceredeki &#8220;Configure Security&#8221; düğmesi tıklanarak yoksa endpointler ve roller tanımlanır. Tanımlanmış olan roller penceredeki &#8220;Server network addresses&#8221;  bölümünde listelenir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Database_Mirroring_5.jpg" /></p>
<p>Database mirroring bu penceredeki &#8220;Stop Mirroring&#8221; düğmesiyle kapatılabileceği gibi aşağıdaki komut satırıyla da iptal edilebilir.</p>
<pre name="code" class="sql">ALTER DATABASE [Kaynak] SET PARTNER OFF</pre>
<p><u><b>Database Mirroring Çalışma Modları</b></u></p>
<p>Database mirroring yönteminin <b>High Performance (Yüksek Performans), High Availability (Yüksek Erişilebilirlik)</b> ve <b>High Protection (Yüksek Koruma)</b> olmak üzere üç temel operasyon modeli mevcuttur.</p>
<p><b>High performance (asynchronous)</b> Witness sunucuya gerek duyulmayan bu modelde transactionlar öncelikle ana veritabanı üzerinde commit edilir ardından başka bir proses tarafından yedek sunucu tarafına transfer edilir. Yani birinci sunucu kendisi üzerinde çalıştırılan bir transaction&#8217;nın yedek sunucuda da commit edilmesini beklemez hatta ondan haberdar olmaz. Asekron çalışması bu demektir. Performansın önemli olduğu bu modelde otomatik geçiş işlemi sunulmaz yalnızca manual failover yapılabilir bu yüzden principal sunucu erişilemez olduğu zaman mirror sunucuya ancak warm standby (read-only) olarak erişilebilir. Database yöneticisi mirror sunucunun yukarıda bahsettiğimiz komutları kullanarak rolünü değiştirmelidir. Ayrıca transactionlar asenkron işlendiği için ana veritabanının fail olması durumunda veri kaybı fazla olabilir.</p>
<p><b>High safety without automatic failover (synchronous)/High-Protection</b> Önceki modelden farkı bu modelde tüm commit edilmiş transactionların mirror sunucunun diskine de yazıldığı garanti edilir. Transactionlar mirror sunucu tarafında onaylandıktan sonra birinci sunucu tarafında onaylanır. Aynı şekilde bir witness sunucu bulunmaz ve principal sunucu erişilemez olduğu zaman mirror sunucu da fakat kendisine warm standby olarak erişilebilir.</p>
<p><b>High safety with automatic failover (synchronous)/High-Availability</b> Önceki model ile aynı olup tek farkı bir witness sunucunun olmasını zorunlu kılması ve bunun sayesinde automatic failover desteğini vermesidir. Yüksek erişim sunan bu modelde aynı şekilde tüm transactionlar hem principal hem de mirror üzerinde commit edilir. Ana sunucunun erişilemez olması durumunda witness sunucu yedek sunucuya otomatik olarak geçiş yapar. Bu seçeneğin seçilmesi durumunda Replikasyon ve Log Shipping yöntemlerine göre daha yüksek bir erişilebilirlik sağlanmış olur.</p>
<p>Bu seçenekler en son şekilde verilmiş olan &#8220;Database Properties&#8221; penceresindeki Mirroring bölümünden seçilebilir. Sunucuları düzenlerken Witness server seçmemiz otomatik olarak &#8220;High-Availability&#8221; modelini seçtirir.</p>
<p><u><b>Transparent Client Redirect (Şeffaf İstemci Yönlendirme)</b></u></p>
<p>Transparent Client Redirect, Database Mirroring ile ilişkili bir özellik olup primary sunucu erişilemez olduğu zaman istemcilerin otomatik olarak mirror sunucuya yönlendirilmesini sağlar. SQL Server 2005 MDAC&#8217;e eklenmiş olan bu özellik sayesinde istemcinin veri erişim katmanında herhangi bir kod değişikliği yapılmaya gerek kalmamaktadır. İlk principal bağlantısında istemci kütüphanesi mirror sunucu adını ön belleğe alır. MDAC primary sunucuyla olaran bağlantısını kaybettiği zaman primary sunucuya yeniden bağlanmayı dener eğer başarılı olmazsa bu sefer yönünü mirror sunucuya döndürür. Bir anlamda MDAC, primary ve mirror sunucular arasında middleware olarak çalışır. Bu için connection string içerisinde ana sunucuyla birlikte yedek sunucunun adresi de verilir. Connection string içerisine eklenecek &#8220;Failover Partner&#8221; anahtar sözcüğü aracılığıyla birincil veritabanıyla bağlantı kurulamadığı anlarda ek bir kodlama veya yapılandırmaya gerek kalmadan ikinci veritabanına yönlendirme yapılır. Aşağıdaki cümlede belirlenmiş connection süresinde eğer birinci veritabanı (initial partner) olan &#8220;DW1&#8243; sunucuyla bağlantı kurulamazsa onun yansıması olarak yapılandırılmış olan ikinci veritabanıyla (failover partner) &#8220;DW2&#8243; ile bağlantı kurulmaya çalışılır.</p>
<pre name="code" class="html">Data Source=DW1;Failover Partner=DW2;Initial Catalog=Kaynak;Integrated Security=True;</pre>
<p>Sonuç olarak erişilebilirlik ve performans açısından database mirroring&#8217;in iyi bir çözüm olduğunu ve failover clustering ile kıyaslandığında otomatik geçiş süresinin daha kısa olduğunu, ek donanıma ihtiyaç duymadığını ve en önemlisi failover clustering gibi sadece yüksek erişilebilirlik sağlamadığını bu en ek olarak yüksek performans ve koruma sağladığını da söyleyebiliriz. Bununla birlikte yedek sunucunun NORECOVERY modunda olması ve bir veritabanına ait sadece bir mirror&#8217;un olması bir dejavantaj olarak değerlendirilebilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/02/03/sql-server-2005-database-mirroring/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server Data Replication (Veri Yineleme) - II</title>
		<link>http://www.ahmetkaymaz.com/2008/01/09/sql-server-data-replication-veri-yineleme-ii/</link>
		<comments>http://www.ahmetkaymaz.com/2008/01/09/sql-server-data-replication-veri-yineleme-ii/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 18:45:15 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=224</guid>
		<description><![CDATA[Önceki yazıda replikasyonla ilgili terminolojiyi anlatmaya çalıştık. Bu yazıda SQL 2000 ve 2005 üzerinde replikasyon türlerinin nasıl kurulacağını örneklendirelim. Aynı makine üzerinde koşan iki tane SQL Server 2000 instance&#8217;imiz var. Birinin adı WXX diğerinin adı WXX\KAFKA. WXX sunucusunu yayıncı ve dağıtıcı, WXX\KAFKA sunucusunu da abone olarak yapılandıracağız. WXX üstündeki KAYNAK isimli veritabanını yayınlayacağız. Sunucuları ilklendirmek [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ahmetkaymaz.com/2008/01/07/sql-server-data-replication-veri-yineleme-i/">Önceki yazıda</a> replikasyonla ilgili terminolojiyi anlatmaya çalıştık. Bu yazıda SQL 2000 ve 2005 üzerinde replikasyon türlerinin nasıl kurulacağını örneklendirelim. Aynı makine üzerinde koşan iki tane SQL Server 2000 instance&#8217;imiz var. Birinin adı WXX diğerinin adı WXX\KAFKA. WXX sunucusunu yayıncı ve dağıtıcı, WXX\KAFKA sunucusunu da abone olarak yapılandıracağız. WXX üstündeki KAYNAK isimli veritabanını yayınlayacağız. Sunucuları ilklendirmek ve full backup&#8217;ın snapshot klasörüne sorunsuz yüklenmesi ve diğer işlemler için SQL Server Agent servisinin yetkili bir domain ile başlatmak doğru bir çözüm olur.<span id="more-224"></span></p>
<p>İlk adım olarak WXX sunucusunu hem publisher hem de distributor olarak yapılandıracağız. Bunun için üst menüdeki Wizard bölümüden veya sunucu ismini sağ tıklayıp Properties bölümünden replikasyon sihirbazını başlatabiliriz. Enterprise Manager içerisinde WXX sunucunu sağ tıklayıp Properties bölümünden Replication sekmesine girelim. Burada Configure düğmesini tıklayalım.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_11.jpg" /></p>
<p>Karşılama ekranını geçtikten sonra &#8220;Select Distributor&#8221; penceresine geçelim. &#8220;<i>Make &#8216;WXX&#8217; its own Distributor; SQL Server will create a distribution database and log</i>&#8221; seçeneği ile Publisher ve Distributor&#8217;un aynı sunucu olacağını belirtelim.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_12.jpg" /></p>
<p>Sonraki ekranda snapshot klasörünü belirteceğiz. Replikasyonun mantığı gereği yayıncı ve abonelerin farklı makinelerde koşuyor olmasından dolayı tüm sunucuların erişmesi için bu klasörün network yolunun tanımlanması daha mantıklı olacaktır. Eğer yerel adres verilirsen sadece push subscription&#8217;lar desteklenir. Burada <i>C:\SnapshotYedek</i> klasörü için <i>\\WXX\SnapshotYedek</i> ağ yolunu giriyoruz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_13.jpg" /></p>
<p>Bir sonraki ekranda yayınlama ve dağıtma ayarları gerçekleştirilir. Burada istenilirse &#8216;distribution&#8217; veritabanının adı ve ona ait data ve log dosyalarının konumu değiştirilebilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_14.jpg" /></p>
<p>Bu ekranla birlikte WXX sunucunun hem yayıncı hem de dağıtıcı rolünde olması sağlandı. Bu bölümdeki adımları bitirdiğimizde WXX üzerinde &#8216;distribution&#8217; veritabanı oluşturulur ve replikasyon sürecini yönetmek ve takip etmek için <B>&#8220;Replication Monitor&#8221;</B> aracı aktifleştirilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_15.jpg" /></p>
<p>Şu an itibariyle yayımcı ve dağıtıcı sunucularını tanımlamış olduk. Şimdi yayımcı sunucunun ne yayınlanacağını (publication), abonelere gönderilecek artikelleri tanımlayacağız. Bunu farklı menülerden yapabiliriz. Bunun en kısa yolu Enterprise Manager içerisindeki &#8220;Tools » Replication » Create and Manage Publications&#8230;&#8221; menüsünü kullanacağız.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_16.jpg" /></p>
<p>Bu menünün açtığı pencerede WXX altındaki Kaynak veritabanını seçip &#8220;Create Publications&#8221; düğmesini tıklayarak bu database için bir yayın hazırlayalım. Karşılama ekranından sonra bu yayının hangi replikasyon türüyle yayınlacağı seçilir. Burada en basit olan &#8220;Snapshot Replication&#8221; yöntemini seçeceğiz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_17.jpg" /></p>
<p>Sonraki ekranda abonelerin veritabanı sistemi düzeyinde türü seçilir. Aboneler SQL Server sisteminden olduğu gibi Oracle, Access gibi heterojen sistemler de olabilir. Burada SQL Server 2000 seçeneğini işaretleyip bir sonraki ekrana geçelim. Bu yeni ekranda yayınlanacak artikelleri seçeceğiz. Burada Kaynak veritabanı altında örnek olarak oluşturduğumuz Musteri tablosunu seçeceğiz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_18.jpg" /></p>
<p>Bu ekranda tabloların yanındaki &#8220;&#8230;&#8221; düğmesini tıklayarak artikelin adı ve bu nesnelerin karşı taraftaki adı düzenlenebilir. Sonraki ekranlarda varsa IDENTITY uyarısı yapılır ve &#8220;define data filters&#8221; seçeneğiyle yatay veya dikey filtreleme yapılabilir. Filtreleme işlemi SQL Server replikasyonunun önemli bir özelliği olup tablonun sadece belli kolon veya satırlarını abonelere göndermemize imkan sağlar. Bu ekranlarda varsayılan seçenekleri işaretleyip yayın tanımlama sürecini bitirelim. Bu işlemden sonra hem Kaynak veritabanının altında hem de Publications bölümünde tanımlanan yayın bilgisi görünür.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_19.jpg" /></p>
<p>Bu aşamada yayıncı ve onun yayınlayacağı makaleler ve bunları dağıtacak dağıtıcı tanımlanmış oldu. Şimdi bu yayınlara abone olacak üyeleri tanımlayacağız. Bunun için &#8220;Tools » Replication&#8221; menüsü kullanılabildiği gibi Replications bölümü altındaki yayın (Kaynak) sağ tıklanarak &#8220;Push New Subscription&#8221; menüsü kullanılabilir. &#8220;Push Subscription Wizard&#8221; ekranında bir veya daha fazla muhtemel abone seçilebilir. Burada WXX\KAFKA sunucusunu seçeceğiz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_20.jpg" /></p>
<p>Sonraki ekranlarda Kaynak veritabanının karşı taraftaki karşılığının ne olacağı ve Distribution Agent&#8217;in bir kere mi yoksa belli peryotta mı çalışıp çalışmayacağı belirtilir. Üye makinelerde Kaynak veritabanının oluşturulmuş olması lazım. Bunu bu ekranda &#8220;Browse or Create&#8221; buttonuyla sağlayabiliriz.</p>
<p>Görüldüğü gibi SQL Server ortamında replication işlemini yapmak çok kolay. Bu yazıda örnek Snapshop replication türünü ele aldık. Replikasyon türünün seçildiği ekranda Transactional veya Merge türleri seçilerek bu yöntemler de yapılandırılabilir. Transactional replikasyon için sözkonusu tablolar üzerinde primary key&#8217;in tanımlı olması gerekir. </p>
<p>SQL Server 2005&#8242;te replikasyon işlemini yapmak daha da kolaylaştı. Bu işlemi yapılandırmak için Management Studio&#8217;da Replication bölümü kullanılır. Aşağıdaki şekilde AHMETKAYMAZ isimli aynı sunucu üzerinde Kaynak1 veritabanı Kaynak2 veritabanını aktarılmıştır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_21.jpg" /></p>
<p>SQL Server replikasyonla ilgili olarak aşağıdaki notlarla yazımızı bitirelim.</p>
<ul>
<li>SQL Server 2005 ile aynı replikasyonda topolojisinde bulunacak SQL Server sürümü en az SQL Server 7.0 (SP4) ve SQL Server 2000 (SP3) olması gerekir.</li>
<li>Diskte veri saklama formatları aynı olduğu için SQL Server&#8217;in 32-bit ve 64-bit sürümleri aynı replikasyon modelinde kullanılabilir.</li>
<li>Farklı SQL Server sürümleri arasında replikasyon kurulacağı zaman Distributor sunucunun versiyonu Publisher&#8217;dan daha eski olmamalı.</li>
<li>SQL Server 2005 ancak publisher modunda olan SQL Server 2005 ve SQL Server 2000 için Distributor  olabilir. SQL Server 7.0 için dağıtıcılık yapamaz.</li>
</ul>
<p>MSDN&#8217;den alınmış aşağıdaki tablolar hangi SQL Server sürümlerinin aynı topolojide bulunabileceğini göstermektedir.</p>
<p><b>Salt-Okunur Aboneler için Transactional Replication ve Snapshot Replication</b></p>
<table width="100%" border="1" style="background-color: #CCCCCC;">
<tr>
<td>
<p>Distributor</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Publisher</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Subscribers</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p> SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
</table>
<p><b>Güncellenebilen Aboneler için Transactional Replication</b></p>
<table width="100%" border="1" style="background-color: #CCCCCC;">
<tr>
<td>
<p>Distributor</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Publisher</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Subscribers</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
</table>
<p><b>Merge Replication</b></p>
<table width="100%" border="1" style="background-color: #CCCCCC;">
<tr>
<td>
<p>Distributor</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Publisher</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
<tr>
<td>
<p>Subscribers</p>
</td>
<td>
<p>SQL Server 7.0</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
</td>
<td>
<p>SQL Server 7.0</p>
<p>SQL Server 2000</p>
<p>SQL Server 2005</p>
</td>
</tr>
</table>
<p>Bu yazıda SQL Server 2000 replication ve SQL Server 2005 replication işlemlerinin nasıl yapılacağını öğrenmiş olduk.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/01/09/sql-server-data-replication-veri-yineleme-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server Data Replication (Veri Yineleme) - I</title>
		<link>http://www.ahmetkaymaz.com/2008/01/07/sql-server-data-replication-veri-yineleme-i/</link>
		<comments>http://www.ahmetkaymaz.com/2008/01/07/sql-server-data-replication-veri-yineleme-i/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 08:14:00 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=222</guid>
		<description><![CDATA[SQL Server&#8217;in sürekli kullanılabilirlik için desteklediği işlemlerden biri de replication modelidir. Replication kısaca verileri merkezi konumdan alıp farklı konumlarda yedekleme işlemidir. SQL Database Replication modelinde kullanılan kavramları açıklayıp bu modelin nasıl oluşturulacağını örneklendirelim. Replication yöntemi tüm SQL Server&#8217;in tüm sürümlerinde gerçekleştirilebilir. Express sürümü, Merge ve Transactional replication yöntemlerinde sadece subscriber olarak kullanılabilir.
Publisher (Yayıncı): Üye veritabanlarına [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server&#8217;in sürekli kullanılabilirlik için desteklediği işlemlerden biri de replication modelidir. Replication kısaca verileri merkezi konumdan alıp farklı konumlarda yedekleme işlemidir. SQL Database Replication modelinde kullanılan kavramları açıklayıp bu modelin nasıl oluşturulacağını örneklendirelim. Replication yöntemi tüm SQL Server&#8217;in tüm sürümlerinde gerçekleştirilebilir. Express sürümü, Merge ve Transactional replication yöntemlerinde sadece subscriber olarak kullanılabilir.</p>
<p><B>Publisher (Yayıncı)</B>: Üye veritabanlarına veri gönderen merkezi sunucu ya da veritabanı. Replikasyondaki kaynak verinin bulunduğu yerdir.<br />
<B>Subscriber (Abone)</B>: Merkezi veritabanından verileri alan sunucu ya da veritabanı. Abonele varsayılan olarak merkezi veritabanının salt-okunur (read-only) kopyasına sahiptir ancak farklı bir konfigürasyonla abonelerde de değişikliğe izin verilebilir veya yapılan değişiklikler merkezi veritabanına yansıtılabilir.<br />
<B>Distributor (Dağıtıcı)</B>: Yayıncı ile abone arasındaki veri akışını yöneten sunucu. Bu amaçla <I>distribution</I> isimli veritabanına sahiptir. Bu veritabanında veri ve şema bazında yapılmış değişiklikler tutulur. Bir veritabanı sunucusu aynı anda hem publisher hem de distributor rolünde olabilir.<br />
<B>Article (Makale)</B>: Yayıncı tarafından yayınlanan içerik. VTYS&#8217;de üye sunuculara gönderilecek veritabanı nesneleridir (table, view, stored procedure). Makale koleksiyonu <B>publication (yayın)</B> olarak tanımlanır.<br />
<B>Push ve Pull Subscription (Abonelik gönderme ve çekme):</B> Push subscription&#8217;da distributor verileri subscriber veritabanına kopyalar. Bu yöntemde işin yükünü distributor çeker. Pull subscription&#8217;da ise subscriber kendisi distributor&#8217;dan verileri çeker yani işin yükü abonelere verilmiş olur.<span id="more-222"></span></p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_1.jpg" /></p>
<p><U><B>Replikasyon Topolojileri (Modelleri)</B></U><br />
Replikasyon topolojileri, bu yöntemdeki başrollerin (yayıncı, dağıtıcı, abone) sayısını ve fiziksel konumlarını temsil eder.</p>
<p><B>Central publisher (Merkezi yayıncı)</B>: En çok kullanılan topoloji olup bir sunucu yayıncı ve dağıtıcı diğer sunucu veya sunucular abone/aboneler olarak yapılandırılır.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_3.jpg" /></p>
<p><B>Central subscriber (Merkezi abone)</B>: Tek abone/çoklu yayıncı modeline sahip olup data warehouse sistemlerinde kullanılan bir topolojidir. Birden fazla sunucu/veritabanı verilerini tek bir sunucu/veritabanına replike eder.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_4.jpg" /></p>
<p><B>Central publisher with remote distributor (Merkezi yayıncı/Uzak dağıtıcı)</B>: Bu topolojide <I>distribution</I> veritabanı publisher dışındaki başka bir sunucuda bulunur. Bu topoloji yoğun replikasyon işlemlerin olduğu sistemlerde Publisher&#8217;in iş yükünü azaltmak için tercih edilir.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_5.jpg" /></p>
<p><B>Publishing subscriber</B>: Çift yönlü bir topoloji olup yayıncı sunucu/veritabanı aynı zamanda başka bir sunucunun abonesi olarak tasarlanır. Bu senaryoda iki sunucu aynı veriyi yayınlar. Bu model zayıf veya maliyetli bağlantıya sahip abonelere yayın yapılacağı kullanışlı olur.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_6.jpg" /></p>
<p><B>Central distributor (Merkezi dağıtıcı)</B>: Birden fazla yayıncının yayınını abonelerine dağıtan tek bir dağıtıcının olduğu topolojidir.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_7.jpg" /></p>
<p><U><B>Replikasyon Türleri</B></U><br />
SQL Server sisteminde üç temel replikasyon türü bulunmaktadır;</p>
<p><B>Snapshot Replication</B>: Static replication olarak ta bilinen Snapshot Replication en basit replikasyon türü olup her defasında kaynak veritanındaki tüm verileri bağlı abonelere toplu olarak yükler. Snapshot replication&#8217;da daha önce abonelere hangi verilerin gönderildiğine bakılmaz. Bu işlemi full backup&#8217;ın karşı tarafa restore edilmesi gibi düşünebiliriz. Merkezi veritabanından her defasında tüm data article&#8217;leri çıkarması ve abonelere taşıması hem zaman hem de kaynaklar açısından maliyetli olabilmektedir. Bu yüzden bu modeli az transaction işlemlerinin yapıldığı VTYS&#8217;lerde veya üyelerin sil baştan yapılandırılması gereken durumlarda kurmak daha elverişli olacaktır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_8.jpg" /></p>
<p><B>Transactional Replication</B>:Dynamic replication olarak ta bilinen bu yöntem Snapshot Replication&#8217;tan farklı olarak incremental modele sahiptir yani sadece son yapılmış replikasyon işleminden bu yana gerçekleşmiş değişiklikleri üye veritabanlarına adım adım yansıtır. Bunu da merkezi veritabanındaki log dosyasını dinleyerek gerçekleştirir. Değişiklikler üyelere gerçek zamanlı gönderilebildiği gibi belli peryotlarda da gönderilebilir. Bu yöntem çok yoğun transaction işlemlerinin yapıldığı sistemlerde tercih edilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_9.jpg" /></p>
<p><B>Merge Replication </B>: Transactional Replication gibi incremental özelliğe sahip olan bu yöntem çift yönlü bir replikasyon sunar yani hem publisher tarafındaki değişikliği subscriber&#8217;a yansıtır  hem de subscriber tarafındaki değişikliği publisher&#8217;a yansıtır. En karmaşık yapıya sahip olan bu yöntemde veri çakışmaları yaşanabilmektedir. Bu yöntem genellikle birden fazla üyenin bulunduğu topolojilerde bir üyenin yaptığı değişikliği hem merkeze hem de diğer üyelere yansıtılması durumunda veya kullanıcıların online/offline çalışabildiği projelerde (<i>bağlantısız ve mobil uygulamalar</i>) tercih edilir. Merge Replication&#8217;dan farklı olarak bir veri üzerindeki tüm değişiklikleri değil sadece son değişikliği karşı tarafa gönderir. Örneğin bir kayıt üzerinde 5 kere düzenleme yapıldıysa Transactional Replication&#8217;da bu 5 günceleme de karşı tarafa yansıtılır fakat Merge Replication&#8217;da sadece son güncelleme gönderilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_10.jpg" /></p>
<p>Transactional ve Merge replikasyonların snapshot replikasyondan temel farkı sadece değişiklikleri abonelere yansıtmaları ve veri yerine transaction ifadelerini abonelere taşımalarıdır. Snapshot ve Transactional replikasyonlar tek taraflı oldukları için bu yöntemlerde abonelerin salt okunur olarak düzenlenmesi daha anlamlı olacaktır. Aksi takdirde yayıncı ve üyeler arasında veri bütünlüğü sağlanamayabilir. Bununla birlikte Transactional replication yönteminde &#8220;<i>Updatable Subscriptions for Transactional Replication</i>&#8221; seçeneği aktif yapılarak üyelerdeki değişiklik de merkeze yansıtılabilir.</p>
<p>Hangi replikasyon türünü seçersek seçelim öncelikle yayıncı ile üyeleri şema/veri düzeyinde senkronize etmek gerekir. Bunun için yayıncının full backup&#8217;ı alınıp üyeler restore edilir. Bu işlem veritabanı yöneticisi tarafından manual yapıldığı gibi SQL server tarafından replikasyonun ilk adımı olarak ta yapılabilir.</p>
<p><U><B>Replikasyon Agent&#8217;leri</B></U><br />
Replikasyon modelinde süreç Sql Server Agent servisi ve bunun altında çalışan bağımsız agentler tarafından yönetilir.  SQL Agent <i>C:\Program Files\Microsoft SQL Server\90\COM</i> altında bulunan bu agentleri çalıştırarak işlemleri yürütür. Bu agentler şunlardır;</p>
<p><B>Snapshot Agent (Snapshot.exe)</B>: Yedek veritabanını hazırlamak amacıyla kaynak veritabanındaki nesnelerin şemasını ve veri dosyalarını hazırlayıp snapshot klasörüne ekler. Tüm replikasyon yöntemlerinde etkili olup distributor tarafında çalışır.</p>
<p><B>Distribution Agent (distrib.exe)</B>: Snapshot klasörüne erişip şema ve verileri üyelere kopyalarak onları ilklendirir ve distribution veritabanındaki değişiklikleri abonelere aktarır. Aktarım işlemi pull (çekme) yöntemini kullanıyorsa bu agent, distributor üzerinde, push (gönderme) yöntemini kullanıyorsa distributor  üzerinde çalışır. Snapshot ve transactional replication&#8217;da kullanılır.</p>
<p><B>Log Reader Agent (Logread.exe)</B>: Sadece Transactional replication&#8217;da çalışıp publisher veritabanına ait transactional logları okuyup dağıtıcıya (distribution database) aktarır. Bu agent, dağıtıcı tarafında çalışır.</p>
<p><B>Queue Reader Agent (qrdrsvc.exe)</B>: Aboneler tarafında Microsoft Message Queue&#8217;da (MMQ) veya SQL Server&#8217;in kendisine ait kuyrukta bekleyen değişiklikleri yayıncıya aktarmak için kullanılır. Dağıtıcıda çalışan bu agent Transactional replication&#8217;da seçmeli olarak çalışır. Bu agent&#8217;in devreye girmesi için &#8220;Queued Updating&#8221; seçeneğinin aktifleştirilmesi gerekir. </p>
<p><B>Merge Agent (replmerg.exe)</B>: Snapshot ve transactional replication yöntemlerinde abone veritabanının ilklendirilmesi, distribution veritabanındaki değişikliklerin abone veritabanına yansıtılması Distribution Agent tarafında yapılmaktaydı. Distribution Agent, Merge Replication yönteminde devreye girmez. Distribution Agent&#8217;in yaptığı bu işi Merge Replication&#8217;da Merge Agent üstlenir. Yayıncı ve ona ait aboneler arasında yayın senkronizasyonu sağlayan bu agent, Pull (çekme) yönteminde, subscriber üzerinde, push (gönderme) yönteminde publisher üzerinde çalışır. </p>
<p>Bu agent&#8217;lerin hangi replikasyon yönteminde devreye girdikleri aşağıdaki tabloda gösterilmiştir.<br />
<img src="http://www.ahmetkaymaz.com/wp-content/uploads/SQL_Replication_2.jpg" /></p>
<p><B>Distribution Database</B><br />
Distribution veritabanı yayıncı ile ona bağılı aboneleri veri ve şema düzeyinde senkronize etmek için kullanılır. Bu amaçla abonelere yansıtılmayı bekleyen transactionları saklar. Transactionlar aboneler tarafından başarılı bir şekilde alınıp restore edilinceye kadar distribution veritabanında saklı tutulur. Distribution veritabanındaki bazı önemli sistem tabloları şunlardır;</p>
<p><B>MSmerge_history</B>: Abonelerin önceki güncellemeleri hakkındaki bilgiyi içerir.<br />
<B>MSmerge_agents </B>: Merge agent&#8217;leri hakkındaki bilgileri içerir.<br />
<B>MSdistribution_agents</B>: Distribution agent&#8217;leri hakkında bilgi içerir.<br />
<B>MSdistribution_history </B>: Distribution agent&#8217;lerin geçmişteki işlemlerini içerir.<br />
<B>MSlogreader_agents </B>: Yerel dağıtıcıdaki log reader agent&#8217;ler hakkında bilgi içerir.<br />
<B>MSlogreader_history </B>: Log reader agent&#8217;lerinin geçmişteki işlemlerini içerir.<br />
<B>MSrepl_commands</B>: Replike edilmiş komutları içerir.<br />
<B>MSrepl_errors</B>: Başarısız olmuş replikasyon işlemlerini içerir.<br />
<B>MSrepl_transactions</B>: Replike edilmiş her transaction için tek satır içerir.<br />
<B>MSrepl_version </B>: Tek bir satıra sahip olup mevcut replikasyonun sürümü hakkında bilgi verir.</p>
<p>Bu makalede replikasyonla ilgili terminolojiyi anlatmaya çalıştık. <a href="">Sonraki makalede</a> SQL 2000 ve 2005 üzerinde replikasyon türlerinin nasıl kurulacağını örneklendireceğiz.<!--more--></p>
<p>Kaynakça:<br />
<I>msdn.microsoft.com<br />
www.sbeeh.com<br />
www.databasejournal.com<br />
www.dell.com</I></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/01/07/sql-server-data-replication-veri-yineleme-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server Log Shipping (Günlük Gönderme)</title>
		<link>http://www.ahmetkaymaz.com/2008/01/04/sql-server-log-shipping-gunluk-gonderme/</link>
		<comments>http://www.ahmetkaymaz.com/2008/01/04/sql-server-log-shipping-gunluk-gonderme/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 15:04:35 +0000</pubDate>
		<dc:creator>Ahmet Kaymaz</dc:creator>
		
		<category><![CDATA[SQL Server, Oracle]]></category>

		<guid isPermaLink="false">http://www.ahmetkaymaz.com/?p=219</guid>
		<description><![CDATA[SQL Server yüksek erişilebilirlik çözümlerinden olan Log Shipping modelinde öncelikle aktif (birinci) sunucunun full backup&#8217;ı alınıp ikinci sunucuya kopyalanır ardından belirli peryodlarda birinci sunucunun log backup&#8217;ı alınıp ikinci sunucuya kopyalanır. Böylece iki sunucununun veri tabanı düzeyinde aynı olması sağlanmış olur. SQL Server 2000 üzerinde log shipping işlemi için Enterprise Manager&#8217;ın Database Maintenance Plan Wizard aracı [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server yüksek erişilebilirlik çözümlerinden olan Log Shipping modelinde öncelikle aktif (birinci) sunucunun full backup&#8217;ı alınıp ikinci sunucuya kopyalanır ardından belirli peryodlarda birinci sunucunun log backup&#8217;ı alınıp ikinci sunucuya kopyalanır. Böylece iki sunucununun veri tabanı düzeyinde aynı olması sağlanmış olur. SQL Server 2000 üzerinde log shipping işlemi için Enterprise Manager&#8217;ın Database Maintenance Plan Wizard aracı kullanılır. Bu aracı kullanmadan önce aşağıdaki notları dikkate almamız gerekir.<span id="more-219"></span></p>
<p>1 - İlk adım olarak Log shipping modeline dahil edilecek <B>primary server</B> ve <B>secondary server</B> sunucuları tanımlanır. Bu iki sunucu mutlaka iki ayrı fiziksel sunucu olacak diye bir durum yok. Aynı sunucu üzerindeki iki veritabanı arasında da  log shipping işlemi yapılabilir. Ayrıca riski azaltmak amacıyla birden fazla secondary server kurulabilir. Primary database&#8217;in <B>full</B> veya <B>bulk-logged</B> recovery modelini kullanması gerekir. </p>
<p>2 - Seçmeli olarak bir <B>monitor server</B> kurulur. Monitor server, primary database üzerinde en son ne zaman transaction log alındığını, secondary server&#8217;in en son hangi backup dosyalarını kopyaladığını ve restore ettiğini ve bu süreçteki hataları izler. Monitor sunucunun, primary ve secondary sunucularından ayrı olması tavsiye edilir. Bir monitor sunucusu yapılandırıldıktan sonra log shipping kaldırılmadan bir daha yeniden yapılandırılamaz.</p>
<p>3 - Sunucuların güvenlik ayarının düzenlenmesi. Log shipping işlemini yaptığımız Windows kullanıcısının tüm sunucularda SQL Server systems administrator (sa) yetkilerine sahip olması gerekir.</p>
<p>4 - Paylaşım klasörlerinin oluşturulması. Primary ve secondary olmak üzere iki dosya paylaşımının yapılmış olması gerekir. Önce birinci sunucu tarafında kaynak veritabanının transaction loglarının tutulacağı bir klasör ardından ikinci sunucu tarafında bu logların taşınacağı ve restore edileceği bir klasör oluşturulur. Burada dikkat edilmesi gereken konu her ikisi sunucudaki SQL Agent&#8217;in kullandığı Windows kullanıcısının bu klasörler üzerinde yetkilerinin olmasıdır.</p>
<p>5 - Ardından bu üç sunucu (primary, secondary ve monitor) Enterprise Manager / Management Studio üzerine register edilir. </p>
<p>Aşağıdaki şekilde log shipping modeli çizilmiştir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_1.jpg" /></p>
<p>Şimdi bu işlemleri üzerinde adım adım uygulayalım. Kaynak ve hedef olmak üzere iki tane sunucumuz var.<br />
Primary Server -> WXX\KAFKA<br />
Secondary Server -> DW</p>
<p>Birinci sunucu (WXX\KAFKA) üzerinde log backuplarının alınacağı klasörü oluşturalım. Örneğin C:\LogShipOrnek\Logs\ olarak oluşturduğumuz klasör için \\WXX\Logs\ şeklinde erişebileceğimiz şekilde bir share folder oluşturalım. Bu klasöre hem birinci hem de ikinci sunucu erişecek şekilde yetkilendirme yapalım. Dışarıdan bu klasöre backup dosyaları kopyalanacağı için en iyi çözüm Everyone&#8217;a full hak vermektir.</p>
<p>Hem DW hem de WXX\KAFKA sunucusunu Enterprise Manager üzerinde register ettikten sonra &#8220;Management » &#8220;Database Maintenance Plan&#8221; aracığını sağ tıklayarak &#8220;New Maintenance Plan&#8221; menüsünü tıklayıp sihirbazı başlatalım. Bilgilendirme ekranını geçtikten sonraki ikinci ekranda hangi veritabanlarının bu modele dahil edilip edilmeyeceği seçilir. Log shipping işleminin kullanılması için bu ekrandaki &#8220;<I>Ship the transaction logs to other SQL Servers (log shipping).</I>&#8221; seçeneğinin seçilmiş olması lazım. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_2.jpg" /></p>
<p>Bu ekrandan sonraki ekranlarda optimizing data, checking integrity veya performing a full database backup ile ilgili herhangi bir seçenek girmeyip &#8220;<I>Specify Transaction Log Backup Disk Directory</I>&#8221; ekranına gelinceye kadar tüm ekranları geçelim. Bu ekranda &#8220;Use This Directory&#8221; seçeneğini işaretleyip &#8220;C:\LogShipOrnek\Logs&#8221; klasörünü gösterelim. Aynı zamanda bu ekrandaki &#8220;Remove Files Older Than&#8221; seçeneğini kullanarak log backupların ne kadar süre arşivde bekleyeceğini de belirleyebiliriz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_3.jpg" /></p>
<p>Bu ekrandaki ayarlara göre log dosyaları ilgili klasörde <i>Kaynak_tlog_yyyymmddhhmm.trn</i> olarak kayıt edilir. Sonraki ekran olan &#8220;Specify the Transaction Log Share&#8221; ekranında log backup klasörünün networkten erişim yolunu yazalım (\\WXX\Logs\ ).</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_4.jpg" /></p>
<p>&#8220;Specify the Log Shipping Destinations&#8221; ekranında Add buttonunu tıklayıp ikinci sunucu veya sunucuları ekleyelim.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_5.jpg" /></p>
<p>Bu ekranda yedek sunucu olarak görev yapacak olan DW sunucusunu ekledik. Ayrıca DW üzerinde veri tabanı ilk defa yaratılacağı için mdf ve ldf dosyalarının hangi klasörde olacağını ve log dosyalarının DW tarafında hangi klasöre kopyalanacağını tanımlıyoruz. Bu ikinci sunucunun nonrecovered durumunda olması gerekir.<br />
no recovery mode - Veritabanına her türlü kullanıcını erişimini engeller<br />
standby mode - Sadece okunabilir (read-only) erişimlere izin verir. Ayrıca transaction logların restore edilmesi esnasında bağlı kullanıcıları sonlandırmak için bu ekrandaki <i>&#8220;Terminate users in database&#8221;</i> seçeneği kullanılır.</p>
<p>Sunucuyu ekleyip diğer ekrana geçelim;&#8221;Initialize the Destination Databases&#8221;. Bu ekranda iki sunucuyu eşitlemek için gerekli olan full backup&#8217;ın şimdi mi alınması yoksa daha önce alınıp alınmadığını belirtiyoruz. Kaynaktaki veritabanımız çok büyükse bu işlemi gece almamız daha uygun olacaktır. Ekranda gösterildiği gibi full backupın şimdi alınmasını sağlayıp diğer ekrana geçelim.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_6.jpg" /></p>
<p>Sonraki ekran olan &#8220;Log Shipping Schedules&#8221; ekranı log shipping işlemlerinin hangi sürelerde gerçekleştirileceği belirtilir.<br />
<B>Copy/Load Frequency</B>, ne sıklıkta backup dosyalarının ikinci sunucuya kopyalanacağı ve restore edileceğini belirtir.<br />
<B>Load Delay</B>, backup copy veya restore jobları arasındaki süreyi belirtir. Bu süreyi azaltmak için değeri sıfıra yaklaştırmalıyız. Nitekim bu alanın varsayılan değeri 0&#8242;dır.<br />
<B>The file-retention period</B>, ikinci sunucuda log backupların ne kadar süre tutulacağını belirtir. Varsayılan değerde olduğu gibi son 24 saate ait backupların tutulması tavsiye edilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_7.jpg" /></p>
<p>Bir sonraki ekrana geçelim. &#8220;Log Shipping Thresholds&#8221; ekranında backupların alınamaması ve restore jobların çalışmaması için ne kadar mühlet verileceği belirtilir. Diğer ekranda monitor server seçilir. Burada birinsi sunucuyu izleme sunucusu olarak işaretledik.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_8.jpg" /></p>
<p>Sonraki ekranları da düzenleyip kurulum işlemini bitirelim.</p>
<p>&#8220;DB Maintenance Plan1&#8243; uygulaması oluşturulduğunda öncelikle WXX\KAFKA tarafındaki C:\LogShipOrnek\Logs klasöründe Kaynak_logshipping_init.bak isimli full backup oluşturulur. Ve ikinci sunucu (DW) tarafında aşağıdaki ifade aracılığıyla bu full backup ikinci sunucuya kopyalanır.</p>
<pre name="code" class="sql">DECLARE @rv int
EXECUTE @rv = master.dbo.xp_cmdshell N'copy "\\Wxx\Logs\Kaynak_logshipping_init.bak" "C:\LogShipOrnek\LogBackupFile\Kaynak_init.bak"', no_output
SELECT @rv</pre>
<p>Ardından ikinici sunucu tarafında bu full backup verdiğimiz klasörlere uygun olarak restore edilir.</p>
<pre name="code" class="sql">RESTORE DATABASE [Kaynak] FROM  DISK = N'C:\LogShipOrnek\LogBackupFile\Kaynak_init.bak' WITH  FILE = 1,  NOUNLOAD ,  STATS = 10,  STANDBY = N'C:\LogShipOrnek\Data\undo_Kaynak.dat',  MOVE N'Kaynak_Data' TO N'C:\LogShipOrnek\Data\Kaynak.mdf',  MOVE N'Kaynak_Log' TO N'C:\LogShipOrnek\Data\Kaynak_log.ldf'</pre>
<p>Ve yeni yaratılan bu database standby moduna geçirilir.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_9.jpg" /></p>
<p>Log shipping modelinde kullanılan birinci ve ikinci sunucu tanımlamaları, en son hangi düzeyde backup alındığı ve restore edildiği gibi bilgiler msdb altındaki log_shipping_primaries, log_shipping_secondaries ve sysdbmaintplan_databases tablolarında tutulur.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_10.jpg" /></p>
<p>Log shipping ayarlarını düzenlemek veya silmek için &#8220;DB Maintenance Plan1&#8243; dosyası çift tıklanır ve açılan penceredeki &#8220;Log Shipping&#8221; sekmesi kullanılır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_11.jpg" /></p>
<p>Ayrıca Log Shipping sürecinin takibi için Enterprise Manager altındaki Management bölümündeki &#8220;Log Shipping Monitor&#8221; alanı kullanılır. Buradan en hangi backupların alındığı, kopyalandığı ve karşıya yüklendiği bilgileri öğrenilir.</p>
<p>Log shipping, backup job, copy job, restore job ve alert job olmak üzere 4 temel job oluşturur. <B>Backup Job</B>, her primary database için primary server üzerinde oluşturulur. Varsayılan olarak bu job 15 dk&#8217;da bir çalışır. <B>Copy Job</B>, secondary server üzerinde oluşturulur. Bu job, primary server&#8217;den secondary server&#8217;e backup dosyalarını kopyalar. <B>Restore Job</B>, secondary server üzerinde oluşturulur. Bu job, kopyalanmış olan backup dosyalarını  secondary database&#8217;ler üzerinde restore eder. <B>Alert Job</B>, eğer kullanıldıysa bu job monitor server üzerinde oluşturulur. Bizim örneğimizde monitor server olarak birinci sunucuyu seçtiğimiz için bu job birinci sunucu üzerinde oluşturuldu. Bu job, primary ve secondary database&#8217;ler tarafından paylaşımlı olarak kullanılıp backup ve restore işlemlerinin başarısız olması durumunda uyarı verir. Eğer  monitor server kullanılmazsa alert job hem primary server hem de her secondary server üzerinde oluşturulur. Primary server üzerindeki alert job, backup işlemi başarısız olduğu zaman, secondary server üzerindeki alert job ise kopyalama ve restore işlemleri başarısız olduğu zaman uyarı evrir.</p>
<p>SQL 2005&#8242;te log shipping işleminin nasıl yapılacağını da örneklendirelim. Bu sefer hem kaynak hem de hedef database aynı sunucu üzerinde bulunsun.</p>
<p>Primary Server -> AHMETKAYMAZ<br />
Secondary Server -> AHMETKAYMAZ<br />
Primary Database -> Kaynak1<br />
Secondary Database -> Kaynak2</p>
<p>Log backupların alınacağı klasör ->C:\LogShipOrnek\Logs<br />
Log backupların ikinci sunucu tarafından kopyalanacağı klasör -> LogsCopy<br />
Kaynak2 veritabanının veri klasörü->C:\LogShipOrnek\Data<br />
Kaynak2 veritabanının log klasörü->C:\LogShipOrnek\Log</p>
<p>SQL Server Management Studio aracını açıp Kaynak1 veritabanını sağ tıklayarak &#8220;Tasks » Ship Transaction Logs&#8221; menüsünü Log Shipping penceresini açalım. Bu pencereye Kaynak1 veritabanının Properties bölümünden de erişilebilir. </p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_12.jpg" /></p>
<p>Bu ekranda öncelikle Kaynak1 veritabanının birincil veritabanı olduğunu belirtiyoruz. Ekrandaki &#8220;Backup Settings&#8221; buttonunu tıklayıp yedek dosyalarıyla ilgili ayarlar yapalım.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_13.jpg" /></p>
<p>Yedek klasörlerinin ağ ve yerel konumlarını girdikten sonra pencereyi kapatalım. Bir sonraki adım yedek sunucularını tanımlamaktır. Bunun için &#8220;Secondary server instances and databases&#8221; bölümünde Add düğmesini tıklayalım. &#8220;Secondary Database Settings&#8221; penceresinde ikinci sunucuyla ilgili ayarlar yapılır. Connect düğmesini tıklayıp ikinci sunucu olarak mevcut birinci sunucuyu göstereceğiz. Yedek veritabanının adını Kaynak2 olarak giriyoruz ve bu veritabanı şu anda sistem üzerinde hazır olmadığı için birinci veritabanında full backup alınmasını ve Kaynak2 olarak restore edilmesini sağlayacağız.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_14.jpg" /></p>
<p>İkinci sunucuyla ilgili ayarları da bitirdikten sonra bu süreci izleyecek bir monitor server tanımlayalım. Bunun için ana penceredeki &#8220;Use a monitor server instance&#8221; seçeneğini işaretleyip Settings düğmesini tıklıyoruz. Monitor server olarak mevcut sunucuyu göstereceğiz.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_15.jpg" /></p>
<p>Artık SQL Server 2005 üzerinde log shipping işlemini hazırlamış olduk. OK düğmesini tıklayarak gerekli jobları oluşturalım. İşlemi başlattığımız anda Kaynak2 veritabanı salt-okunur modunda oluşturulur ve işlemleri yürütecek joblar yaratılır.</p>
<p><img src="http://www.ahmetkaymaz.com/wp-content/uploads/Log_Shipping_16.jpg" /></p>
<p>Son olarak şu notu ekleyelim SQL 2005 ve SQL 2000 arasında secondary/primary veya primary/secondary olarak log shipping kurulamaz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkaymaz.com/2008/01/04/sql-server-log-shipping-gunluk-gonderme/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
