MySQL Developer I – Sınav Hazırlığı

Oracle Certified Proffessional MySQL Developer 5 sınavına çalışırken tuttuğum notların bir kısmı.

1. Client Aracını Başlatmak

Kullanılabilir olan tüm argümanları listeler.

Sürüm bilgisini ekrana basar. Argümanlar case-sensitive’dir. Yani mysql -V ile mysql -v farklı şeylerdir. Eğer lokal makinede ki mysql’i çalıştırmak istiyorsak mysql komutu yeterlidir. Ancak uzakta ki bir host’ta barınan mysql server’ı çalıştırmak istiyorsak;

veya

kullanmak gerekir.

2. Bağlantı Parametreleri

  • –protocol : Bağlantı için kullanılacak protokol.

protokol için aşağıda ki seçimler kullanılabilir:

  1. tcp: TCP/IP – Tüm işletim sistemleri için lokal veya remote bağlantıda çalışır.
  2. socket: Sadece Unix – sadece lokalde çalışır.
  3. pipe: Sadece Windows – sadece lokalde çalışır.
  4. memory: Paylaşımlı bellek için, sadece Windows, sadece lokalde çalışır.

Eğer –protokol argümanı belirtilmezse bağlantı protokolü, server hostname ve client’in işletim sistemine göre belirlenir! Aşağıda ki diğer argümanlar, yalnızca –protokol argümanı belirtilmediği zamanlarda kullanılabilir!

  • –host : MySQL server’ın çalıştığı host. Bir domain veya IP adresi olabilir. Kısa yazılışı -h. Default hostname ise localhost’tur.

veya

şeklinde kullanılır.

  • –port : TCP/IP bağlantısı için kullanılacak olan port numarası. MySQL default port numarası 3306’dır.

veya

şeklinde kullanılır.

  • –shared-memory-base-name : Paylaşımlı bellek kullanımı için bellek kullanımı için shared-memory ismi. Default değeri büyük harflerle MYSQL’dir.

  • –socket : Unix socket adı
  • –user : Veritabanı kullanıcı adı

veya

şeklinde kullanılabilir.

  • –password : Kullanıcı adına ait şifre.

veya

şeklinde kullanılabilir. -p örneğinde arada boşluk olmadığına dikkat ediniz! Boşluk kullanırsanız hata alırsınız! Kısa kullanımlarda ki bu boşluk kuralı yalnızca -p için geçerlidir. -hserhat.domain.com veya -h serhat.domain.com hiç bir sorun vermeden çalışacaktır. Ayrıca –password veya -p için hiç bir şifre argüman olarak girilmeyebilir. Zaten önerilen de güvenlik açısından budur. Aksi halde log dosyalarına şifreleriniz kayıt edilmiş olacaktır. Eğer yalnızca -p kullanırsanız ve şifrenizi yazmazsanız, mysql server bağlantı aşamasında size şifre soracaktır. Yavaş çalışan bir network’ten bağlantı kurarken -C veya –compress argümanını kullanabilirsiniz. Bu argüman sayesinde arada kurulan iletişim, client tarafında compress edilir ve sunucuya compress edilmiş veri yollanır. Sunucu ise bu veriyi uncompress eder ve yanıtını compress ederek tekrar client’a gönderir. Client ise bu yanıtı uncompress ederek okur. Bu durumun ağ üzerinde veri paketlerini küçültücü bir etkisi vardır. Ancak, aynı zamanda makineler üzerinde compress/uncompress yapılmasını gerektiren ekstra bir işlemdir. Örnekler: Uzun yazılış:

Kısa yazılış:

3. Ayar Dosyası Hazırlamak

Ubuntu’da konfigürasyon dosyaları /etc/mysql/my.cnf yolunda bulunmaktadır ve bu global konfigürasyon dosyasıdır – tüm kullanıcılar için uygulanır. Eğer bir kullanıcıya özel bir konfigürasyon dosyası hazırlamak istiyorsanız, bu global dosyayı home dizininize ~/.my.cnf adıyla kopyalayıp üzerinde değişiklik yapabilirsiniz. Eğer hem global dosya, hemde home dizininde my.cnf dosyası var ise – daima global konfigürasyon dosyası ilk olarak okunur! Ek olarak, bu dosyayı okumak için “sudo” kullanmalısınız. Örneğin;

