Pythonla MySql yedeği alıp mail atalım
Konumuz Pythonun faydalarından en üst seviyede faydalanmak!
Zaman zaman birçok kişinin ihtiyaç duyduğu, aradığı ve sıkıntılar yaşadığı bir konu; "Düzenli Yedek Almak". Bir çok server yada site yöneticisi kendine has yöntemlerle bu sorunu çözüyor. Server yöneticisi olmaya filan gerekte yok, kendi makinemizde backup ihtiyacı sürekli duymaktayız. Benzer bir sıkıntıyı dün akşam çok sevdiğim bir dostum yaşadı. Bende verdiğim söz üzerine ufak bir betik hazırladım. Birde şu olsun, birde bu olsun derken aşağıdaki kod ortaya çıktı. Maqas ekibi olarak kendi aramızda sohbet ederken bunun da yeterli olmadığını uygun zamanda başka yazı dizileri ile bu scripti geliştirmemiz gerektiğini düşündük.
Yeni başlayan arkadaşların kurcalayarak öğrenebilecekleri, kendi kodlarını geliştirebilecekleri şekilde hazırlanmıştır. Sınıf ve prosedürleri işin içine katarak daha pratik ve anlaşılır hale zamanla hepbirlikte getirecek ve geliştireceğiz.
Zaman zaman birçok kişinin ihtiyaç duyduğu, aradığı ve sıkıntılar yaşadığı bir konu; "Düzenli Yedek Almak". Bir çok server yada site yöneticisi kendine has yöntemlerle bu sorunu çözüyor. Server yöneticisi olmaya filan gerekte yok, kendi makinemizde backup ihtiyacı sürekli duymaktayız. Benzer bir sıkıntıyı dün akşam çok sevdiğim bir dostum yaşadı. Bende verdiğim söz üzerine ufak bir betik hazırladım. Birde şu olsun, birde bu olsun derken aşağıdaki kod ortaya çıktı. Maqas ekibi olarak kendi aramızda sohbet ederken bunun da yeterli olmadığını uygun zamanda başka yazı dizileri ile bu scripti geliştirmemiz gerektiğini düşündük.
Yeni başlayan arkadaşların kurcalayarak öğrenebilecekleri, kendi kodlarını geliştirebilecekleri şekilde hazırlanmıştır. Sınıf ve prosedürleri işin içine katarak daha pratik ve anlaşılır hale zamanla hepbirlikte getirecek ve geliştireceğiz.
Aşağıda paylaştığım python betiği; MySQL altında bulunan PhpMyAdmin database'inizi *.sql olarak dump ediyor, *gz olarak sıkıştırıyor, mail'e ekliyor ve gmail hesabınıza gönderiyor. Tabi tüm bu işlemleri yapması için 19. satır ile 33. satır arasında gördüğünüz ayar değerlerini kendinize göre değiştirmeniz gerekmektedir. Buun dışında betik içinde aldığım notlar kodun okunmasını gayet iyi yönlendirmektedir.
Tabi belirtmekte fayda var, ben bu kodu GNU/Linux altında 2 farklı sürümde denedim. Windows makinem (sanal&gerçek) olmadığı için deneme şansım olmadı. Windowsta deneyen ve sorun yaşaan arkadaşlar olursa peşinen kusura bakmasınlar.
#!/usr/bin/env python
#-*-coding:utf-8-*-
#---------------------------------
# MaqaSQLDumper V1.0
# @author: Maqas.net - hmustak'2012
# @mail : hmustak@gmail.com
#---------------------------------
# Betik içinde İhtiyaç duyduğumuz paketleri ekliyoruz
import datetime, os, time, smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import encoders
# MySQL Bilgileri
dbUser = "root"
dbPasswd = "1234567890!"
dbName = "phpmyadmin"
# Mail Bilgileri
mailUser = "hakan_mustak_xyz"
mailPasswd = "1233321!+%&"
mailFrom="hmustakxyz@gmail.com"
mailTo="hmustakxyz@gmail.com"
# Backup Bilgileri
backupPath = "/home/redshark/backup/mysql/"
backupFileName = "%s_%s_SQL_backup.sql" % (datetime.date.today().strftime("%Y-%m-%d"),dbName)
# Backup için klasörü kontrol ediyoruz.
if os.path.isdir(backupPath) == False :
print "[Sorun var] Dosyanı hazırlanacağı yol bulunamıyor"
os.mkdir(backupPath)
print "[Sorun Giderildi] Backup dizini yaratıldı => %s" % backupPath
#MysqlDump komutumuzu işleterek sql dosyamızı oluşturuyoruz
os.system("mysqldump -u%s -p%s %s>%s%s" % (dbUser, dbPasswd, dbName, backupPath, backupFileName))
#Oluşturduğumuz sql dosyamızı sıkıştırıyoruz
os.system("gzip %s%s" % (backupPath, backupFileName))
print "[Tamamlandı] Backup ve sıkıştırma işlemleri"
#MIMEMultipartı hazırlamaya başlıyoruz
posta = MIMEMultipart()
posta['Subject']="SQL Backup : %s " % backupFileName
posta['From']=mailFrom
posta['To']=mailTo
mesaj= "Veritabanınız %sismi ile yedeklenmiştir. \nBackup yolu : %s" % (backupFileName,backupPath)
posta.attach(MIMEText(mesaj))
#Ekleyeceğimiz dosyayı hazırlıyoruz
ekSql = MIMEBase("application", "octet-stream")
ekSql.set_payload(open(backupPath+backupFileName+".gz", "rb").read())
encoders.encode_base64(ekSql)
ekSql.add_header("Content-Disposition", "attachment", filename=os.path.basename(backupPath+backupFileName+".gz"))
posta.attach(ekSql)
#Mail göndermek üzere gmaile bağlanıyoruz (Günlük limit 500)
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(mailUser, mailPasswd)
smtpserver.sendmail(mailUser, mailTo, posta.as_string())
print "[Gönderildi] Yöneticiye bilgilendirme maili"
smtpserver.close()
print "*** Backup işlemi tamamlanmıştır ***"
print "Backup => %s%s%s" % (backupPath, backupFileName, "gz")
Hepsi bu kadar. Bundan sonra ilk yapacağımız iş; bu betiğin cron ile düzenli çalışmasını sağlamak ve son 1 haftalık yedekler dışındakileri silmesini sağlamak.
Saygı ve Sevgiyle
Hakan Müştak


