Category Archives: DATABASE

SQL SERVER 2005: MASTER.MDF IS COMPRESSED

sqlhata.jpg Bir süredir SQL Server 2005 maceralarımı yazmıyordum. Bu zaman sürecinde çok fazla malzeme birikti :) Bunlardan birini blogumda paylaşmak istedim. Cumartesi sabah projeme ait veritabanını bulunduğu sunucudan kendi makinama aktarmak için SQL Server servisini başlatmak istedim fakat ne mümkün. Servisin time-out süresini doldurduğunu ve başlatılamadığını söyleyen hoş bir hata mesajı (artık alıştım ben bu hata mesajlarına ondan dolayı HOŞ dedim).

Ben bu hata mesajını daha önce de almıştım. Hatta o zaman sorunu çözmeye üşenmiş ve bir gece öcde aldığım sistem yedeğimi geri yükleyerek çalışmaya devam etmiştim. Bu defa sorunu çözeyim delikanlı gibi dedim ve neler olup bittiğini nasıl anlarım diye düşünürken APPLICATION LOG ‘larına bakmayı akıl ettim. Eventvwr.msc komutuyla açtığım Event Viever üzerinden Application sekmesine gelince gördüğüm hata işaretleri ve yanında yazan MSSQL$SQL2005 yazısını görünce doğru yolda olduğumu anladım. Öyle de oldu ve resimde gördüğünüz (lütfen tıklayınız) ekran karşıma çıktı.

Burada master.mdf dosyasının sıkıştırılmış olduğunu ve decompress edilmesi gerektiği yazıyordu. İyi hoş ama ben bu dosyanın bulunduğu dizinde sıkıştırma uygulamamıştım ki. Hatta işletimim sistemimin kurulu olduğu disk bölmesinde herhangi bir disk sıkıştırması uygulamıyordum. Yeri gelmişken söyleyeyim; NTFS dosya sistemi ile hayatımıza giren disk sıkıştırma olayı disk alanı açısından bizlere kazanç sağlarken okuma-yazma performansı açısından olumsuz sonuçlar doğurabiliyor. Bu nedenden ötürü işletim sisteminizin bulunduğu disk bölümünde sıkıştırma uygulamanızı önermiyorum.

Konuya dönecek olursak SQL Server 2005 master.mdf (SQL Server ‘ın hayati veritabanı dosyasıdır ve mutlaka yedeklenmelidir) dosyasını sıkıştırmıştı. Gidip dosya özelliklerinden sıkıştırma işlemini iptal edince SQL Server hayat döndü ve servis rahatlıkla başladı.

Bir kaç kere daha bahsetmiştim hatta Microsoft yetkilileri de bunu kabul etmiştir ki SQL Server 2005 ‘in Stroge Engine ‘i malesef biraz pürüzlü. Büyüyen dosya boyutlarına çare olarak disk sıkıştırması kullanan sevgili RDBMS ‘im malesef kendi sıkıştırdığı dosyayı açamamıştır.

SQL Server 2005 maceralarımı burada paylaşmaya devam edeceğim. Çok güzel ve çok özel hata mesajları yakaladım sizin için. Beni okumaya devam edin…

NORMALIZE UNTIL IT HURTS DE-NORMALIZE UNTIL IT WORKS

database.gifBu yazıyı daha önce yazmayı düşünüyordum ama başlıktaki cümleyi tam olarak hatırlamam bir ayımı aldı . Sonunda cümleyi not aldığım yeri buldum ve konuyu buraya taşıyorum. Bu arada başlıktaki güzel sözün Jason Couhman ‘a ait olduğunu da öğrendim.

NORMALIZATION ve DE-NORMALIZATION kavramlarını bir buçuk ay önce moderatörü olduğum JDBC_TR  mail grubunda da tartışmaya açmıştım. Gerçekten de çok değişik cevaplar gelmişti. Bu yazıda normalization yada de-normalization nedir üzerinde durmayacağım. Merak edenler yada hiç bilgisi olmayanlar buradan birşeyler öğrenelebilirler.

Veritabanı yönetim sistemleri dersi alanlar yada az buçuk veritabanı kavramıyla işi olanlar normalization ve normal form terimlerini mutlaka duymuşlardır. Derslerde yada sınavlarda harıl harıl normalizasyon yapmaya çalıştığımızı hatırlıyorum. 1.NF(NORMAL FORM), 2.NF, 3.NF, 4.NF, 5.NF hatta 6. NF, BOYCE-CODD, DOMAIN/KEY olmak üzere benim bildiğim 8 adet normalizasyon kuralıvar. Bunlardan esas olanlar ilk 3 tanesidir. Yani ilk üç normal formu refleks olarak uygulayabilmeniz beklenir sizden.