Bu dosyada grup isimleri köşeli parantezler içerisinde belirtilir. Örneğin [client] grubu, tüm client’ların mysql sunucusuna nasıl bağlanacağını belirleyen ayarları içerir. Bir gruba ayar yazarken her zaman argümanların uzun isimlerini kullanmalısınız. Yani “-h” yerine “–host” kullanılması gerekmekte. Ancak bu dosyaya özel bir durum olarak başlangıçta ki “–” işaretlerinin de kullanılmaması gerekiyor.

  • Client tarafından bağlantı kurarken, programa standart ayar dosyaları yerine spesifik bir dosyayı ayar dosyası olarak okumasını söyleyecekseniz:

parametresini, satırdaki ilk parametre olacak şekilde ekleyin. Örneğin:

  • Programa, standart ayar dosyaları ile birlikte, kendi ayar dosyanızı da okumasını söyleyecekseniz:

parametresini, satırda ki ilk parametre olacak şekilde ekleyin. Örneğin:

Programın tüm ayar dosyalarını görmezden gelmesini istiyorsanız:

parametresini, satırda ki ilk parametre olacak şekilde ekleyin. Ayar dosyasından örnek satırlar:

4. Veritabanı Seçimi

Dump alırken şu şekilde bir seçim yapmanız gerekecektir:

Sorguları ise bir veritabanı seçmeden de yazabileceğiniz gibi:

Veritabanını seçtikten sonra, her seferinde adını yazmaktan da kurtulabilirsiniz:

5. Server SQL Modları

SQL modları, sql_mode sistem değişkeni ile tanımlanır. Default olarak sql_mode değişkeninin değeri boştur. SET ifadesi ile bu değişkene bir değer atamak mümkündür. Değer boş bir string olabileceği gibi, bir veya birden fazla mode’un virgüllerle ayrılmış olarak yazılmasından da oluşabilir.

Eğer değer boş ise, veya birden çok mode ismi içeriyorsa tırnak işaretleri arasına alınmazı zorunludur. Ancak değer tek bir mode ismi ise, tırnak işaretleri opsiyoneldir.

SQL Mode’u temizler:

SQL Mode’u tek bir değere eşitler. Tırnak işareti opsiyonel olduğu için yok:

SQL Mode’u tek bir değere eşitler. Tırnak işareti opsiyonel olduğu için var:

SQL Mode’u birden çok değere eşitleyelim:

SQL mode ataması yaptıktan sonra, değerin uygulanıp uygulanmadığını kontrol etmek ve uygulanmış olan sql_mode’ları görmek için;

sorgusunu yapabilirsiniz.

SET işlemi bir veriye yeni bir değer atama işlemidir ve bu işlem sonucunda değişkenin eski değeri silinir!

Bazı SQL modları, birden çok modu içerir. Örneğin TRADITIONAL modu böyledir.

sorgusunu yaptıktan sonra,

şeklinde kontrol ederseniz, bir modlar serisinin set edildiğini görebilirsiniz:

SQL modları ve açıklamaları hakkında bilgiyi şuradan bulabilirsiniz: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

6) MySQL Client Aracı

Bu araç hem interactive hemde batch mode olmak üzere iki şekilde çalışır. Interactive mod genelde günlük işleri yapmakta, sorguları hemen deneyip sonuçlarını anında görmek için kullanılır. Batch mod ise, daha önceden hazırlanmış sorguları bir dosyadan çalıştırmak için kullanılır. Yani aradaki fark birinde girdi aracı klavye iken diğerinde bir dosya olmasıdır.

Interactive kullanım için bağlantı kurarken çeşitli parametreler gireriz.

veya direk kullanacağımız veritabanını da girebiliriz:

Örneğin veritabanımıza bağlanmış olup “django” isimli veritabanını kullanıyor olalım. Kullanım için ya bağlanırken veritabanı adını parametre olarak vermiş olmalıyız, ya da daha sonradan “USE django” sorgusunu yapmış olmalıyız.

SELECT database() ile kullanmakta olduğumuz veritabanını görürüz:

Tek bir satırda, noktalı virgülden sonra başka sorgularda girebiliriz:

Eğer sorgunuzu yazarken karar değiştirdiyseniz ve bu sorgunun çalışmamasını! istiyorsanız “\c” ile bitirmeniz yeterlidir.

