bilgiz.org

Mysql veritabani yönetim sistemi Üzerine tekniK İnceleme

  • MySQL: GİRİŞ
  • OLANAKLAR
  • PERFORMANS DEĞERLENDİRMESİ
  • GÜVENLİK DEĞERLENDİRMESİ
  • MICROSOFT WINDOWS İÇİN BELİRTİLMİŞ BAZI PROBLEMLER
  • EK 1: KAYNAKÇA
  • EK 3: MYSQL ‘İ DESTEKLEYEN PLATFORMLAR



  • Tarih29.12.2017
    Büyüklüğü39.96 Kb.

    Indir 39.96 Kb.


    Tarih: 22/06/2004

    Dökümanı Hazırlayan: Onur Çobanoğlu

    MySQL VERİTABANI YÖNETİM SİSTEMİ ÜZERİNE TEKNİK İNCELEME



    Özet: Bu doküman MySQL Database Server adlı açık kodlu ilişkisel veritabanı yönetim sisteminin performansı, güvenliği ve olanakları üzerine teknik bir rapordur. Bu raporda www.mysql.com/docs adresinde bulunan MySQL 5.0.0-alpha sürümü teknik referansı temel alınmıştır.

    1. MySQL: GİRİŞ

    MySQL Database Server ilişkisel veritabanı yönetim sistemi, önceden kaynak kodlu olarak geliştirilmiş olup bu raporun yazıldığı tarihte MySQL geliştiricilerinin kurduğu İsveçli MySQL AB firmasının bir ticari markası haline gelmiştir. Açık kod geçmişinden dolayı MySQL ikili lisansa sahiptir: GNU Genel Kamu Lisansı ve MySQL AB firmasının sağladığı standart ticari lisans. Lisans bilgileri hakkında ayrıntılı bilgiyi Ek 2’de bulabilirsiniz.



    MySQL çoklu görevli, çoklu kullanıcılı bir sistemdir. Ağır iş yükü altında kritik görevlerde kullanılmak üzere tasarlanmıştır. İki ayrı mimaride çalışan iki MySQL Database Server geliştirilmiştir; bunlardan biri klasik istemci/sunucu mimarisinde çalışırken diğeri de uygulamaya gömülebilecek çoklu görevli kitaplıklar biçimindedir. Farklı platformlarda çalışabildiği için çalıştığı platforma özel bir C++ derleyicisi ile derlenmesi gerekmektedir. Taşınabilirlik sağlamak için GNU Automake, Autoconf ve Libtool kullanılmıştır. Sadece GNU Autoconf kullanılması durumunda bile, istemci programların çalışması için C++ derleyicisi ve sunucu programlarla gömülü kitaplık uygulamasının çalışması için C++ derleyicisi ile POSIX iş parçacıklarını destekleyen herhangi bir modern işletim sistemi MySQL’in çalışması için yeterli olacaktır. MySQL’in çalıştığı platformların tam listesi için Ek 3’e bakınız. MySQL’in başka bir özelliği de, pek çok depolama motoruna sahip olup yeni motorların da diğer sistemlere göreli olarak kolay eklenebilmesidir.

    1. OLANAKLAR





      • Çoklu görevle kullanılabildiği için rahatlıkla birden fazla işlemciye uyarlanabilir.

      • Hemen her türlü dil için APIler sağlamaktadır, burada bizi özellikle ilgilendiren Java için iki adet JDBC sürücüsü mevcuttur. Bunlardan MySQL Connector/J, MySQL AB şirketi tarafından geliştirilmiştir. MySQL Connector/J Sınıf IV bir JDBC sürücüsü olup, sorgu sonuçlarının akım halinde iletilmesi ve 2 GB’a kadar olan satırların bir seferde alınması gibi olanaklar sağlamaktadır. Ayrıca başka bir grup tarafından Resin adlı bir JDBC sürücüsü de geliştirilmiştir.

      • Hareket tabanlı olan ve olmayan pek çok depolama motoruna sahip olduğu gibi, yeni bir depolama motoru diğer veritabanı yönetim sistemlerine kıyasla kolay bir şekilde eklenebilmektedir. MySQL bağımsız modüllerin sinerji oluşturacağı bir mimaride tasarlanmıştır.

      • Hem sabit hem de değişken uzunluklu kayıtlar tutulabilir. Sıkıştırılmış kayıtlar da mümkündür.

      • Aynı sorgu içerisinde farklı veritabanlarından olan tablolar kullanılabilir.

      • 60,000 tablolu ve 5,000,000,000 kayıt içeren veritabanlarını desteklediği görülmüştür. Teorik tablo sınırının (MyISAM depolama motoru kullanılarak) 263 rağmen pratikte işletim sisteminin belirlediği dosya sınırları geçerlidir. Örneğin InnoDB depolama motoru birden fazla dosya kullanılarak tablo oluşturulmasına izin vermektedir, bu şekilde 64 TB büyüklüğünde tablolar oluşturulabilir. Yine de bu sınırı aşacak yöntemler mevcuttur (Windows İçin Özel Not: Windows’ta 4 GB’dan daha büyük tablolar kullanılmak isteniyorsa NTFS veya daha yeni bir dosya sistemi kullanılmalıdır).

      • MySQL 4.1.2’den itibaren MyISAM tablolarında tablo başına 64 dizin, dizin başına 1 ila 16 alan ve dizin başına 1000 byte kullanılabilir. CHAR, VARCHAR, BLOB ve TEXT tipi alanlar üzerine oluşturulan dizinlerde alanın kendisi yerine sadece bir öneki de kullanılabilir. MEMORY (HEAP) tablolarında tablo başına 32 dizin, dizin başına 16 alan ve dizin başına en fazla 500 byte kullanılabilir.

      • İstemciler MySQL sunucusuna herhangi bir platformdan TCP/IP soketleri kullanarak bağlanabilirler.

      • ISO 8859-1 ve Unicode(utf8 ve ucs2) desteği vardır.

      • MySQL Database Server ilk çıktığında küçük bilgisayar sistemlerinde orta büyüklükteki veritabanlarını (10-100 milyon satır veya tablo başına 100 MB) idare etmek için tasarlanmıştı. Bugünkü sürümler terabyte’lık veritabanlarını yönetebilecek niteliktedir, fakat yine de kod gömülü sistemlerde veya el büyüklüğündeki cihazlarda kullanılabilecek şekilde eski sürümüyle derlenebilir.

      • SQL alt sorguları (sorgu içinde sorgu) desteklenmektedir.

      • InnoDB ve BDB depolama motorları hareket desteği sağlamaktadır. InnoDB’nin tam ACID desteği vardır.

      • TRIGGER, VIEW desteği mevcuttur.

      • FOREIGN KEY kullanımı sadece InnoDB depolama motorunda mümkündür.

      • 32-bit olan her Windows MySQL çalıştırabilir. NT ailesi ürünleri MySQL’i servis olarak çalıştırmaya izin vermektedir.

      • Windows sistemlerinde MySQL 2,048 açık dosyayı desteklemektedir.

      • MySQL sunucusuna gönderilen sorgularda /*! ....... */ içinde nokta bulunan yerlere MySQL’e özgü anahtar sözcükler yazılırsa MySQL sunucusu bunları işleme koyabilir. Sonradan platform taşınıp başka bir veritabanı yönetim sistemine geçilmesi durumunda bu kısımlar açıklama olarak yorumlanıp işleme konmayacaktır. Bu da sistemin taşınabilirliğini artıran bir etkendir.

      • HIGH_PRIORITY seçeneği ile eşzamanlı hareketler yürütülürken belli sorgulara öncelik verilmesi sağlanabilmektedir.

      • MERGE tipi tablolar kullanılarak fiziksel olarak ayrı MyISAM tabloları mantıksal olarak tek bir tabloya birleştirilebilir.


    1. PERFORMANS DEĞERLENDİRMESİ





      • MySQL Database Server’ın çok hızlı çalıştığı iddia edilmektedir (C ve C++ kullanılarak yazılmış olması bu ifadeyi doğrular niteliktedir).

      • POSIX iş parçacıklarının kullanımından da anlaşılabileceği gibi sunucu ve gömülü kitaplık çekirdek iş parçacıklarını kullanmaktadır. Bu da performansı düşürecek etkenlerden biridir.

      • Teknik dokümanda sorgu önbelleği sayesinde basit sorgularda %238’e varan hızlanma sağlanabildiği söylenmektedir.

      • Sıkıştırılmış dizinler üzerinde arama yapılabildiği belirtilmiştir. Bu da muhtemelen dizin işlemlerinde daha az G/Ç anlamına gelecektir.

      • READ LOCAL, INSERT DELAYED ve DELAY_KEY_WRITE gibi mekanizmalarla hareket yönetimindeki kilitleme protokollerinin getirdiği gecikmelerin bir kısmı önlenebilmektedir.

      • Bir tablonun NTST (non-transaction safe table) olarak tanımlanması ve hareket tabanlı olmayan depolama motorları (örnek: MyISAM, MERGE, HEAP vs.) yoluyla kullanılması durumunda çok ciddi hız ve bellek kazanımları olmaktadır. Fakat bu durumda bu tablolar hareket tabanlı olmamakta ve eşzamanlı erişimlerde ciddi performans düşüşü yaşamaktadır. Tablonun TST (transactional safe table) olarak tanımlanması ve hareket tabanlı depolama motorları (örnek: InnoDB, BDB, vs.) kullanılması durumunda ise eşzamanlı erişimlere cevap süresi açık bir şekilde kısalmaktadır.

      • SELECT STRAIGHT_JOIN kullanılarak SELECT deyimindeki tablo birleştirmelerinin deyimde yazılan sırayla birleştirildiğinden emin olunabilir. Bu da uygulama geliştiricisinin her birleştirme içeren sorguyu kendi istediği şekilde eniyileme olanağı verir. Dikkatli sorgu maliyet tahminleriyle bu şekilde ciddi performans kazanılabilir.

      • Kullanılan birleştirme algoritması tek bir tane olduğu için, birleştirmelerde yüksek performans istendiği durumlarda birleştirme alanları üzerine mümkün olduğu kadar dizin yerleştirilmelidir.

      • Birden fazla kullanıcı tarafından eş zamanlı olarak sık sık güncellenen MyISAM tabloları üzerinde yapılan karmaşık SELECT sorguları ciddi performans zayıflığı gösterebilir. Bu sebepten dolayı çok kullanıcılı sistemlerde MyISAM tabloları performans düşüşüne sebep olabilir.

      • OPTIMIZE TABLE komutu ile MyISAM tablolarındaki parçalanma düzeltilebilmektedir.

      • HEAP depolama motoru bellekte geçici tablolar yaratarak performansı artırıcı etki yapabilmektedir. Eşleme dizinleri kullanıyor olması da performansını artırıcı başka bir etkendir.

      • Uygulama ile MySQL sunucusunun aynı bilgisayarda olduğu ve genellikle tek uygulamanın sunucuya eriştiği durumlarda MyISAM depolama motoruna doğrudan erişilmesi (SQL kullanmadan) iki ila beş kat hızlanma getirebilmektedir.

      • Kilitlenmeden kaçınmak için MySQL bir sorgunun ihtiyaç duyabileceği bütün kilitleri en başta bir kere aldığı koruyucu kilitleme mekanizmasına başvurmaktadır. Bu da kilitleme gecikmesini artırmakta ve daha da kötüsü eşzamanlı çalışan hareketleri seri işleyişe yaklaştırmaktadır.

      • Veritabanına yazmanın okumaya önceliği vardır. Bu sebeple yoğun miktarda veritabanı güncellenmesi esnasında yapılacak okumalar ciddi şekilde yavaşlayacaktır.

      • Dizin ve işaret ettiği satır farklı dosyalarda tutulmaktadır. Bu da her dizin kullanımında fazladan bir disk okuması gerektirerek dizin performansını düşürür.

      • CHAR, VARCHAR, TEXT ve BLOB tipi alanlarda alanın kendisi yerine bir önekine dizin konulması durumunda dizinler küçüleceğinden ve dizin önbelleğine daha fazla dizin sığacağından, dizin performansı artacaktır.

      • MySQL 4.0’dan itibaren LIKE işleci kullanılarak yapılan metin aramalarında, aranılan dizgenin 3 karakterden uzun olması durumunda Turbo Boyer-Moore algoritması kullanılarak performans artışı sağlanmaktadır.

      • Dizin önyükleme mekanizması ile gereken bütün dizinlerin işlemler başlamadan önce önbelleğe yüklenmesi sağlanabilmektedir. Bu sayede diskten dizin çekme süresi ciddi bir şekilde kısalmaktadır. Gerekli olduğu durumlarda yapılması halinde performansı artırabilir.

      • mysqld yürütülür kodunun sembollerinin strip aracıyla kaldırılması durumunda %4’lük performans artışı elde edilebilir.

      • MySQL’in kaynak kodundan derlenerek ilgili bilgisayara yüklenmesi durumunda, yürütülür kodların statik bağlanması performans artışı sağlayacaktır.

      • TCP/IP kullanarak uzaktaki sunuculara bağlanmak, 100 Mbit/saniyenin üzerindeki Ethernet hızlarında bile yerel sunucuya bağlanmaktan %8-11 daha yavaş olacaktır.

      • MySQL AB tarafından yapılan testlerde SSL bağlantısının şifrelenmemiş bağlantılara göre %55 yavaş olduğu görülmüştür.

      • MySQL’i kaynak kodundan derlemenin “–with-debug=full” seçeneğiyle yapılması durumunda sorgularda ortalama %20 yavaşlama görülmüştür.

      • Sabit olmayan uzunluklu MyISAM tablolarının kullanımı erişim ve kurtarma hızlarının düşmesine neden olacaktır.

      • Sıkıştırılmış MyISAM tabloları disk kullanımını azaltarak performansa katkı sağlamaktadır.

      • MERGE tabloları kullanılarak büyük MyISAM tabloları mantıksal parçalara bölünebilir. Eğer uygulamanın doğası gereği belli bir veri kümesi aynı tabloda olmak zorunda; ama uygulamada tabloya erişim heterojen olarak belli bölgelere yoğunlaşıyorsa farklı fiziksel MyISAM tabloları yaratılarak MERGE sanal tablosuyla hepsinin mantıksal olarak birleştirilmesi uygulamaya hız katacaktır.

      • MERGE tablolarında anahtar araması normal MyISAM tablolarına göre yavaş olmaktadır.

      • InnoDB depolama motoru güncellemelerde satır düzeyinde kilitleme yapmakta olup kilitleri daha büyük birimlere aktarma ihtiyacı duymamaktadır. Aynı zamanda okumalarda çoklu sürüm yöntemi uygulayarak okumaları kilitsiz halletmektedir. Eşzamanlı erişimde bu veritabanına oldukça yüksek bir hız kazandıracak bir etkendir.

      • InnoDB depolama motorunu kullanan Mytrix şirketinin InnoDB tablolarında 1 TB’ın üzerinde veri tuttuğu ve başka bir İnternet sitesinde InnoDB’nin saniyede ortalama 800 güncelleme ile çalıştığı teknik dokümanda belirtilmiştir.

      • InnoDB dizin kilitlemesi yapmakta ve kilitleyeceği satırları seçerken WHERE koşulunu dikkate almamaktadır. Çok geniş menzillerde tarama yapılırken bu performansı oldukça düşürücü bir etken olabilir.

      • Bir tablo üzerinde dizin varolmaması durumunda InnoDB bütün tabloyu kilitleyerek ciddi performans düşüşüne sebep olmaktadır.

      • MySQL 4.0.5’ten itibaren InnoDB kilitlenme çözme mekanizması mümkün olduğunca küçük hareketleri iptal etmeye çalışmaktadır. Bu küçük de olsa bir performans kazanımı sağlayabilir.

      • İşlemci yükünün %70’den düşük olması veritabanı işlemlerinin ağırlıklı olarak G/Ç bağımlı olduklarının bir göstergesidir. Çok sık COMMIT yayınlamak veya küçük bir önbellek havuzu ile çalışmak bunun sebebi olabilir. Önbelleği büyütmek bir çözümdür fakat ana hafızanın %80’inden fazla büyümesi önerilmemektedir.

      • Kayıt önbelleğinin en az 8 MB olması önerilmektedir.

      • UNIQUE kısıdı olan büyük tablolarda arama yapılırken SET UNIQUE_CHECK=0 yapılması ve büyük tabloların içeriye aktarımında SET FOREIGN_KEY_CHECKS=0 yapılması pek çok disk G/Ç’si kazandırabilir.

      • InnoDB tabloları birincil anahtara göre kümelenmiş dizinlerle tutulur. Bu da ciddi performans kazanımı sağlarken, disk alanının israfına yol açar. Teknik referansta belirtilen bilgilerden çıkarıldığı kadarıyla bu disk alanı israfı %6.66 ile %100 arasında olacaktır.

      • InnoDB’de ikincil dizinler üzerine ekleme yapılmasını kolaylaştıran “eklemeyi arabelleğe alma” yönteminin eklemelere 15 kata varan hızlanma sağladığı görülmüştür.

      • InnoDB’nin dizin aramalarını gözleyen otomatik bir mekanizması vardır. InnoDB yapılmasının faydalı olacağını düşündüğü durumda B+ ağacı dizin anahtarının herhangi bir parçası üzerine eşleme dizini koyar. Bu da performansı artırıcı bir etkendir.

      • INSERT DELAYED işlemi InnoDB tabloları tarafından desteklenmemektedir.

      • MySQL Connector/J JDBC sürücüsü, NT platformlarında sürücüyle aynı makinede bulunan veritabanlarına erişim için isimlendirilmiş boruların kullanımını desteklemektedir. Basit performans testlerinde, isimlendirilmiş borularla ulaşımın standart TCP/IP erişimine kıyasla %30-%50 daha hızlı olduğu görülmüştür.



    1. GÜVENLİK DEĞERLENDİRMESİ





      • MySQL 4.0.0’dan itibaren sistemde OpenSSL kitaplıkları bulunması halinde SSL şifreli istemci/sunucu bağlantıları için destek vardır. MySQL OpenSSL 0.9.6 ile test edilmiştir.

      • MySQL’in 4.1’den önceki sürümlerinde şifrelenmiş parola gerçek parolanın yerine kullanılabilir. Bu da şifrelenmiş parolaları ele geçirenlerin hiçbir zorluk çekmeden veritabanlarına bağlanabileceği anlamına gelir.

      • JDBC bağlantısında PreparedStatement nesnelerinin kullanılması yazılım güvenliğini artırıcı bir etken olacaktır.

      • MySQL 4.1.1’den önceki sürümlerde parola şifreleme algoritmasının zayıf olduğu teknik dökümanda belirtilmiştir.

      • MySQL 4.1.1’den itibaren bütün sürümlerde her türlü kullanıcı şifresi 41 byte uzunluğundaki şifrelenmiş değerlere eşlenir. Bu değer MySQL 4.1.0’da 45 byte, daha önceki sürümlerde ise 16 byte’dır.

      • TST (transactional safe table) türü tablolar ve hareket tabanlı depolama motorları (örnek: InnoDB, BDB, vs.) kullanılması durumunda sistem çökmelere ve bozukluklara karşı tam güvenliğe sahip olmaktadır.

      • LOCK TABLE ile alınan tablo düzeyindeki kilitler InnoDB depolama motorunun kilitlenme tespit mekanizması tarafından görülememekte ve örtülü olarak çözülemeyen kilitlenmelere yol açmaktadır.


    1. MICROSOFT WINDOWS İÇİN BELİRTİLMİŞ BAZI PROBLEMLER





      • Windows sistemleri istemci bağlantıları için 4,000 civarında kapı içermektedir. Bir kapıdaki bağlantı kapatıldığında aynı kapının kullanılabilmesi için iki ila dört dakika gerekmektedir. Çok yoğun istemci trafiği yaşanması durumunda bütün kapıların beklemeye girmesi MySQL sunucusunu kullanılmaz hale getirir.

      • MySQL’e olan bağlantılar otomatik olarak düşmemektedir.

      • Eğer MySQL sunucusuna olan bir bağlantı asılı kalırsa, MySQL’i öldürmeden bağlantı kırılamaz, uyuyan bağlantılar MySQL tarafından öldürülemez, uyuyan bağlantılar oluğu sürece servis olarak çalışan MySQL sunucuları durdurulamaz.

      • Başka bir iş parçacığı tarafından kullanılan bir dosya silinemez.

      • Windows sembolik bağlantı desteği vermediği için CREATE TABLE komutunun seçenekleri olan DATA DIRECTORY ve INDEX DIRECTORY seçenekleri Windows’ta çalışmayacaktır.

      • Başka bir görev parçacığı tarafından kullanılan bir veritabanı düşürülemez.

      • Windows’ta MySQL veritabanı ve tablo isimleri büyük ve küçük harfe duyarlı değildir.

      • Windows komut satırından MySQL pipe’ları güvenilir bir şekilde çalışmamaktadır.


    EK 1: KAYNAKÇA


    [1] MySQL Reference Manual, http://dev.mysql.com/get/Downloads/Manual/manual-a4.pdf/from/pick

    [2] Database Management Systems, Raghu Ramakrishnan/Johannes Gehrke, 3rd Edition, McGrawHill 2003.



    EK 2: LİSANS BİLGİLERİ

    MySQL başlarda açık kod olarak geliştirilmiş, daha sonra da MySQL AB şirketi tarafından ticari lisansı alınmıştır. Açık kod olarak geliştirildiği için büyük bir kısmı GNU Genel Kamu Lisansı’na tabidir. Bu lisansın birincil koşullarından biri de GKL ile lisanslanan kodu kullanan herhangi bir kodun da GKL ile lisanslanması gereğidir. GKL ile lisanslanan kod ise açık olmak zorundadır. Bir başka hüküm ise sadece MySQL veritabanı ile çalışabilen ve MySQL ile dağıtılan bir kodun GKL ile lisanslanması gereğidir. Bu gereklerden kaçmak için MySQL AB şirketi tarafından sağlanan ticari lisans satın alınabilir, bu lisans geliştirilen kodun kapatılmasına izin vermektedir. İki cümle önce geçen sadece kelimesi dikkat çekicidir, bu hükmün (ve genel olarak GNU Genel Kamu Lisansı’nın) hukuk uzmanları tarafından dikkatle incelenmesi gerekmektedir.



    EK 3: MYSQL ‘İ DESTEKLEYEN PLATFORMLAR





    • Yerel iş parçacıklarıyla AIX 4.x, 5.x

    • Amiga.

    • MIT-pthreads paketiyle BSDI 2.x

    • Yerel iş parçacıklarıyla BSDI 3.0, 3.1 and 4.x

    • Yerel iş parçacıklarıyla DEC UNIX 4.x

    • MIT-pthreads paketiyle FreeBSD 2.x

    • Yerel iş parçacıklarıyla FreeBSD 3.x and 4.x

    • Linux iş parçacıklarıyla FreeBSD 4.x

    • DCE iş parçacıkları veya MIT-pthreads paketiyle HP-UX 10.20

    • [HP-UX 10.20]

    • Yerel iş parçacıklarıyla HP-UX 11.x

    • LinuxThreads 0.7.1+ veya glibc 2.0.7+ ile Linux 2.0+.

    • Mac OS X.

    • NetBSD 1.3/1.4 Intel ve NetBSD 1.3 Alpha (GNU make gerektirir).

    • [NetBSD].

    • Novell NetWare 6.0.

    • Yerel iş parçacıklarıyla OpenBSD > 2.5. MIT-pthreads paketiyle OpenBSD < 2.5.

    • OS/2 Warp 3, FixPack 29 ve OS/2 Warp 4, FixPack 4.

    • FSU Pthreads paketinin yeni bir kapısıyla SCO OpenServer

    • SCO UnixWare 7.1.x.

    • Yerel iş parçacıklarıyla SGI Irix 6.x

    • Sparc ve x86 üzerinde Yerel iş parçacıklarıyla Solaris 2.5 ve üzeri.

    • MIT-pthreads paketiyle SunOS 4.x

    • Tru64 Unix

    • Windows 9x, Me, NT, 2000, ve XP.






        Ana sayfa


    Mysql veritabani yönetim sistemi Üzerine tekniK İnceleme

    Indir 39.96 Kb.