Aslında bu normal form olayına öğrenme aşamasındayken dikkat ediyoruz , daha sonra tasarım yaparken zaten otomatik olarak normal yapmaya başlıyoruz herşeyi (Deneyime bağlı olarak değişebilir :) ). Bu cümle ile İLK HATAYI DA YAPMIŞ OLDUM çünkü normalizasyon tasarım (design) aşamasında değil analiz aşamasında yapılması gereken bir işlemdir. Yani oluşturulacak veritabanı üzerindeki işlemlerin , kullanıcı sayısının ve diğer kriterlerin iyi bir şekilde analiz edilmesinden sonra buna karar verilir. 

Peki normalizasyon bize neler kazandırır?

  • Aynı veriden birden fazla olmasını engeller. (Avoids duplication)
  • Veri girişini daha efektif hale getirir.
  • Veri yönetimini kolayşlaştırır.
  • Disk alanının daha efektif kullanılmasını sağlar.

Bunlar normalizasyonun güzel yanları ki hep derslerde bunlardan bahsedilir. Sürekli birşeyleri normalize ederiz ve sütten çıkma ak kaşık gibi görürüz normalizasyonu. Halbuki yan etkileri de vardır. Örneğin:

  • Veri çekme  (Data Retrieval) işlemlerini zorlaştırır.
  • Daha karmaşık SQL ifadeleri gerektirir. ( Joinler havalarda uçuşabilir :) )

İşte bu yan etkilerinden dolayı bazı sistemlerde veya senaryolarda normalizasyon yerine de-normalizasyon dediğimiz yöntem tercih edilir.

De-normalize bir yapıda çoğu bilgi aynı tabloda tutulur. Mesela veritabanımızda bir kullanıcya ait email adreslerini saklamak istiyoruz. Bunu normalize bir şekilde yapmak istersek ayrı bir e-mail tablosu yaratıp kullanıcıya ait unique (tekil) bir değerle birlikte mail adreslerini buraya kaydederiz ve bu tablolar arasında PK/FK ilişkisi kurarız. Ama de-normalize bir yapıda doğrudan kullanıcı bilgilerinin olduğu tabloya kolon ekleyerek (n adet e-mail kolonu) yada satır ekleyerek (tüm bilgiler aynı sadece e-mail alanı farklı bir satır) bu işi halledebiliriz. Eğer tüm bilgiler aynı tabloda olursa sorgulama ,raporlama gibi işlmeler daha hızlı ve kolayca halledilebilir.

Görülüyorki normalizasyon ve de-normalizasyon konusu ciddi bir analiz istiyor. Genel olarak OLTP (ONLINE TRANSACTION PROCESSING) ortamlarında Normalizasyon doğal bir yaklaşımken OLAP (ONLINE ANALYTICAL PROCESSING) ortamlarında da De-normalizasyon doğal bir yaklaşımdır. Verilerimizi normalize etmek uğruna yüzlerce tabloya bölerken ilerisini de düşünmekte fayda var diyorum. Özelikle Datawarehouse yada Data Mart ortamlarında daha az ve büyük boyutlu tablolarla çalışılarak sorgulardan daha hızlı sonuç alınması sağlanır. Milyonlarca kaydın bulunduğu tablolar arasında JOIN yapmaya kalkmak ciddi performans sorunları yaratabilir. Bu nedenle az değişen (rarely updated), daha çok listemele ve raporlama gibi amaçlarla kullanılan , çok fazla tablo arasında join işlemi gerektiren verilerde de-normlizasyon yapılabilir. Fakat güncellemenin çok olduğu veri gruplarında normalizasyon işlemi VERİ TUTARLILIĞI için şarttır.

Bu konu üzerinde araştırma yaparken özellikle analiz amaçlı kullanılacak veri grupları için kurumların normalize olan tablolardaki verileri de-normalize bir tablo yapısına kopyalayarak, analiz ,raporlama vb.  işlemleri bunlar üzerinde yaptıklarını öğrendim. Bu noktada kurumlar kararı ya danışman şirketlere bırakıyorlar yada DBA ‘lardan görüş alıyorlar. Bazıları da Allaha emanet yaşıyorlar :) .

Bir diğer nokta da aslında herşeyin böyle milimetrik hesaplanmadığı gerçeği . Yukarıda yazanlar neydi peki diye sorabilirsiniz ki haklısınız da ama biraz rahat olmakta fayda var. Tablolarımızı  normalize yada de-normalize etmek için günlük hayatta bu kadar da çok ince eleyip sık dokumuyoruz. Özellikle de donanımların ucuzlamasıyla sonra performans dar boğazlarını insanlar donanım yükseltmeleriyle aşar oldular. Her ne kadar bir yazılımcı olarak bu yaklaşımı kabul etmek istemesem de bazen yazılımsal çözümler ve bunların maliyetleri (iş gücü, zaman vs.) donanımsal çözümlerden kat kat fazla olabiliyor.