Eğer bu şekilde 2 ayrı sonuç istemiyor ve sonucu tek bir tablonun farklı sütunları olarak görmek istiyorsanız “,” virgül kullanabilirsiniz:

MySQL’den çıkmak için aşağıda ki komutlardan herhangi birini kullanabilirsiniz;

MySQL’e giriş yapmadan da, MySQL sorgularınızı çalıştırabilirsiniz. Bunun için “-e” veya “–execute” komutu vermeniz yeterlidir:

7) İfade Sonlandırıcılar

MySQL’de sık kullanılan 3 çeşit ifade sonlandırıcı vardır.

ile ifadenizi bitirdiğiniz anda sorgu sunucuda çalıştırılır.

ise noktalı virgül ile aynı işi yapar.

ise yine ifadeleri sonlandırır ancak sonuçlar tek bir satırda yazılarak output edilir:

8) MySQL İstemleri (Promptlar)

mysql> Yeni bir ifade beklenmekte

9) MySQL ile Script Dosyalarını Kullanmak (Batch Mode)

Sorgu script dosyalarını çalıştırmak için “SOURCE” sorgusu kullanılır.

Shell’deyken MySQL’e bağlanmadan da script dosyalarını çağırabilirsiniz:

UYARI: Script dosyaları da SOURCE sorgusunu içerebilir. Örneğin sorgu1.sql dosyasını SOURCE ile çağırdığınızda, sorgu1.sql dosyasıda kendi içinde sorgu2.sql dosyasına bir çağrı yapıyor olabilir. Burada sonsuz bir döngü oluşturmamaya dikkat edilmelidir! Örneğin sorgu1.sql dosyasında “SOURCE sorgu2.sql” satırı var ise – ve aynı zaman sorgu2.sql dosyasında “SOURCE sorgu1.sql” satırı varsa içinden çıkılamayan bir döngü meydana gelir!

10) MySQL Çıktı Formatları

Batch formatta output almak için -B veya –batch parametreleri kullanılır:

Çıktı şu şekilde olacaktır:

Tablo formatında çıktı almak için -t veya –table parametreleri kullanılır:

Çıktı şu şekilde olacaktır:

HTML formatında çıktı almak için –html veya -H parametreleri kullanılır:

Çıktı şu şekilde olacaktır:

XML formatında çıktı almak için –xml veya -X parametreleri kullanılır:

Çıktı şu şekilde olacaktır:

11) STATUS Komutu

“status” komutu ile MySQL serverınız hakkında aşağıdakine benzer bilgiler alabilirsiniz:

12) HELP komutu

help” komutu ile parametrelerin kullanımı hakkında bilgi alabilirsiniz:

Eğer bir komutun – sorgunun ne işe yaradığını hatırlayamıyorsanız onu “help” komutu ile birlikte çağırabilirsiniz:

13) –safe-updates ve –i-am-a-dummy

Eğer MySQL’de yeniyseniz veya dalgınlıkla çok fazla veriyi uçurmaktan çekiniyorsanız –safe-updates ve –i-am-a-dummy parametreleri yararlı olacaktır. Her ikisi de aynı işe yarar. Bu parametreler verildiğinde;

  • UPDATE ve DELETE sorguları yalnızca WHERE ifadesi veya LIMIT ifadesi ile devam ediyorsa çalıştırılır.
  • SELECT sorgusu 1.000 satırla sınırlandırılmıştır.
  • Çoklu SELECT sorgularında toplam gösterilecek kayıt sayısı 1.000.000 ile sınırlandırılmıştır.

14) MySQL Query Browser

MySQL Query Browser artık kullanılmayan bir yazılımdır ve ismi MySQL Workbench olarak değişmiştir. Aşağıda ki adresten indirip kurabilirsiniz:

http://dev.mysql.com/downloads/tools/workbench/#downloads

Ubuntu’da synaptic packet manager ile kolayca bulup – kurabilirsiniz. Yazılım “Databases (Universe)” kategorisi altında bulunuyor.

15) MySQL Konnektörleri

MySQL AB firması, MySQL serverlarına erişmek için kullanılan bir çok API duyurmuştur. MySQL’in kendi içerisinde gelen libmysqlclient C kütüphaneside bunlardan biridir. Bu API sayesinde C-tabanlı MySQL programları yazılabilir.

