Set as Homepage   Add to Favourites   Recommend   Contact



Menu

∙ Home
∙ Index (All Topics)
∙ About Me
∙ About This Blog
∙ Favourite Links
∙ RSS Feed

Categories

∙ ASP & PHP (1)
∙ HTML, XML and CSS (2)
∙ C / C++ (5)
∙ Java, JSP and Servlet (0)
∙ SQL-Oracle-PL/SQL (28)
∙ Operating Systems (1)
∙ OFF-Topic (8)

Popular Topics (Top 10)

∙ Decode Function in Oracle SQL (10430)

∙ Derin anlamlı sözler - Bunlar da Türkçe olanlar :) (9613)

∙ Turkcell Staj Günlüğü - 1: Introduction to Oracle (8682)

∙ Oracle performance analysis - Tracing and performance evaluation (7821)

∙ Implicit vs. Explicit cursors - Performance analysis (5222)

∙ Turkcell Staj Günlüğü - 4: Transaction Management (4267)

∙ Differences between C and C++ (3982)

∙ Turkcell Staj Günlüğü - 3: Tablespaces, Datafiles and Control Files (3779)

∙ Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals" (3607)

∙ Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments (3505)


Most Recent (Last 10)

∙ Matematik Asla Yalan Söylemez!

∙ Finding and Removing Loop on a Singly-Linked List

∙ Obfuscated C

∙ Is C a Vitamin? Yes, of course...

∙ Differences between C and C++

∙ Whence C? Why C? Whither C?

∙ Türkçe Karakterli Domain'lerin İç Yüzü

∙ Windows Source Codes

∙ Decode Function in Oracle SQL

∙ Hello World!


Recent Comments (Last 10)

∙ "Adulation?" By fizikci on Matematik Asla Yalan Söylemez!

∙ "Rehberlik için çook teşekkürler" By Pınar Tanrıverdi on Kahin'e yolculuk nasıl başlamalı?

∙ "bilgi paylaşıldıkça deger kazanır." By zülfü yıldırım on Turkcell Staj Günlüğü - 12: Partitioning

∙ "Teşekkürler" By serdar on Turkcell Staj Günlüğü - 12: Partitioning

∙ By Gokhan on Türkçe Karakterli Domain'lerin İç Yüzü

∙ "The Power of Attitude" By Tonguç Yılmaz on Matematik Asla Yalan Söylemez!

∙ ":)" By Ozay Akdora on Obfuscated C

∙ By Ömer YURDUSEVEN on Windows Source Codes

∙ By Özgür Macit on Türkçe Karakterli Domain'lerin İç Yüzü

∙ "Thanks" By Ganesh on Difference between db block gets and consistent gets


Archive (Last 12 Months)

∙ Feb, 2008 (4)
∙ Jan, 2008 (2)
∙ Dec, 2007 (1)
∙ Sep, 2007 (4)
∙ Aug, 2007 (9)
∙ Jul, 2007 (22)
∙ Jun, 2007 (3)
∙ Index (All Records)

Other Related Blogs

∙ Tom Kyte’s Blog
∙ Steven Feuerstein’s Blog
∙ Jonathan Lewis’s Blog
∙ H.Tonguç Yılmaz Oracle Blog
∙ Mennan Tekbir's Blog
∙ Hakkı Oktay’s Blog
∙ Osman Çam’s Blog

Stats

Total Topics
Total Topic Views
Total Comments
Unique Visitors
Total Visitors
: 45
: 120058
: 36

