

Merhaba, yazı dizine stajın 3. haftasından devam ediyoruz. 18.07.2007 günü Alp Emre'nin "SQL, PL/SQL and Java" konulu sunumu vardı. Basit bir konu aslında, temel olarak SQL'den, PL/SQL'den ve Java'dan bahsedildi. Aslında her biri başlı başına bir eğitim konusu fakat bu bir introduction tadındaydı :)


Bu konuda bahsedilecek çok fazla birşey yok, sunum da gayet güzel hazırlanmış zaten. Alp Emre'nin sunumunu buradan indirebilirsiniz. Bende konu hakkında bir kaç notumu paylaşacağım:
• SQL Database'lerin ortak dilidir. Database'ler SQL'den anlar. Makine dili Assembly'dir. Daha yüksek seviye programlama dillerinde yazdığımız bütün kodlar assembly'e çevrilir, ve makinede bu şekilde çalıştırılır. Bunun gibi, her ne kadar bazı uygulamalar daha yüksek seviye kontroller sunsa da, temelde SQL aracılığıyla database'e erişirler.
• Bir çok farklı database olduğu için SQL'in de bir standardı geliştirilmiştir. Bu standardın adı Ansi SQL'dir. Oracle, Ansi SQL'i tamamen desteklemekle birlikte, bunu kendi bir çok komutuyla da zenginleştirmiştir. Oracle'a has komutları içermeyen SQL'ler, Ansi SQL'i destekleyen diğer bir çok database uygulamasında da çalışacaktır.
• SQL'i işlevine göre bir çok kategoriye ayırabiliriz. Bu kategoriler ve tanımlarına girmeyeceğim. Sunumda hepsi var zaten.
• Sunumda, cursor'lardan ve shared SQL'den de bahsedildi. Daha öncki sunumları, özellikle Ersin'in sunumunu takip edenler cursorlara yabancı değillerdir. Ersin'in "Statement Processing" sunumuyla ilgili günlüğe buradan, cursorlar hakkında geniş bilgi içeren bir başka makaleme ise buradan
ulaşabilirsiniz.
• SQL'in nasıl parse edildiği ve çalıştırılırken hangi adımlardan geçtiği yine Ersin'in sunumu'nda daha ayrıntılı olarak anlatıldı. Okumayanların o sunuma da göz atmasını tavsiye ederim.
• PL/SQL, Oracle'ın prosedürel dilidir. SQL'in bir programlama dili gibi geliştirilmiş halidir. PL/SQL'de normal programlama dilleri gibi döngüler, fonksiyonlar, prosedürler, paketler ve değişkenler mevcuttur. Fakat yine de temelde database ile bağlantı kurulan kısımlar PL/SQL blokları içinde de olsa SQL cümleleridir. Database'in dilinin SQL olduğunu daha önce belirtmiştim. Developer'ların işi de zaten büyük oranda bu PL/SQL kodlarını, paketleri ve prosedürleri yazmaktır.
• PL/SQL paketleri, bir çok prosedür'ü içinde bulunduran bir yapıdır. Java'daki
Package'lara benzetebiliriz. Bu kod ve paketler, hem text olarak hem de compile edilmiş vaziyette database'de saklanır. Bir paket ilk çalıştırıldığı an, bir kez compile edilir. İçinde hata bulunan paketler invalid duruma düşerek her çağrıldığında compile edilmeye çalışılır.
• Java'dan da biraz bahsedildi. Aslında bu sunumdaki Java kısmı bir Java dersi şeklinde
değildi. Zaten Java'nın hiçbir kısmını 1 saatlik bir sunumda anlatmak mümkün değil :) Sunumda anlatılan, Oracle'ın Java Stored Procedure'ları desteklediğidir. Oracle üzerinde Java kodları saklanarak çalıştırılabilir. Bu Java kodlu prosedürlere Java Stored Procedures denir. Oracle'ın kendi içinde bir JVM'i vardır ve Java kodlarını bu şekilde çalıştırır. Burada önemli nokta ise, Java her ne akdar desteklense de Oracle'a uzak bir dil olduğundan ve JVM üzerinden çalıştığından PL/SQL'e göre daha yavaş çalışır. Bu yüzden PL/SQL paketleri ile yapabileceğimiz herşeyi, özel olarak ihtiyaç duymuyorsak PL/SQL ile yapmalıyız.
Alp Emre'nin sunumu bunları içeriyordu. Sunuma bir göz atmanızı öneririm. Alp Emre'nin sunumunu buradan indirebilirsiniz. Aynı zamanda geçen senelere ait, Seven'in SQL konulu sunumu ve Efficient SQL konulu sunumlarını, TonguÇ'un "PL/SQL ve Java" konulu sunumunu, Hüsnü'nün PL/SQL konulu sunumunu, Burak ÇELEBİ'nin "PL/SQL Best Practices" konulu sunumunu da buradan indirebilirsiniz. Bu sunumlarda çok daha fazla bilgiye ulaşabilirsiniz.
19.07.2007 perşembe günü oldukça yoğun şanssızlıkların ardından Ersin'in gerçekten çok iyi hazırlanmış olduğuna emin olduğum workshop'ının ertelenmesiyle sonuçlandı.
Haftanın son gününde Mert İNAN'ın sunumu vardı. Konu, Mert'in ilk haftalarda yaptığı Undo/Redo ve Transaction management konusunun advanced haliydi: "Redo Internals".
Mert, tabi haliyle bu konuda bir kitap falan yazmamış olduğu için, Julian DYKE'ın sunumu üzerinden gitti.
Yanlız baştan uyarayım, sunum fazlasıya advanced bir sunum, dolayısıyla anlamadığınız yerlere takılmayın, anladığınız yerlere, animasyon falan olan neşeli yerlere bir göz gezdirin sadece :)
Şu an sunumu tekrar inceleyerek gözüme takılan, aklıma gelen ufak tefek notları sizinle paylaşacağım:
• "Redo log nedir?" sorusunun cevabıyla başlamak gerekiyor sanırım. Redo log'lar, database'deki bütün değişiklikleri tutan yapılardır. Peki redo log'lar ne işe yarar? En önemli görevleri sanırım database'in anormal sonlanması(elektrik kesilmesi vs.) durumunda instance recovery için kullanılmalarıdır. Bunun dışında backup için de kullanılırlar. Şöyle ki: Database'inizin dün alınan bir yedeği varsa ve bugün de yedeğini almak istiyorsanız, bütün database'in yedeğini almak yerine sadece bugüne ait redo dosyalarını alıp dünkü yedeğinize uygulayarak database'inizin bugünkü haline ulaşabilirsiniz. Ayrıca bir de, flashback veya normal recovery esnasında undo log'larla birlikte kullanılırlar. Redo log'lar database'imiz için kritiktir.
• Redo loglar, database üzerinde yapılan her değişikliği kaydeder. Aslında her değişikliğin son hali redo log'larda, önceki hali undo log'larda tutulur. Redo log'lara niye ihtiyacımız olduğu konusuna biraz daha değinelim:
Redo log'lar aslında memory'mizin yedeği gibidir. Oracle hiçbir zaman o anda yapması gerekmeyen, maliyetli bir işi o anda yapmaz. Datadaki her değişikliğin diske yazılmadan önce memory'de tutulduğunu biliyoruz. Yoksa her seferinde diske gitseydi zaten bu çok maliyetli olurdu. Undo log'larda aynı şekilde dike yazılmadan önce memory'de tutulur. Temelde problem, anormal bir sonlanma (elektrik kesilmesi, diskin uçması, OS'nin uçması, makinenin reset yemesi, Oracle processlerinin zorla sonlandırılması vs.) durumunda memory'nin uçmasıdır. Bu durumda Oracle'ı tekrar başlattığımızda bellekteki verileri orada bulamayacağız. İşte bu yüzden, bellekteki verilerin hepsine değil de, bizim için kritik olanlara, bizim için kritik olan zamanlarda ihityacımız var. Örneğin, commit edilen veri, henüz datafile'lara yazılmamışken makine uçsa bile, databse'in tutarlılığı için onlara ihtiyacımız var. Redo log'lar işte bu memory'deki verilerin yedeğidir. Oracle mecbur kalmadığı sürece belli aralıklarda ve mecbur kaldığı an derhal bu redo log'ları diske yazar. Redo log'lar anormal sonlanma sonrasında Oracle yeniden açıldığında, memory'deki kritik bilgileri tekrar memory'e yükleyerek (adeta sonlanmadan önceki memory verisini geri getirerek) hayatımızı kurtarır :)
• Redo log'lar data'daki her değişiklik için üretilir. DML komutları, DDL komutları ve recursive statementlar, hepsi redo log üretir.
• Redo log'ları diske Oracle'ın LGWR(Log Writer) isimli bir prosesi yazar.
• Online redo log'lar ve Archive redo log'lar var. Anlık(online) Redo log'lar normalde diskte bir kaç dosya üzerindedir. Bu dosyalar sırayla kullanılır. Sonuncu da yazılıp dolduğunda yazma işlemine baştakinden devam edilir. Bu ekilde log'lar diske yazılır. Fakat bu durumda, bütün log dosyaları dolup baştakine yazmaya başladığımızda, aslında daha önceki redo verisini kaybetmeye başlarız. Geçmişteki bu redo verisi bizim için kritikse, onun üzerine yazılmadan önce o arşivlenmeli. İşte Archive redo log'lar da, bu Online redo log'ların arşivlenmiş kopyalarıdır. ARşiv redo log'larını yazmaktan ise ARCH(Archiver) isimli Oracle prosesi sorumludur. Sunumun6. sayfasında, bu redo log'ların yazılması ver arşivlenmesini çok güzel anlatan animasyonlu bir slayt var.
• Sunumda daha sonra, Redo log'ların iç yapısına girilmiş. hangi operasyondan sonra nasıl bir redo verisi üretilir, onun üzerinde durularak tek tek örneklenmiş. Bir developer için (hatta normal bir DBA için bile) bunlar çok fazla ayrıntı. O yüzden bunlara tek tek girmeyeceğim. Fakat siz de benim gibi ille mantığını en ince ayrıntısına kadar hemen öğrenme manyağı(güzel tanım oldu bu ya aslında :) ) iseniz sunumu incelemeye devam edebilirsiniz. Arada sıkılırsanız kendinize mola verip sonr devam edin, çünkü sıkılacaksınız :)) Sunumun ilerleyen kısımlarında, dediğim, hangi operasyondan ne tip bir redo verisi üretilir konusu ilginç. Ama "banane ulan" diyorsanız, Oracle'ın, her operasyon için, o operasyonu tekrar gerçekleştirebilecek ve verinizi kurtaracak kadar (ama kesinlikle daha fazlasını değil) bilgiyi redo log'larda sakladığını bilmeniz yeterli.
Julian DYKE'ın
sunumu da bu şekilde sürüp gidiyor. Sunumu bu linkten indirebilirsiniz. Fakat bundan önce, eğer bakmadıysanız Mert'in transaction'ın ne olduğu konusundaki sunumuna ait makalemi de incelemelisiniz. Bir de, bu redo konusunu daha basit ve daha iyi anlamak için, KYTE'ın "Expert Database Architecture" kitabının 9. Chapter'ını incelemenizi kesinlike öneririm. DYKE'ın sunumu sizi baydıysa bile, siz yine de KYTE'ın kitabına kesinlikle göz atın :))
Konular ilerledikçe, birbiriyle bağlantılı konuların sayısı artıyor ve konular birbirini tamamlıyor hale geliyor dikkat ederseniz. Zaten bir hafta sonraki konulardan sonra temelde "Concepts Guide" ve KYTE'ın kitaplarındaki önemli chapter'lar bitmiş olacak.
Herkese iyi çalışmalar.