MySQL AB firması ayrıca, görevi MySQL serverlarına belli protokoller üzerinden bağlanmak olan client araçları ile MySQL serverlar arasında köprü olarak çalışacak driverlar (sürücüler) geliştirmiştir. Örneğin;

MySQL Connector/ODBC ODBC (Open Database Connectivity) için MySQL’e özel bir sürücüdür. ODBC uyumlu programların MySQL’e bağlanmalarını sağlar.

MySQL Connector/J ise Java programları tarafından kullanılan bir JDBC (Java Database Connectivity) sürücüsüdür. JDBC uyumlu yazılımların MySQL’e bağlanmasını sağlar.

MySQL Connector/NET sürücüsü ise C# dili ile yazılmış bir sürücüdür ve ADO.NET’i destekler. Bu sürücü sayesinde .NET uygulamaları MySQL’e bağlanabilir.

MySQL konnektörleri sunucuya değil client’a kurulmalıdır. Client ve Sunucu arası konnektör ilişkisi platform bağımsızdır. Yani client Windows bir makinadan ilgili konnektörü kullanarak Unix bir makinada bulunan MySQL’e bağlanabilir.

16) Veri Türleri

Vaktim olursa devam edecek.

PHP PDO'da in Koşuluna Array Bind Etmek

Bir kaç gündür, üniversitelerin çeşitli sınav sonuçları için yayınladıkları kontenjanlarını içeren bir uygulama yazmakla meşgulüm. Kulağa basit gelse de beklediğimden daha çok iş gücü gerektiren bir proje oldu. Bu uygulama geliştirme sürecinde iki temel sorunu aşmam gerekti:

  1. Veritabanını performanslı ve maintainable bir şekilde kurgulamak.
  2. Karmaşık sorguları PDO ile hazırlayabilmek.

Veritabanı meselesini Louis Davidson abimizin ilham verici yazısı eşliğinde, 2-3 saatlik kalem-kağıt bir hesaplama ve kafa yorma süreciyle çözdüm.

Meraklısına: https://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/

PHP’de 2 yıla yakın bir süredir veritabanı bağlantıları ve işlemleri için PDO kullanıyorum. Nedenleri ise şurada:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

pdo-to-db

Gel gelelim ki PDO bir extension olması sebebiyle bazı kompleks durumlar için her zaman açık çözümler sunmuyor ve insana saç baş yoldurtabiliyor. Yaşadığım durum, 4 grup altında toplanmış toplamda 20 checkbox’tan gelen verileri çeşit çeşit olasılıklarda sorguya dahil edebilmeye çalışmaktı. Örneğin 3 değer POST edebilen bir checkbox grubundan yalnızca biri seçilmiş olsaydı “=” veya “like” clause’u yeterli olabilirdi ancak seçim sayılarının arttığı durumlarda bir “array” gönderilecek ve bunları sorguya like veya = ile dahil etmek mümkün olmayacaktı ki akabinde clause’u “in” olarak değiştirmek gerekliydi. Fakat gelen array’i implode ettiğimde ise, PDO her zaman buna string veya float muamelesi yaparak yalnızca ilk değeri işleme alıyor, diğerlerini ise görmezden geliyordu. Örnekleyerek anlatayım:

Şöyle bir array gelsin ve bunu virgüller ile ayrıştıralım ki veritabanı sorgusuna uyumlu olsun:

Böylece elimizde $degerler adında ve temsili olarak ‘a,b,c,d’ yapısına sahip bir “string” oldu. Bunu sorguya bind etmek istersek:

gibi bir şey olacak. Sorgu bu şekildeyken “bind” temelde şöyle çalışıyor:

Burada ihtiyacım olan ise sorgunun şu şekilde çalışması:

Yani bir nevi dizi elemanlarını parçalamak. Ancak belirtmem gerekir ki, dizi elemanlarının sayısı kesin değil! Devamlı değişebiliyor ve post işlemi sonrasında bir döngüden geliyor! Bu yüzden statik çözümler ile bunu çözmek zor.

PDO’nun bu konu için bir çözümü veya yeteneği yok. Bu yüzden çözüm yolunu MySQL’in “find_in_set” fonksiyonu ile sağlayacağız:

ve hepsi bu kadar! Stackoverflow’dan görebileceğiniz üzere, bu sorun baya bir kişiye sıkınt yaratmış. Çözümler ve süper tartışma-örnekleri için:

http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition

