Tüm verileri tek bir ambara yığmak yerine farklı tablolarda ve veritabanlarında düzenli bir biçimde saklar.
SQL adı verilen, veritabanlarına erişmek için kullanılan en yaygın ve standart dil ile işlemler yapıyor.
Çifte lisanslı bir yazılımdır. Hem Genel Kamu Lisansı'na (GPL) sahip özgür bir yazılım, hem de GPL'in kısıtladığı alanlarda kullanmak isteyenler için ayrı bir lisansa sahiptir.
MySQL'in Öyküsü - I
MySQL'in yaratıcısı Michael "Monty" Widenius'un kızının adı My.
Ekip kendi yazdıkları başka araçlara da daha önce de "My" takısını ekliyordu
İlk başta mSQL'i kendi ek geliştirmelerini yaparak işe başlıyorlar.
Sonunda kendi MySQL adlı veritabanı sunucularını 1995'te yayınlanıyorlar.
Çifte lisanslı bir yazılım. Hem Genel Kamu Lisansı'na (GPL) sahip özgür bir yazılım, hem de GPL'in kısıtladığı alanlarda kullanmak isteyenler için ayrı bir lisansla satılabiliyor.
MySQL'in Öyküsü - II
İsveç'te MySQL'i geliştiren firmanın adı TcX, yazılımın popüler olması ile beraber MySQL AB adını alıyor.
Firma tüm gelirini MySQL desteği, eğitimi ve geliştirmesinden ediniyordu.
MySQL'i tüm geliştirenler, MySQL AB firmasının birer ücretli çalışanı haline geldi, birçok ülkede çalışanı olan bir kuruluş oldular.
Oracle 2005'te, MySQL'in transaction destekli InnoDB tablo tipini geliştiren Innobase firmasını satın aldı.
Oracle 2006'da, MySQL'in tablo tiplerinden Berkeley DB'yi geliştiren Sleepy Cat firmasını satın aldı.
Sun 2008'de MySQL AB'yi satın aldı ve geliştirme yapısını değiştirdi.
Oracle 2010'da Sun'ı (ve beraberinde MySQL'i) satın aldı ve geliştirme yapısını daha da değiştirdi. Destek ücretlendirmesini %600 arttırdı.
MariaDB de ne ola ki?
Önce Sun, sonra Oracle MySQL'in topluluk geliştirme modelinden uzaklaştı.
MySQL'in yaratıcısı olan Monty Widenius, MySQL'in kodunu çatallayıp (fork), bu kez yazılıma ikinci kızının adı olan Maria'yı vererek, aynı kod tabanı üzerinden MariaDB adı ile geliştirmeye başladı.
İlk MySQL modelinde, toplulukla içiçe şirket destekli hızlı ve verimli geliştirmeye dönüldü.
MySQL ile aynı komutlar, aynı arayüzler, aynı kitaplıklar ve API'ler.
MySQL veritabanlarını dönüştürmeden kullanabiliyor.
Ek yeni özellikler ve geliştirmeler yapılıyor.
MariaDB'nin Dezavantajları
Dağıtımlar hala resmi olarak MySQL'i destekliyorlar.
MySQL'in markasının bilinirliği yok.
Çifte lisanslı değil, yalnız GPL (özgür yazılım) olarak kullanabilirsiniz.
MySQL'in Diğer Çatalları
Drizzle: Bulut kullanımı için daha küçük, hafif ve hızlı bir MySQL hedefi.
Percona: MySQL ile birebir uyumlu, daha iyi istatistik, performans ve kararlılık hedefliyor.
OurDelta: MySQL ve MariaDB için bir yama seti.
Neden Tercih Ediliyor?
Çok basit, hızlı, güvenilir ve kullanımı kolay.
MySQL'e Python'dan Java'ya kadar birçok programlama dili ile erişilebilir.
Apache ve PHP ile beraber web-veritabanı uygulamalarında çok yaygın olarak kullanılır. Apache-PHP-MySQL üçlüsü için hazırlanmış çok geniş bir yazılım yelpazesi bulunuyor.
Özellikle internet ortamında önem kazanan, çok esnek ve güçlü bir kullanıcı erişim kısıtlama/yetkilendirme sistemine sahip.
Özellikler
Birçok farklı platformda çalışabiliyor.
200.000'in üzerinde tablo, 5 milyarın üzerinde satır ile çalıştığı ifade edilen sistemler bulunuyor.
Transaction ve/ya atomik işlem kullanan çeşitli tablo tiplerini destekliyor.
Tabloların kontrolü, optimizasyonu ve tamiri hızlı bir biçimde yapılabiliyor.
Tablo bazlı farklı karakter setlerini (utf-8, iso8859-9, vs) ve onlara göre sıralama yapılmasını destekliyor, farklı dillerde hata mesajları verebiliyor.
ODBC desteği var, ODBC 2.5 komutları tamamen destekleniyor.
Bağımsız uygulamalar için gömülü (embedded) çalışabiliyor.
View, trigger, stored procedure, sanal kolon (MariaDB) gibi gelişmiş özellikler bulunuyor.
Atomik İşlem vs Transaction
Her iki tür işlemi de desteklediği için kullanıcı, uygulamasında atomik işlemlerin hızına mı transaction özelliklerine mi ihtiyacı olduğuna karar verebilir. Seçimler tablo bazında yapılabilir.
Transaction'lı tablo ile atomik işlemle çalışan tablo arasındaki en büyük fark performans konusunda oluşur. Transactionlı tablolar çalışırken daha fazla bellek, daha fazla disk alanı ve daha fazla işlemci gücü harcar.
Eğer uygulamalarınız kritik durumlarda COMMIT (veriyi yazmak) yapmaya değil de, ROLLBACK (geri dönmek) yapmaya göre yazıldıysa transaction kullanmak daha elverişli olabilir.
Çoğunlukla kritik transactionla çalışan güncellemeler, atomik olarak çalışacak şekilde tekrar yazılabilir. Transactionların çözdüğü tüm bütünlük problemleri LOCK TABLES, INSERT DELAYED ve benzeri yöntemlerle çözülebilir.
Tablo Tipleri - I
MyISAM: "Klasik" tablo tipidir. Çok hızlı, az kaynak harcayan ve verimli çalışmak için tasarlanmıştır.
InnoDB (MySQL): Güvenilir ACID uyumlu tasarım, gelişmiş MVCC yapısı ile standart transaction destekli tablo tipi.
XtraDB (MariaDB): Percona tarafından geliştirilen, InnoDB ile birebir geriye dönük uyumlu, yerine kullanılabiliyor. InnoDB'den daha çok özelliğe sahip, ince ayarı yapılabiliyor, ölçeklenebiliyor.
Memory: Hashlenmiş indeksler kullanırlar ve tüm veriler bellekte tutulur. Bu nedenle çok hızlı çalışırlar ama veritabanı kapandığında tüm verileri kaybedersiniz. Geçici tablolar için çok yararlıdırlar. Eski adı HEAP.
Archive: Az kullanılan büyük verilerin "indekssiz" olarak depolanması için kullanılır.
Tablo Tipleri - I
Merge: Birden fazla eş MyISAM tablosunun tek bir tablo gibi kullanılması için kullanılır. Özellikle çok büyük tabloların daha hızlı tarama yapılabilmesi için küçük eş tablolara bölunmesi durumunda işe yararlar.
CSV: Verilerin virgülle ayrılmış değerler (CSV) biçeminde saklandığı bir tablo türü. Diğer uygulamalarla kolay veri değişimi sağlıyor.
Federated (MySQL): Birbirinden bağımsız veritabanı sunucularını mantıksal tek bir veritabanı yaratmak için kullanabiliyor. Dağıtık yapılar için uygun. Artık Oracle tarafından geliştirilmiyor.
FederatedX (MariaDB): Federated ile birebir geriye dönük uyumlu, yerine kullanabiliyor. Gelişimi sürüyor, yeni özellikler ekleniyor, mevcut hatalar düzeltiliyor.
Blackhole: Üzerinde ne işlem yapılırsa yapılsın veri kaydetmeyen bir "kara delik". Bazı replikasyon senaryolarında kullanılabiliyor.
Tablo Tipleri - I
IBMDB2i (MariaDB): MariaDB'nin verilerini, transaction destekli olarak IBM i üzerinde bulunan DB2 tablolarında saklamasını sağlıyor. Oracle, MySQL'i satın aldıktan sonra bu desteği MySQL'den çıkarmıştı. MariaDB ile halen kullanılabiliyor.
Aria (MariaDB): Gelecekte MariaDB'nin hem atomik hem transaction tabloları için öntanımlı seçim haline gelmesi hedeflenen tablo tipi. 2007'den beri geliştiriliyor.
PBXT (MariaDB): Primebase tarafından geliştirilen, ACID uyumlu, MVCC ve benzeri gelişmiş özelliklere sahip bir tablo tipi.
OQGraph (MariaDB): Open Query Graph tabloları, hiyerarşik (ağaç yapısında) ve karmaşık grafların (birçok yönde çok sayıda bağlantı içeren düğümler) kullanılmasına olanak tanıyor.
SphinxSE (MariaDB): Veri saklanması ve aranması için Sphinx arama motorunu kullanmaya olanak tanıyan bir tablo tipi.
Auto Increment
Auto_increment özelliği, yeni satırlar için biricik (unique) bir değer oluşturmak için kullanılabilir.
Yeni satır girilirken auto_increment kolonuna herhangi bir değer girilmediği takdirde, kolonda bulunan en yüksek değerin bir fazlası otomatik olarak atanacaktır.
last_insert_id() SQL fonksiyonu ile, son girilen satıra otomatik olarak atanan değerin ne olduğu alınabilir.
Bir tabloda sadece bir kolon auto_increment özelliğine sahip olabilir.
İndeksler - I
İndeksler, belirli bir değeri olan satırları daha hızlı bulmak için kullanılırlar.
İndeks olmazsa, birinci kayıttan başlayarak, ilgili kayıtları bulana kadar tablonun sonuna kadar gitmek zorunda kalır. Indeksler sayesinde rastgele tarama yapılabilir.
İstenirse, kolonun tamamı değil sadece belirli bir kısmı da indekslenebilir.
Text/Blob tipi alanların tamamı değil sadece bir kısmı, tamamı için FULLTEXT indekslenebilir.
İndeksler - II
Bir tabloda en fazla 32 kolonda indeks oluşturulabilir.
Bir indeks birden fazla kolonu kapsayacak şekilde de yapılabilir. Bir indeks en fazla 15 kolonu kapsayabilir. Çoklu indeks, içerdiği kolonları kapsayan AND işlemleri sırasında kullanılır.
İndeksin kullanılması tablonun %30'undan fazlasına erişilmesini gerektirecekse, o zaman var olmasına karşın indeks kullanılmaz. Çünkü böyle bir sorguda, sıralı arama yapmak büyük olasılıkla rasgele aramadan daha hızlı olacaktır.
İndekslerin Kullanıldığı Sorgular
WHERE ifadesine uyan satırları hızlıca bulmak
Belirli bir kolonun MAX() ve MIN() değerlerini bulmak
Sıralama ve gruplama işlemleri
Join işlemleri için diğer tablolardan satırları almak
Wildcard ile başlamayan LIKE ifadelerinde
Tüm Metinde Arama (Fulltext Search)
Tabloda indeks olarak ayarlandığı kolon(lar)da doğal dil araması yapar. Tıpkı bir arama motoru gibi ilgili metinleri kelimelere ayırarak indeks oluşturur.
Ör: "Doruk Fişek" -"Özgür Yazılım A.Ş."
Arama yapılan metinler ne kadar büyük olursa, o kadar verimli çalışır.
Tüm metinde arama özelliği sadece MyISAM tablo tipinde kullanılabilir. Standart bir indeks gibi, tablo yaratılırken ya da daha sonra oluşturulabilir.
FULLTEXT indeksleri; CHAR, VARCHAR ya da TEXT/BLOB veri tipleri için kullanılabilir.
Tüm metinde arama MATCH() fonksiyonu ile gerçekleştirilir.
FULLTEXT indeks, alanın tamamına uygulanmak zorundadır. Sadece belirli bir kısmına yapılamaz.
Sorgu Önbelleği
Bir kullanıcı tarafından yapılan bir SELECT sorgusunun metni ve sorgunun sonucu ön belleğe atılır. Aynı sorgu tekrar yapıldığında ise veritabanında tarama yapmak yerine önbellekteki veriyi kullanıcıya gönderilir.
Önbellek, bayat veri göndermez. Bir tablo güncellendiğinde, o tabloda yapılmış olan tüm sorgular önbellekten silinir.
Verilerin çok fazla okunduğu ancak nadiren güncellendiği uygulamalarda büyük kazanç sağlar.
Sorgu önbelleğini gereğinden fazla büyütmek her zaman performans artışı sağlamaz. Yönetim yükü, performans düşüşüne yol açabilir.
Sistem Kayıtları (Log)
Error Log: MySQL sunucusu başlatılırken, durdurulurken ya da çalışırken oluşan hata kayıtları (makinaismi.err)
Binary Log: Veritabanında tutulan bilgilerde değişiklik yapan tüm sorguların kayıtları -- replikasyon ve yedekleme için de kullanılır (makinaismi-bin*)
Slow Log: Belirli bir süreden daha uzun süren ve/ya indeks kullanmayan sorguların kayıtları (makinaismi-slow.log)
Relay Log: Replikasyon sırasında ana makineden alınan veri değişiklikleri (makinaismi.log)
Query Log: Sunucuya yapılan tüm bağlantıların ve uygulanan sorguların kayıtları (makinaismi.log)
Ayrıntılı bilgi -> http://dev.mysql.com/doc/refman/5.1/en/server-logs.html
Yedekleme
Sunucu seviyesinde yedekleme: Veri dizininin (ör: /var/lib/mysql) topluca yedeklenmesi. Bu dizin tüm veritabanları, kullanıcıları ve log dosyalarını içerir. Servisi önce durdurmayı unutmayın!
SQL seviyesinde yedekleme: Veritabanlarının SQL komutlarından oluşan bir metin dosyası olarak yedeğinin alınması. mysqldump / mysqlimport araçları
Tutulan binary log kayıtları sayesinde veritabanının istenilen bir ana döndürmek mümkündür.
Alınmış bir tam yedek, süreci hızlandırır.
Son alınan tam yedek sisteme yerleştirilir.
Binary log kayıtlarının tam yedekten sonra dönülmek istenen ana kadar olan işlemler yaptırılır.
Replikasyon
Verinin birden fazla sunucuya çoğaltılması işlemidir.
Bir tane ana makinede veri güncellemeleri yapılır, tüm makinelerden veri okuma işlemi yapılır.
Süreksiz bağlantılarda da sağlıklı çalışır.
Replikasyonun Yararları
Ölçeklendirme: Veritabanından okuma işlemleri
Yedekleme: Herhangi bir donanım arızasında, birkaç ufak ayar değişikliği ile devreye sokabileceğiniz yedek sunucularınız olur.
Analiz: Veriler üzerinde analiz yapılıyorsa, bu farklı bir sunucuda (aynı veriler üzerinde) yapılabilir. Analiz işlemleri aktif kullanımı etkilemez.
Uzak yerlere veri dağıtımı: Veritaban(lar)ının birkaç farklı fiziksel mekanda bulunması gerekiyorsa, replikasyon ile verilerin sürekli güncel olması sağlanabilir.
Yönetim Arayüzleri: MySQL Workbench
Yönetim Arayüzleri: phpMyAdmin
Kullanıcılar ve Yetkilendirme - I
Tüm kullanıcılar ve yetkileri, "mysql" isimli bir veritabanında tutulur.
Bir kullanıcı iki parçadan oluşur : kullanici_ismi@bilgisayar_ismi (hostname). Bu ikili tek bir kullanıcı olarak algılanır. Yani ahmet@localhost ile ahmet@penguen aynı kullanıcılar değildir (localhost ve penguen aynı bilgisayarlar olsa dahi).
Bir kullanıcının 4 yetki seviyesi vardır. Her yetki seviyesi için mysql isimli veritabanında birer tablo bulunur.
Hiyerarşik olarak bu tablolar en genelden özele doğru tanımlama yapar.
Yetki tabloları ve mysql isimli veritabanı, normal veritabanları gibi çalışır. INSERT, UPDATE, DELETE gibi standart sql komutları ile tıpkı herhangi bir veritabanı üzerinde işlem yapıyor gibi kullanıcı tanımları yapabilirsiniz.
Kullanıcı tablolarında herhangi bir değişiklik yaptığınız zaman, değişikliklerin aktif hale gelebilmesi için FLUSH PRIVILEGES komutunu veritabanı servisine göndermeniz gerekir.
Kullanıcılar ve Yetkilendirme - II
User tablosu : Bağlanan kullanıcının sunucuya bağlanma hakkı olup olmadığını kontrol eder. Eğer erişim hakkı varsa, kullanıcı tabloda kendisi için belirtilen yetkilere sahip olur.
Db tablosu : Hangi kullanıcıların hangi veritabanlarına hangi bilgisayarlardan ulaşabileceğini belirler. Eğer kullanıcının ilgili veritabanına erişim hakkı varsa, tabloda kendisi için belirtilen yetkilere sahip olur.
Tables_priv tablosu : Aynı db tablosu gibi çalışır, ancak veritabanları yerine içindeki tablolara erişimi düzenler.
Columns_priv tablosu : Aynı db ve tables_priv tabloları gibi çalışır, ancak veritabanlarının içindeki tabloların içindeki kolonlara erişimi düzenler.
Kullanıcılar ve Yetkilendirme - III
Select_priv: Kayıtları okuma
Insert_priv: Kayıt ekleme
Update_priv: Kayıt değiştirme/güncelleme
Delete_priv: Kayıt silme
Create_priv: Veritabanı/tablo yaratma
Drop_priv: Veritabanı/tablo kaldırma
Reload_priv: Servisi yeniden başlatma
Shutdown_priv: Servisi kapatma
Process_priv: Serviste çalışan işlemleri takip etme
File_priv: Sunucudan dosya okuyup / yazma
Grant_priv: Başka kullanıcılara yetki verme
Index_priv: Indeks yaratma, değiştirme, silme
Alter_priv : Tablo ya da veritabanının yapısını değiştirme
Show_db_priv : Veritabanı listeleme
Lock_tables_priv : Tablo kitleme
Max_questions : Bir saat içinde yapabileceği enfazla sorgu sayısı
Max_updates: Bir saat içinde yapılabilecek en fazla güncelleme sorgusu sayısı
Max_connections: Bir saat içinde yapılabilecek en fazla bağlantı sayısı
Sunucunun Optimizasyonu
Servisin hangi ayarlar ile çalışmakta olduğu SHOW VARIABLES komutu ile görülebilir.
Optimizasyon ayarları my.cnf dosyasından yapılıyor. Örnek ayar dosyaları mevcut.
MySQL Tuner -> http://mysqltuner.com
Daha Çok MariaDB/MySQL
Kümeleme (Cluster)
Bilgi Şemaları (Information Schema)
ANSI SQL'den Farklı Eklenti ve Özel Davranışlar
Güvenlik ve Performans Önerileri
Programlama Arayüzleri (API)
Yalan Yanlış Bilgiler
Tam özgür bir veritabanı sunucusu değil.
Ticari işletmelerde kullanmak için para ödemek gerekir.
Bir veritabanı sunucusu olarak güvenilir değil, veri kaybediyor.
Büyük(!) veritabanları için uygun değildir.
Kurumsal uygulamalarda MariaDB yerine MySQL tercih edilmelidir.
Kaynaklar
Yardım -> http://www.linux.org.tr/yardim
MySQL El Kitabı -> http://dev.mysql.com/doc/refman/5.1/en