CookingTheCode.COM

Veritabanı yedeklemek

03 Aralık 2008Çarşamba01:20Yorum: 7
Kategori: Veritabanı Sunucu Tarafı

Yedek alma, bakcup veya yedekleme, adına ne korsan koy, basittir fakat çoğu kimse uğraşmaktan pek hoşlanmaz. Çok can sıkıcı olduğu kadar can alıcıdır da. Örneğin, mysql veritabanı yedeklemek için phpmyadmin'i kullanılabilir. Fakat her seferinde bunu bizzat sizin yapmanız gerekir. Tamamen vakit kaybı. Özelikle de birden fazla sunucu için bu iş yapılacaksa...

Ben de bu işi otomatik, zaman ayarlı ve çeşitli yöntemlerle yedekleme yapacak php ile veritabanı yedekleme betiği(script'i) yazarak büyük birt dertten kurtuldum.


Php ile veritabanı yedeklemek basittir. Mysql'in backup sistemine, php'nin exec() veya system() gibi komutları ile erişilerek yedekleme yapılabilir. Fakat paylaşımlı olarak kullanılan sunucularda (barındırma hizmeti verenlerin %90 paylaşımlıdır) php'nin exec() ve system() gibi komutları güvenik gerekçesiyle kullanıma kapatılmıştır.

Bu kod(phpMysqlBackup.php), information schema veritabanından yararlanarak yedekleme yapmaktadır. En kıt yetkilerlere sahipken bile pes etmez, yedekler. Yedeklemeli.

Neleri yedekler?

Seçtiğin veritabanlarını, veritabanlarının içindeki tabloları ve tablolardaki verileri yedekler. İsterseniz bir veritabanındaki tüm nesneleri veya sadece bazılarını yedekleyebilirsiniz.

Nereye yedekler?

Php ile veritanı yedekleme kodu, oluşturulan geri yükleme kodunu, yani içinde sql kodlarının bulunduğu dosyayı, ftp ile bir sunucuya kaydeder, bir e-posta adresine gönderir, yerel diske yazar. Bu üç seçeneği de kullanabileceğiniz gibi, sadece birini de kullanabilirsiniz.

Ne zaman yedekler?

Dakika olarak belirlediğiniz vakitlerde yedekler. Bu şekilde bir veritabanındaki bazı tabloları günde bir kez yedekleyebilir, bazılarını ise 3 günde bir yedekleyebilirsiniz. Haftada bir de veritabanını tamamıyla yedeklersiniz. Sık değişmeyen tabloları yedeklemenin ne anlamı var?

Ne kadar güvenilir?

Ben güvendim ve kullandım. Çalıştı. Sonra bir kaç defa daha kullandım. Yine çalıştı. Ben bir arıza göremedim, görürseniz aşağıdaki yorum formu ile bana bildirirseniz size teşekkür ederim. Fakat siz bir kez deneyin ve oluşan yedek dosyasına bir göz atın, belki bazı sorunlar meydana gelmiştir.

Ne kadar ödemeliyim?

Bu seferlik benden ;)
Ciddiyetle, bu kod bir lisansa sahip değil. İşine yararsa kullan, hata bulursan bana bildir, hatta kodu geliştir ve bana gönder. Başka bir beklentim yok. Ayrıca ticari olarak da rahatça kullanabilirsiniz, ticari olarak kullanmayacaksınız da bu kodu ne yapacaksınız?

Kullanımı:

Her bir yedekleme işlemi için $this->schedules dizisine görev eklemelisiniz. Bir görev özetle şöyle der: 'şu sunucudaki, şu veritanındaki, şu tabloları, şu ftp'ye, şu epostaya ve şu dizine yedekle her XX dakikada bir yedekle'

$this->schedules=array(
'1440'=>array(
'db'=>array('host'=>'localhost','user'=>'mysql_kullanici','password'=>'mysql_şifre'),
'dbObjects'=>array('urunler'=>array('*')),
'email'=>array('to'=>'mr.atik@gmail.com','title'=>'CookinTC DB Yedeği - ','from'=>'bilgi@site.com','fileName'=>'cookingVtYedek','timeSuffix'=>true, 'titleTimeSuffix'=>true, 'message'=>'Cookingthecode.com Veritabanı Yedeğidir. Lak lak lak...'),
'local'=>array('fileName'=>'ctcDB','timeSuffix'=>true),
'ftp'=>array('address'=>'site.com','username'=>'ftp_user', 'password'=>'ftp_pass', 'remoteDir'=>'/YedekDizini/', 'fileName'=>'dbYedek','timeSuffix'=>true)
)
)