http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement?lq=1

Moodle'da Silinmiş Kullanıcıları Tamamen Yok Etmek

Öğrenmiş oldum ki, moodle asla bir kullanıcıyı silmiyormuş. Yani uygulama tarafında kullanıcı silinse bile, aslında yapılan işlem veritabanında (mdl_user tablosunda) sadece kullanıcının boolean olan deleted alanının 1’e dönüşmesi işlemiymiş.

Bu konu hakkında şöyle güzel bir tartışma var:

https://moodle.org/mod/forum/discuss.php?d=128227

Özetle bu tartışmada söylenen, bu silinmiş kullanıcıların SQL hareketleriyle uçurulmasının riskli olabileceği. Çünkü kullanıcıların forum mesajı, sınav sonucu vs. bilgilerini de tespit edip temizlemek gerekecek. Aksi halde arkamızda nereye bağlı olduğu veya nasıl oluştuğu belli olmayan bir yığın çöp veri bırakmış oluruz ki – fayda sağlayalım derken daha çok zararı dokunur. Moodle veritabanının karmaşık yapısı ise bu ilişki tespit işlemini çok zorlaştırıyor.

Ancak benim karşılaştığım durum biraz daha farklıydı. Bir çok öğrencinin kaydı yanlışlıkla -bulk upload- yapılmış ve daha sonra bunlar silinmiş. Bu öğrencilerin “firstaccess” ve “lastaccess” bilgileri de (mdl_user tablosunda) doğal olarak “0” (veya human-readable olarak 1970-01-01 02:00:00) çünkü hiç giriş yapmamışlar. O halde bunların arkada bırakabileceği harici bir data’da bulunmuyor, yani risk yok.

Risksiz uçurma işlemi öncesinde bunları tespit edelim:

Uçuralım:

Son “1,5 yıldır” giriş yapmamış kullanıcıların silinmesinde de bir sakınca yok, çünkü bunların yaratmış olabileceği forum mesajı, özel mesaj vb. içerikler zaten çoktaaan silinmiştir diyerek onları da uçuruyorum.

Bunları da tespit edelim:

* 1330006358 değeri, bugünün yani 23 Şubat 2013’ün timestamp bilgisidir.

Bunları da uçuralım:

Unutmadan veritabanımıza auto-repair yapalım:

Tebrikler, hepsi bu kadar. Veritabanım bu işlem sonucunda 10mb. kadar daha küçüldü.

Moodle Bakımı

Çok şık folyosuna şuradan ulaşabileceğiniz “Moodle Bakımı” konusuna sırf Google indexlesin diye bir de buradan değineceğim. Bu konuda yazılan ilk yazı olduğunu da belirtmek isterim, öhöm öhöm.

Neden Moodle Bakımı?

  • Moodle logları aşırı boyutlara ulaşmışsa,
  • Veritabanınız hantallaşmışsa,
  • Sayfa görüntüleme hızında yavaşlık yaşanıyorsa,

Moodle’ın kullandığı veritabanı tablolarına bakım yapmanız gerekiyor olabilir.

Veritabanlarını Listelemek

  • Tüm veritabanlarını listeleyelim:
  • Veritabanlarının boyutlarını görüntüleyelim:

Veritabanı Boyutları

  • Gördüğünüz gibi moodle isimli veritabanının boyutu 1136 MB !
  • 118 MB boyutunda olan data_free verisine birazdan değineceğiz.
  • /moodle/course/report/log/index.php?id=1 sayfasından tüm loglara göz atalım:
  • “3.545.390 kayıt gösteriliyor.”
  • O halde bi şey yapmalı !

Logların Silinmesi

  • /moodle/admin/settings.php?section=cleanup sayfasında ki;
    • “Kayıtları Sakla” değerini 2 gün olarak ayarlayın.
  • /moodle/admin/settings.php sayfasında ki;
    • “Cronjob, istatistikleri işlemeye ne zaman başlasın?” değerini 0:0 olarak ayarlayın.
  • /moodle/admin/cron.php sayfasını çalıştırın.
  • Bu işlem silinecek kayıtların miktarına bağlı olarak biraz zaman alabilir.