Veritabanı yönetim sistemleri dersinin projesinin ilk raporu verileceği zaman daha projeye başlamadığımız için bir saatlik yemek arasında 2 sayfalık senaryoyu 3 tablo ile halletmiştik (Nasıl becerdik hala inanamıyorum ) . Ama raporlar incelip düzeltilmek üzere geri dağıtılınca pek de birşey beceremediğimiz ortaya çıkmıştı. Biz de ikinci raporda herşeyi ayrı tablolara koymaya kalkışınca bu defa tablo sayımız 3 ‘ten 13 ‘e çıkmıştı ama iş tabloları sorgulamaya gelince ve insan JOIN özürlü olunca baya bir ecel teri dökmüştük.

İşte yukarıda okuduğunuz  yazı o günlerde yaşadığım perişanlığın bir yansımasıdır. Umarım keyif alarak ve birşeyler öğrenerek okumuşsunuzdur. Hepiniz sağlıcakla kalın ve beni okumaya devam edin…  

KEYİFLİ BİR PARDUS İNCELEMESİ

baslik_ana21.png

Üyesi olduğum ve yazılanları severek okuduğum DarkHardware.com’da  yeralan Pardus incelemesine sizlerin de bakmasını istedim çünkü keyifli bir inceleme yapmış Mehmet Dündar Akın. Özellikle de soru cevap kısmı benim çok hoşuma gitti. Pardusu ilk çıktığı zamandan beri bootable cdler üzerinde hep denedim hatta bir kaç kere sistemime de kurdum ama hep bende bir soğukluk var unixgillere karşı. Ama kararlıyım Pardus’u kullanacağım. Diskimi böldüm bile Pardus 2007.1 çıkar çıkmaz indirip kuracağım. En çok sorun yaşadığım nokta Bootmanager konusunda oluyor. Linux kurulu disk bölmesini formatlayınca bootleader da uçuyor haliyle ve ntbootloader da dönmekte zorlanıyorum. Kendimce geliştirdiğim çözümler var ama pek efektif değil. Linux ile en büyük problemim sistemden kaldırma noktasında oluyor. Umarım bunları da aşacağım zamanla. Bir de hep Windows için user-friendly falan deyip durdular. Windows’un ciğerini bilen biri olarak hiçbir şekilde user friendly olmadığını söyleyebilirim. Şöyleki benim user-friendly anlayışım bazıları gibi böyle yanarlı dönerli ekranlar uçuşup kaçışan rengarenk pencereler değildir. User-friendly dediğin ayar yapmadan adam akıllı kendi kendine çalışabilen başarımı düşmeyen demektir benim için. Ama gelin görünki Windows işletim sistemlerinde binlerce ayar ve optimizasyon yapmama rağmen hala iyi verim aldığımı söyleyemiyorum.

Neyse laf uzadıkça konu Pardus incelemesinden çok Windows’a meydan dayağı olacak. O nedenle sizleri bu güzel incelemeyle başbaşa bırakıyorum.

http://www.darkhardware.com/st.php?u=articles/pardus_2007_tanitim

SQL SERVER 2005 MACERALARI BÖLÜM 1

Bu haftaiçi bir aksilik olmazsa CETURK.COM organizasyonuyla BTAkademi’de seminer veriyor olacağım. Aslında seminerden ziyade bir çalıştay (workshop) olacak. Bu çalıştayın bir kısmını ben bir kısmını da arkadaşım Mehmet Aca yürütecek. Ben özellikle ilgi alanımda olan konular üzerinde birşeyler anlatmayı tercih ettim ve çalıştay sırasında SQL Server kullanımı üzerine bir kaç demo yapacağım. Bugün de dedim hadi biraz hazırlık yapayım ve bağlandım SQL Server 2005 sunucuma. Buraya kadar herşey güzeldi…

Sonra düşündüm ki sunum sırasında sistemi kurcalamam yada değişiklik yapmam gerekir bu nedenle bazı veritabanlarının sql-server-job-error.JPGyedeğini almam doğru olacaktır. Bu da güzel.

Sonra olayı abartıp dedim ki bari yedekleme yapıcam şöyle güzel bir JOB tanımlayıp yapayım da ilerideki sunumlarda bunu da gösteririm.

Kolları sıvayıp tüm bilgileri güzelce girdim. Hangi işlemden sonra neler olacak, ne gibi adımlar yer alacak, kimlere uyarı gidecek , hangi zamanlarda çalışacağına dair bir sürü detayı girdimki sunumlarda bana kolaylık olsun. Ama gelin görünki kolaylık değil kabus oldu ve yukarıdaki hata tokat gibi yüzüme çarptı.

Ayda yılda bir teknolojinin nimetlerinden faydalanacaktık o da kısmet olmadı. Bir de o kadar detayı girdiğime yandım. Dedim bu hata bir tek benim başıma gelecek değil ya başlarının da başına gelmiştir. Biraz Google yaptım ama bir sonuç elde edemdim. Sonra kendi yöntemlerimle logları inceledim, servisleri yeniden başlattım vs. ama yine de sonuç aladım.

Özetle SQL Server 2005 ile macera dolu günler geçiriyorum ve işin kötüsü hala JOB tanımlayamıyorum. Bu hatayı alan yada çözümünü bilen allah rızası için buraya yorum olarak yazsın :)