Büyük sql dosyalarını veritabanı sunucusuna yüklemek bazen sıkıntılı olabiliyor. Benzer sorunu başkalarının da yaşama ihtimalini düşünerek  sorunun çözümü hakkında bilgi vermek istiyorum. Kullandığım hosting firması (site dosyalarını bilgisayarında barındıran firma) MySQL veritabanı sunucusuna doğrudan erişim vermemiş. Yani işlem yapmak için doğrudan veritabanı sunucusuna bağlanamıyorum.Servislere dışarıdan doğrudan erişiminin kapatılması (servisi izin verdiği standart arayüze) sunucu güvenliği açısından çok tercih edilen bir yöntem. Dışarıya nekadar az servis açık olursa güvenlik de o denli yüksek tutulmuş olur.

Sorun üzerinde çalıştığım yeni bir projeye (2 aydır bekliyor, yakında hizmete girecek) ait yaklaşık 7 MB lık bir sql dosyasını veritabanı sunucusuna yükleme isteğimle başladı.Hosting firması FTP erişimi dışında MySQL işlemleri için sadece PMA’nın (PHPMyAdmin) kullanılmasına izin vermiş. Doğrudan MySQL erişimim olsaydı NaviCat gibi bir programla verileri sunucuya kopyalamayı düşünürdüm ama bu durumda bhunu yapmak mümkün gözükmüyor. PMA php ile yazılmış bir script, her türlü veri girişi ve sorgulama işlerinin yapılabildiğini bir web arayüzüne sahip.

Doğal olarak verileri yüklemeyi ilk olarak PMA’nın "SQL sorgusu" paneli ile yapmayı denedim. 7 megabyte’lık metin verisini bir html metin kutusuna yapıştırıp submit etmek nekadar iyi bir fikir tartışılır ama bu iş için başlangıç noktası da burası. Her zaman en basitini deneyerek başlamak en mantıklısı (zaten öğretmenlerimizde herzaman söylemezmiydi sınavlardan önce "bildiğiniz en kolay soruyu yaparak başlayın" diye). Nitekim önceden tahmin ettiğim sonucu aldım. Dosya çok büyük olduğu için gönderme sırasında bağlantı zaman aşımına uğradı. Veri dosyası yüklenemeden bağlantı koptu. Upload hızımın düşük olması (asimetrik bağlantı yüzünden) nedeniyle sunucunun http zaman aşımı sınırına denk geldim. Kim bilir belki PHP nin max upload size değerine takılmışımdır.

Bu basit işi fazla uzatmayıp bir an önce halletmek amacıyla sql dosyamı FTP ile PMA’nın upload dizinine yükledim. Böylece bağlantı zaman aşımına neden olmadan PMA nın veri dosyasını sunucu dizininden bir çırpıda okumasını sağlayacaktım. Normalde PMA’nın bu özelliği (yani sunucunun lokal dizininden sql dosyasını yükleme özelliği) pasif olarak geliyor. Aktive etmek için config.inc.php deki UploadDir değerine bir dizin ismi belirtmek gerekli ama yeterli değil.

 $cfg[‘UploadDir’] = ‘upload’;

Bunu yaptıktan sonra PMA’nın ana dizinininde upload isimli bir dizin açmak gerekli. PMA’nın SQL Sorgusu sekmesinde yükleme dizini listesinin görünmesi için, yükleme dizininde (bu örnekte ‘upload’) bir sql dosyasının var olması gerekiyor. Bu yüzden, ayarları yaptıktan sonra neden özellik aktif olmadı diye düşünmeyin.

PMA’nın bu bahsettiğim özelliğini "SQL Sorgusu" sayfasının "web sunucu yükleme dizini" adlı kısmındaki açılır listeden dosya ismi seçilerek kullanılıyor.

Bu bilgiyi de edindikten sonra tamam başardım derken… Yine olmadı ! Bu sefer de script zaman aşımına denk geldim (Her php programcığının önceden tanımlanmış bir maksimum çalışma süresi vardır. Yani bir döngü açarak veya uzun bir iş vererek bir script’i 1 saat boyunca çalıştıramazsınız. Ve böyle olması da çoğu durumda iyi bir özelliktir (burada olmasa da. Bu güvenlik ayarı php.ini dosyasında time_limit ile yer alır). Dosya o kadar büyüktüki php yorumlayıcının dosyanın tamamını okuyup veritabanına yazması  maksimum çalışma zamanı değerini aşıyordu. Zaman aşılınca da veri yüklenemeden scriptin çalışması sonlandırılıyordu. İlkönce aklıma set_time_limit ile maksimum çalışma değerine artırmak geldi ama sonradan hatırladımki php safe modda çalışıyordu. (safe_mod’da çalışan bir php ye bu tür direktifleri veremezsiniz) Murphy ne güzel yazmış: Bir işin ters gitme olasılığı varsa, ters gider. Çünkü işlerin ters gitmesi için düz gitmesinden daha çok neden vardır.

Sonunda anladım ki veri dosyasını parçalara ayırıp daha küçük dosyalar haline getirmek gerekiyor. Örneğin 10 paraçaya ayırırsam 700KB lık dosyalarla problem yaşama olasılığım daha az. Sonuç olarak 10 parçaya ayırdım ve FTP ile upload dizinine yükledim, PMA aracılığıyla da teker teker  veri tabanına başarıyla yükleyebildim. Mutlu son. :)

Parçalama işini de ufak bir program (~174KB) yazarak hallettim. Program belki işinize yarayabilir. Değiştirmek isterseniz delpi kaynak kodları da arşiv içinde mevcut. Sıradan bir iş gibi gözüken bu yükleme işlemi bu sayfanın hazırlanmasını da sayarsam yaklaşık 4 saatimi aldı. Dosya boyutu uygun olsaydı bir kaç dakika da bitecekti.

Şimdi, bu sorunu yaşadıktan sonra başkaları nasıl hallediyor diye düşünmeden edemiyorum. Üçüncü parti programlar (NaviCat, MySQLFront) için bir tür php – mysql gateway olmalı diye düşünüyorum. Yoksa PMA kullanmak ve burada olduğu gibi veri yükleme işleri gereğinden fazla zahmet verici.

Yazan: Tankado

 

CEVAP VER