Logların Silinmesi

  • /moodle/course/report/log/index.php?id=1 sayfasından tüm loglara tekrar göz atalım:
    • “39.218 kayıt gösteriliyor.”
  • Görünüşe göre 3,5 milyondan fazla kaydı başarıyla sildik.
  • Tekrar veritabanı boyutunu kontrol edelim:

  • Kayıtları silmiş olmamıza rağmen veritabanı boyutumuzda herhangi bir değişiklik olmadı.
  • data_free değerinde ciddi bir artış gözlendi.

Veritabanı Optimizasyonu

Ne yaptığınızdan emin değilseniz veritabanı üzerinde işlem yapmayın!

  • Büyük miktarlarda silme/ekleme/güncelleme yaptıktan sonra veritabanımızı optimize etmeliyiz.
  • Optimizasyon’a başlamadan önce yedek alalım

  • moodle isimli veritabanını optimize edelim

  • Veritabanı boyutunu son kez kontrol edelim.
  • Tebrikler, 1136 MB olan veritabanı boyutunu 232 MB’a düşürdünüz!

M.Serhat Dündar ~ msdundar

IP Adreslerini MySQL'de Barındırmak

MySQL içerisinde IP adresleri nasıl barındırmalıyız?

Öncelikle şurada ki güzel yazıyı okumanızı tavsiye ederim. Ciddi bir benchmark testi uygulanmış.

MySQL kendi içerisinde IP adresi barındırmak için kullanabileceğimiz iki güzel fonksiyonla gelir. Bunlar;

INET_ATON() ve INET_NTOA() fonksiyonlarıdır. INET_ATON() fonksiyonu string olan IP adresini, 32bitlik UNSIGNED INTEGER biçimine çevirir. INET_NTOA() ise bu işlemin tem tersini yapar.

Hemen test edelim;

3 kısımdan oluşan, günlük olarak kullandığımız IP adresleri aslında bu işleme tabi tutulmuş adreslerdir. Yani normalde “88.254.195.158” olarak andığımız bir IP adresinin bilgisayar dilinde ki ifadesi “1493091230”dır.

varchar(15) olarak bu barındırma işlemini yaptığımızda, 4 byte’lık INT_UNSIGNED türüne göre her adres için ciddi anlamda kardayız.

Yazı başında paylaştığım bağlantıya göre performansta ki fark %9 ila %12 arasında.

Peki veritabanında bu şekilde barınan 4 BYTE’lık veriyi PHP ile çağırmak istesem ve yine biz normal insanların okuyabileceği formata çevirmek istesem ne yaparım?

Çok kolay ;

veya işlemi tam tersten uygulamak için ;

Test ettiğinizde MySQL fonksiyonları ile bu fonksiyonların aynı sonuçları verdiğini göreceksiniz.

var_dump() fonksiyonu da ekleyebilirsiniz – tür ve uzunluk bilgisini de basarsınız böylece;

## string ‘88.254.195.158’ (length=14)

Eğer IP adresi geçerli bir adres değil ise, ip2long() fonksiyonu “NULL” döndürecektir. IP adreslerinin geçerliliğini sınamak için kolay bir yol olabilir.

Ben her detayı öğrenmek istiyorum diyorsanız şu yazıyı okuyunuz.

Hoşgeldin IPv6