About this blog…
About this blog…
About Me
About Me
Favourite Links
Favourite Links
Neden hazır blog'ları kullanmadım ki?
Neden hazır blog'ları kullanmadım ki?
CSS is more powerful than you imagine
CSS is more powerful than you imagine
Turkcell Staj Günlüğü - 1: Introduction to Oracle
Turkcell Staj Günlüğü - 1: Introduction to Oracle
Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments
Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments
Kahin'e yolculuk nasıl başlamalı?
Kahin'e yolculuk nasıl başlamalı?
Turkcell Staj Günlüğü - 3: Tablespaces, Datafiles and Control Files
Turkcell Staj Günlüğü - 3: Tablespaces, Datafiles and Control Files
Turkcell Staj Günlüğü - 4: Transaction Management
Turkcell Staj Günlüğü - 4: Transaction Management
Image formats - Which to use when
Image formats - Which to use when
Turkcell Staj Günlüğü - 5: Startup, Shutdown
Turkcell Staj Günlüğü - 5: Startup, Shutdown
Turkcell Staj Günlüğü - 6: Oracle Architecture
Turkcell Staj Günlüğü - 6: Oracle Architecture
ASP - Locales and Codepages
ASP - Locales and Codepages
Oracle performance analysis - Tracing and performance evaluation
Oracle performance analysis - Tracing and performance evaluation
Oracle performance analysis - Autotrace workshop
Oracle performance analysis - Autotrace workshop
Oracle performance analysis - Runstats workshop
Oracle performance analysis - Runstats workshop
Oracle performance analysis - Tkprof workshop
Oracle performance analysis - Tkprof workshop
Some favourite quotes
Some favourite quotes
Derin anlamlı sözler - Bunlar da Türkçe olanlar :)
Derin anlamlı sözler - Bunlar da Türkçe olanlar :)
Turkcell Staj Günlüğü - 7: Concurrency and Consistency
Turkcell Staj Günlüğü - 7: Concurrency and Consistency
"Kurtuluş"un hikayesi
"Kurtuluş"un hikayesi
Turkcell Staj Günlüğü - 8: Statement Processing and CBO
Turkcell Staj Günlüğü - 8: Statement Processing and CBO
When a transaction begins?
When a transaction begins?
Implicit vs. Explicit cursors - Performance analysis
Implicit vs. Explicit cursors - Performance analysis
Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals"
Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals"
Affect of gathering table stats to decision of CBO
Affect of gathering table stats to decision of CBO
Bind is bad :) - An interesting case of bind variables fails
Bind is bad :) - An interesting case of bind variables fails
When the explanation doesn't sound quite right...
When the explanation doesn't sound quite right...
Turkcell Staj Günlüğü - 10: Import, Export ve SQL Loader
Turkcell Staj Günlüğü - 10: Import, Export ve SQL Loader
Turkcell Staj Günlüğü - 11: Autonomous Transactions ve Dynamic SQL
Turkcell Staj Günlüğü - 11: Autonomous Transactions ve Dynamic SQL
Difference between db block gets and consistent gets
Difference between db block gets and consistent gets
Object-Oriented Features of Oracle - Part 1: Native Datatypes vs. Object Datatypes
Object-Oriented Features of Oracle - Part 1: Native Datatypes vs. Object Datatypes
Object-Oriented Features of Oracle - Part 2: Object Types and Collection types
Object-Oriented Features of Oracle - Part 2: Object Types and Collection types
Object-Oriented Features of Oracle - Part 3: Object Tables, Object Views and REFs
Object-Oriented Features of Oracle - Part 3: Object Tables, Object Views and REFs
Examining show_space
Examining show_space
Turkcell Staj Günlüğü - 12: Partitioning
Turkcell Staj Günlüğü - 12: Partitioning
Hello World!
Hello World!
Decode Demo #1
Decode Demo #1
Decode Demo #2
Decode Demo #2
Decode Demo #3
Decode Demo #3
Decode Demo #4
Decode Demo #4
Decode Function in Oracle SQL
Decode Function in Oracle SQL
Windows Source Codes
Windows Source Codes
Türkçe Karakterli Domain'lerin İç Yüzü
Türkçe Karakterli Domain'lerin İç Yüzü
Whence C? Why C? Whither C?
Whence C? Why C? Whither C?
Differences between C and C++
Differences between C and C++
Is C a Vitamin? Yes, of course...
Is C a Vitamin? Yes, of course...
Obfuscated C
Obfuscated C
Finding and Removing Loop on a Singly-Linked List
Finding and Removing Loop on a Singly-Linked List
Matematik Asla Yalan Söylemez!
Matematik Asla Yalan Söylemez!
eXTReMe Tracker
Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals"
Category: SQL-Oracle-PL/SQL
Date: 30.07.2007 09:52:30


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.

Related Topics
Links & References

Comments

No comments posted yet.



© Copyright. All rights reserved. Designed by Bilal Hatipoğlu. RSS Feed  Valid W3C XHTML 1.0 Document  Valid W3C CSS Document