Yukarıdaki görev 1440 dakikada bir yani 1440/60=24 saatte bir, localhost sunucusundaki urunler veritabanı içinde bulunan tüm tabloları ftp, eposta ve yerel dizine kaydeder.


Çoklu veritabanı yedekleme için dbObjects dizisini şöyle yazabilirsiniz;
'dbObjects'=>array('urunler'=>array('*'), 'muhasebe'=>'*'

bu haliyle hem urunler hem de muhasebe veritabanındaki bulunanlar yedeklenecektir.


Sadece belitrilen tabloları yedeklemek için;
'dbObjects'=>array('urunler'=>array('urun','siparis','stok'), 'muhasebe'=>array('bilanco','giderler')

bu haliyle urunler veritabanındaki urun, siparis ve stok tabloları; muhasebe veritabanındaki bilanco ve giderler tabloları yedeklenecektir.


Bir kaç tablo hariç tüm her şeyi yedeklemek için;
'dbObjects'=>array('urunler'=>array('*','--stok'), 'muhasebe'=>array(''*','--loglar')

bu haliyle urunler veritabanındaki stok tablosu hariç tüm tablolar; muhasebe veritabanındaki loglar tablosu hariç tüm tablolar yedeklenecektir.


Çoklu görev listesi örneği;
$this->schedules=array(
'120'=>array(
'db'=>array('host'=>'localhost', 'user'=>'mysql_kullanici', 'password'=>'mysql_şifre'),
'dbObjects'=>array('blog'=>array('mesajlar')),
'local'=>array('fileName'=>'ctcDB','timeSuffix'=>true)
),
'600'=>array(
'db'=>array('host'=>'localhost', 'user'=>'mysql_kullanici', 'password'=>'mysql_şifre'),
'dbObjects'=>array('blog'=>array('makaleler')),
'ftp'=>array('address'=>'site.com','username'=>'ftp_kullanici', 'password'=>'ftp_parola', 'remoteDir'=>'/yedekDizini/', 'fileName'=>'DBYedek','timeSuffix'=>true)
),
'7200'=>array(
'db'=>array('host'=>'localhost', 'user'=>'mysql_kullanici', 'password'=>'mysql_şifre'),
'dbObjects'=>array('blog'=>array('*')),
'local'=>array('fileName'=>'ctcDB','timeSuffix'=>true)
)
)

bu görev listesi;  her iki saatte bir (120/60=2) blog veritabanındaki mesajları yerel diske kaydeder, her on saatte bir (600/60=10) blog veritabanındaki makaleleri ftp sunucusuna yükler, her 5 günde bir (7200/24/60=5) blog veritabanındaki her şeyi yerel diske kaydeder.


Gerisi kod dosyasında anlatıldı. Yine de bir şeyler sormayı düşünürsen, elini korkak alıştırma, yaz bana.

Çok konuştum. İşte php ile veritabanı yedekleme kodum; phpMysqlBackup.zip

Bu Konuya Yazılan Yorumlar Listeneniyor
  • 15 Aralık 2008Pazartesi19:48Yazan : nurettin

    link çalışmıyor

  • 16 Aralık 2008Salı01:05Yazan : Mustafa Atik

    Evet, link çalışmıyormuş. Şimdi çalışıyor.

  • 11 Şubat 2009Çarşamba15:25Yazan : Mustafa Atik

    E-posta göndermek için kullanılan sınıfta birkaç değişiklik yapılması şart. Eski bir sınıf zaten. Sınıf, smtp sunucusuna tcp ile bağlanıyor, bu yöntem değiştirilmelidir. Hayrıan birisi yaparsa sevinirim. Eğer zamanım olursa, ben değiştireceğim.

  • 12 Şubat 2009Perşembe00:35Yazan : 3hrf

    cronme.org ile iyi gider.

  • 12 Şubat 2009Perşembe00:58Yazan : Mustafa Atik

    Bu uygulamada zamanlanmış yedekleme özelliği de var. Belirli sayfalarda bu sınıfın yedek alan metodu çağırılarak işlem yapılabilir. Yedek alma, eğer süre uygunsa, yapılacaktır, aksi taktirde yedek almayacaktır.

    Fakat her sayfadan ayrı ayrı çağırmak yerine cron kullanmak daha iyidir.

  • 29 Ağustos 2009Cumartesi15:40Yazan : _KmL_

    Teşekkürler. Geliştirilirse dahada gzel olur.

  • 05 Nisan 2010Pazartesi20:48Yazan : online

    Ne icin, tesekkur ariyordum

Yorum Formu, ne düşünüyorsan yaz!
  • Bu da ne?
  • Gönderiliyor

Yazan: Mustafa Atik
mustafaatik.com