Bu yazının tamamı IpV4 standartlarına göre yazılmıştır. Ve burada ki yöntemler yalnızca Ipv4 için geçerlidir. Peki ya IpV6 standartları ne olacak? Onları çeviremez miyiz? Çeviririz tabi ki. Bu konu hakkında kaynak yok denebilecek kadar az, bu yüzden şuan okuduğunuz satırlar çok değerli ((:

IpV6;’nın hayatımıza girmesiyle birlikte, PHP5’te sonra bu teknolojiye yönelik geliştirmeleri de kendisine dahil etti.

Aslında demin bahsettiğim konu içinde hayati bir önem taşıyor Ipv6 durumu. IP adreslerinin 32bit olmasından ve bundan tasarruf etmekten bahsetmiştim. Düşünsenize Ipv6 adresler ise 128 bit ! Yani tam 4 kat daha fazla veri demek veritabanlarınız için.

Dikkat ! Bu fonksiyonlar Linux üzerinde PHP’nin 5.1.0’sürümünden, Windows üzerinde ise 5.3.0 sürümünden önce çalışmayacaktır !

PHP’ye yeni eklenen inet_ntop() ve inet_pton() fonksiyonları bu işi yapmakta. Örnekleri Php manual sayfalarında bulabilirsiniz. Zaten 2 tane örnek var, bütün internette onlar dolaşıyor, daha tam net bilgiler yok bu konu hakkında.

Burada n => network, p => presentation veya printable kelimelerini temsil ediyor. Yani ntop => network to printable, pton => printable to network anlamına gelmekte.

Peki MySQL kanadında işler nasıl? MySQL şuan resmi olarak INET_ATON ve INET_NTOA gibi bir fonksiyon geliştirmedi. Bu işi yapmak için 3.parti bileşenlere ihtiyacımız var.

3.parti bileşen => http://bitbucket.org/watchmouse/mysql-udf-ipv6/get/tip.tar.gz

Şimdilik bu kadar. Daha sonra MySQL üzerinde Ipv6’ya daha detaylı değineceğim.

MySQL Veri Şifreleme Fonksiyonları

Merhaba,

Öncelikle şu sayfa elinizin altında bulunsun; http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

MySQL temel olarak 5 tane hazır şifreleme fonksiyonu ile gelir. Bunlar password(), encrypt(), md5, aes_encrypt() ve sha1()’dir.

Sahi birde sha() vardı, ne oldu ona? Birazdan…

MySQL konsolunu açarak hemen bir kaç deneme yapabilir

Sorulması gereken güzel soru : Hepsi tamam da, neden Encrypt fonksiyonu “NULL” döndürdü?

Çünkü bu fonksiyon yalnızca Unix üzerinde çalışmaktadır, eğer benim gibi Windows bir makine de denerseniz devamlı NULL sonucu döndürür (:

Peki bu neden önemli? Eğer web uygulamaları üzerinde bu fonksiyonlardan faydalanacaksanız, windows bir sunucu üzerinde bu fonksiyonu çalıştıramazsınız anlamına gelir.

Diğer bir önemli nokta ise Encrypt() fonksiyonu 2 karakterden daha az string ifadeler için işlem yapmaz, yine NULL döndürür.

Şimdi birde başta hatırladığım SHA’ya bakalım, hatta SHA1 ile karşılaştıralım ;

Dikkatlice karşılaştırırsanız her iki hash’in de aynı olduğunu görebilirsiniz. Çünkü uzun bir süredir, SHA artık SHA1 olarak anılıyor. Aslında durum tam olarak böyle değil, fakat şimdilik böyle yazmam yeterli, lafı uzatmayacağım.

Şimdi bir tablo oluşturalım ve içerisine MD5 ile kriptolanmış bir veriyi gönderelim ;

Şimdi ise test edelim ;

Gördüğünüz gibi hash olarak sonucumuzu görüntüledik.

Diğer fonksiyonlarıda kendiniz deneyebilirsiniz, aynı adımlar ile işlemekteler.

Şimdi clientinfo isimli veritabanımın varolan üç adet tablosunu MD5 ile crypt edeceğim;

Şimdilik bu kadar.

Şifreleme Algoritmaları için Benchmark Testi

Merhaba,

Veritabanında plain-text olarak veri tutmak tehlikelidir, bu yüzden verilerimizi MD5-SHA gibi şifreleme yöntemleri ile şifrelememiz gerekebilir. Bu aşamada seçeceğimiz şifreleme metoduna karar vermek açısından bir performans testi yapmak gerektiğini düşündüm.

Öncelikle şu sayfayı güzelce bir inceleyin, elimizin altında bulunsun; http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Elinizde ki stringin, çeşitli kriptolama yöntemlerinde ortaya çıkarttığı hash hakkında bir ön görüşünüz olması için şu ufak uygulamayı inceleyebilirsiniz; http://www.serhatdundar.com/projeler/string-hash-generator.php

Uygulamayı incelemek ve indirmek için; https://gist.github.com/979613

Ufak bir kaç benchmark testi yapalım. Bunun için aşağıda ki uygulamayı kullanabilirsiniz;

Bu testten alacağımız sonuçlara göre en hızlı çalışan ve en yavaş çalışan metodları göreceğiz. Dolayısıyla hangi şifreleme algoritmasını kullanacağımıza karar vermemizde önemli bir rol oynayan performans etkenini kafamızda netleştireceğiz.

(Bu test 32 byte’lık veri için, 1000 kez tekrarlanmıştır…)

Sonuçlara göre md2-whirlpool-sha512 ve sha384 hala en yavaş çalışan kripto metodları olarak görünüyor. En popüler yöntemlere göz atacak olursak MD5 en hızlı olarak değerlendirebileceğimiz 2.sırada, SHA1 ise 5.sıradan yerini alıyor.

MD5 ve SHA1 algoritmaları uzun zaman önce çözüldü, 512bit’lik (64byte) ve 384bit’lik SHA algoritması ise hala çözülebilmiş değil.

Whirlpool algoritmasını da son zamanlarda oldukça duymaya başladık. AES tabanında geliştirilen bu algoritma tahtını kimseye bırakmıyor ancak kullanışlılık yönünden puanı oldukça düşük. Performans yönünden bu denli zayıf olması web uygulamaları altında kullanımı önünde büyük bir engel, bu durum ise popülerliğini düşürüyor.

Excel'den MySQL'e Veri Import Etmek

Merhaba,

Şöyle bir excel tablo yapımız olduğunu ve bunu mysql’e import etmek istediğimizi düşünelim;

CSV dosya formatı bu iş için biçilmiş kaftandır. CSV yani comma-seperated values formatında excel tablomuzu kaydedelim.

* Birden çok CSV kaydetme alternatifi görebilirsiniz, “Virgülle ayrılmış CSV” seçeneği ile ilgileniyoruz şuanda. Zaten yalnızca CSV dosya tipine mahkumda değiliz tabi ki .txt .xml gibi başka formatlarda da benzer adımlarla import edebiliriz.

** CSV olarak kaydetme işlemi tek bir sayfa için çalışmaktadır, çoklu sayfalar içeren veri tablolarınızı ayrı excel dosyaları haline getirip CSV’ye çevirin.

*** Referanslı veri hücrelerini de CSV’ye çevirebilirsiniz, ancak bu pek tavsiye edilen bir yöntem değil, plain text olarak veri barındıran hücrelerden bu işlemin yapılması öngörülüyor.

Kaydettiğiniz CSV dosyasını herhangi bir text editörü ile açın ve kolon isimlerini (id-names-edu) silin-kaydedin.

Artık elimizde şöyle bir CSV dosyası olması gerekiyor ;

Sütun başlıklarınızı artık mysql’de oluşturabiliriz. Ben en basit ve pratik yöntem olan PhpMyAdmin üzerinden bu işlemi yapacağım. Sorgu çalıştırarakta pekala yapılabilecek bir işlem.

Madem sorgudan bahsettim, yazayım ki içimde kalmasın ;

PhpMyAdmin imkanı olmayanlarda nasiplenmiş olsun (:

“serhat” isimli veritabanıma 3 alandan oluşan “mustafa” isimli bir tablo oluşturuyorum, bu alanları şu şekilde düzenledim, siz ihtiyaca göre değiştirebilirsiniz;

Üst menüden “İçeri Aktar” seçeneğini, eğer İngilizce kurulu ise “Import” seçeneğini ve ardından CSV dosyamızı seçelim ;

“Kısmi içeri aktarma” başlığı altında uyguladığım değeri siz es geçebilirsiniz, buna takılmayın şimdilik, o konuya sonra değineceğim.

Lokal’de çalışıyorsanız sorun yok ancak sanal hosting üzerinden bu işlemi yapıyorsanız veri-sorgu boyutuna göre, hosting firmanızın “php.ini” dosyası üzerinde belirlediği sınırlar ile yetinmek zorundasınız.

php.ini dosyanız içerisinde ki;

“upload_max_filesize” değerini arttırarak, import edilebilecek dosya boyutunu da arttırmış olursunuz.

Eski MS Office sürümlerinde gördüğüm bir şeyi belirteyim, bizim CVS dosyamız noktalı virgül (;) işaretini ayraç olarak kullanıyor, ancak eski Office sürümlerinde bunun sadece virgül (,) olduğunu görmüştüm. Bu durumda “Seçenekler” başlığında ki “Alanı sonlandıran değer” girdisini virgül (,) ile değiştirmeniz gerekiyor.

Tüm bunları uyguladıktan sonra import etme işleminiz başarıyla gerçekleşmiştir.

Eğer hatalı bir işlem yaptıysanız, tabloyu boşaltıp tekrar import edebilirsiniz. Sorgu olarak ise bunu ;

bu şekilde gerçekleştirebilirsiniz.

Kolay gelsin.