ajitatif.com - gökalp gürbüzer'in kişisel web sitesi
Tuesday, April 07, 2009
Wikipedia'nın bütün veritabanının MySql betiklerinin halka açık olduğunuzdan haberiniz vardır muhtemelen. Haberiniz yoksa da ayrıntılı bilgi http://en.wikipedia.org/wiki/Wikipedia_database adresinde.

Herşey iyi, güzel ama 2,5 GB'lık categorylinks SQL betiğinde MySql hep hata veriyor. Hata nedeni yanlış timestamp türü veri girilmeye çalışılması imiş ("Invalid timestamp value").

Biraz internet araştırısı ve biraz gayretle bu mesajın aslında bir hata değil, uyarı mesajı olduğunu anladım. MySql, canımın içi de 2,5 gb'lık toplu işlemde (transaction) bir tanecik bile uyarı aldığında bütün işlemi geri sarıyor. Aslında bu uyarıyı hata olarak görmesinin nedeni, olayın toplu işlem içinde gerçekleşiyor olması ve MySql'ın bu davranışını Sql Kipleri ile halledebiliyoruz.

Şimdi aşağıdaki komutu MySql'ınıza girin ve sonucuna bir bakın:
select @@global.sql_mode
Eğer siz de benim gibi MySql'ınızın çalışma parametrelerine dokunmadıysanız sonuç olarak aşağıdakine benzer bir manzara çıkacaktır:
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Eeesi, STRICT_TRANS_TABLES kipi toplu işlemlerde herhangi bir değeri tabloya ekleyemediği (INSERT) anda bütün işlemi geri sardırır. Biz de verdiğimiz değerler arasında böyle sorunlu değerler olduğunu bildiğimize göre haydi bu kipi kapatalım:
set global sql_mode = ''
Böylece bütün Sql kiplerini kapatmış olduk. Ama öyle hemen Wikipedia yığmasına saldırmayın, bu komut bundan sonraki bağlantılarda geçerli olacak. SQLyog'da iseniz "File | New Connection Using Current Settings" ile yeni bir bağlantı açar, sonrasında Wikipedia yığmasına yumulabilirsiniz.

Biraz Teknik Ayrıntı

MySql sunucusu (hizmet ya da cin/peri (DEAMON) olsun) çalıştırılırken Sql kipleri de verilir. Kipler my.ini (ya da linux'ta my.cnf) dosyasının içinde sql-mode="kipler" olarak ya da komut satırında --sql-mode="kipler" ile belirtilir (kipler virgül ile ayrılır). Bu kiplerin asıl amacı MySql'ı olabildiğince uyumlu kılmaktır. Nitekim bazı Sql kip kısayolları da bunu kanıtlar:
MSSQL = PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS
POSTGRESQL = PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS
ORACLE = PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER
MYSQL40 = NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE
...
...
Sql kiplerini sunucu başladıktan sonra değiştirmek için de sql_mode küresel parametresini kullanıyoruz. MySql'da @@ işareti sunucu parametresini belirtir. Biz de global parametresinin sql_mode sistem değişkenini görmek için
select @@global.sql_mode
sorgusunu verdik. Daha sonra da bu parametreyi değiştirmek için biraz daha farklı bir belirtim olan
set global sql_mode = ''
deyimini kullandık. sql_mode sistem değişkeni ile ilgili daha ayrıntılı bilgi http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html adresinde.

MySql'de sistem değişkenleri ikiye ayrılır: küresel (GLOBAL) ve oturum (SESSION) sistem değişkenleri. Adlarından da anlaşılacağı üzere bunlar yalnızca geçerli bağlantı (oturum) ya da bütün bağlantıları (küresel) kapsar ve etkiler. Benzer şekilde oturum sistem değişkenlerini görebilir ve değiştirebiliriz; ancak bazı sistem değişkenleri yalnızca oturum bazıları da yalnızca küresel kapsamda bulunurlar:
select @@session.sql_warnings
set session sql_warnings = ON
Ancak oturuma ait sql_mode sistem değişkenini değiştirmek bu örnekte işe yaramıyor, nedenini ben de çözemedim ama sanırım sql_mode parametresi bağlantıdan önce tanımlanması gereken bir sistem değişkeni.

Bütün sistem değişkenlerini görmek için MySql'a
show variables
komutunu girebiliriz.

Soru

Bunca şeyi yazdım, ettim ve categorylinks tablosunu kendi veritabanıma yığmayı başardım. Peki Wikipedia kategorileri arasındaki hiyerarşiyi nasıl çıkartacağım? Bilen varsa beri gelsin ne olur...

Tuesday, April 07, 2009 11:38:50 AM (GTB Daylight Time, UTC+03:00) | Comments [0] | MySql | Türkçe | Veritabanı | Wikipedia#
OpenID
Please login with either your OpenID above, or your details below.
Name
E-mail
(will show your gravatar icon)
Home page

Comment (Some html is allowed: a@href@title, blockquote@cite) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Live Comment Preview
Search
Archive
Links
Categories
Admin Login
Sign In
Blogroll
 aychulus.blogspot.com
Kuzen Ayşegül'ün blog'u
[Feed] volkanvardar.com
Volkan Vardar kişisel blog ve portföy sitesi
Themes
Pick a theme: