Mysql Backup to FTP (Shell Script)
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYEPy8dX' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Bir önceki yazımda, bir mysql database'inin backup'ını alıp, sıkıştırdıktan sonra bir ftp sunucusuna upload eden bir php scriptini paylaşmıştım. İlgili yazıya buradan erişebilirsiniz.Bu yazıda ise, aynı işi daha fonksiyonel olarak yapan bir shell script'i bulabilirsiniz. Ameir Abdeldayem tarafından yazılmış olan bu script, temel olarak belirlediğiniz mysql database'lerinin backup'ını alıyor ve backup dosyalarını sıkıştırdıktan sonra tarihleme yaparak belirlediğiniz bir dizine koyuyor. Daha sonra belirttiğiniz bir ftp sunucusuna bağlanarak, sıkıştırılmış backup dosyalarını upload ediyor. Bu şekilde backup'larınızı hem mysql sunucusu üzerine de hem de başka bir sunucu üzerinde saklayabiliyorsunuz. Backup dosyalarını ftp'nin yanı sıra e-mail ile de bir başka yere göndermek mümkün. Ancak database'leriniz büyükse bu yolu tercih etmeyebilirsiniz. Ayrıca, e-mail yöntemi için sunucuda Mutt'un kurulu olması gerekir. Scriptin içeriği şöyle:
#! /bin/bash # Ameir Abdeldayem # http://www.ameir.net # You are free to modify and distribute this code, # so long as you keep my name and URL in it. # Mysql Sunucusunun Adi SERVER=sunucu_adi # Backup dizini. Default olarak kullanicinin home dizinidir. BACKDIR=~/backups # Backup dosyalarina eklenecek tarih formati. DATE=`date +'%m-%d-%Y'` #----------------------MySQL Settings--------------------# # Mysql sunucu bilgileri (IP address is best) HOST=localhost # MySQL username USER=username # MySQL password PASS=password # Backup'i alinacak db'lerin listesi. # DB'lerinizi dosluk birakarak ekleyebilirsiniz. DBS="db1 db2" # Burada y derseniz, mysql sunucusundaki tum db'ler backup alinir. # ve yukaridaki liste devre disi birakilir. DUMPALL=n #----------------------Mail Settings--------------------# # Backup'larin e-mail ile gonderilmesini istiyorsaniz y diyin. #(Sunucuda mutt kurulu olmalidir.) # Ben bu ozelligi n diyerek devre disi birakiyorum. MAIL=n # backuplarin iletilecegi e-mail adresleri. # Adresleri bosluk birakarak ekleyebilirsiniz. EMAILS="[email protected] [email protected] [email protected]" SUBJECT="MySQL backup on $SERVER ($DATE)" #----------------------FTP Settings--------------------# # Backup'larin ftp'ye upload edilmesi icin y diyin. FTP=y # FTP server bilgileri. FTPHOST="FTP_Server" FTPUSER="username" FTPPASS="password" # Ftp sunucusundaki backup dizini. Bu dizin bulunmuyorsa, backuplar, login olunan # ilk dizine upload edilir. FTPDIR="backups" #-------------------Deletion Settings-------------------# # Eski backup dosyalarinin silinmesini istiyor musunuz? DELETE=y # Kac gun oncesine kadar ki backup dosyalarini saklamak istiyorsunuz? DAYS=3 #----------------------End of Settings------------------# # check of the backup directory exists # if not, create it if [ -e $BACKDIR ] then echo Backups directory already exists else mkdir $BACKDIR fi if [ $DUMPALL = "y" ] then echo "Creating list of all your databases..." mysql -h $HOST --user=$USER --password=$PASS -e "show databases;" > dbs_on_$SERVER.txt # redefine list of databases to be backed up DBS=`sed -e ':a;N;$!ba;s/n/ /g' -e 's/Database //g' dbs_on_$SERVER.txt` fi echo "Backing up MySQL databases..." for database in $DBS do /usr/local/bin/mysqldump -h $HOST --user=$USER --password=$PASS $database > $BACKDIR/$SERVER-mysqlbackup-$database-$DATE.sql gzip -f -9 $BACKDIR/$SERVER-mysqlbackup-$database-$DATE.sql done # if you have the mail program 'mutt' installed on # your server, this script will have mutt attach the backup # and send it to the email addresses in $EMAILS if [ $MAIL = "y" ] then BODY="Your backup is ready! Find more useful scripts and info at http://www.ameir.net" ATTACH=`for file in $BACKDIR/*$DATE.sql.gz; do echo -n "-a ${file} "; done` echo "$BODY" | mutt -s "$SUBJECT" $ATTACH $EMAILS echo -e "Your backup has been emailed to you! n" fi if [ $FTP = "y" ] then echo "Initiating FTP connection..." cd $BACKDIR ATTACH=`for file in *$DATE.sql.gz; do echo -n "mput ${file} "; done` ftp -nv <<EOF open $FTPHOST user $FTPUSER $FTPPASS cd $FTPDIR prompt bin $ATTACH quit EOF echo -e "FTP transfer complete!" fi if [ $DELETE = "y" ] then find $BACKDIR -name "*.sql.gz" -mtime $DAYS -exec rm {} \; if [ $DAYS = "1" ] then echo "Yesterday's backup has been deleted." else echo "The backup from $DAYS days ago has been deleted." fi fi echo Your backup is complete!
Not: Kırmızı ile belirtilmiş alanları kendinize göre düzenleyip çalıştırabilirsiniz. Ben bazı türkçe açıklamalar ve ftp upload'ı sırasında soru sorulmaması için küçük bir ekleme yaptım. . Scripte ait orjinal sayfaya bu linkten ulaşabilirsiniz. Dosyanın orjinal halini buradan indirebilir; ve tarafımdan düzenlenmiş şeklini ise buradan indirebilirsiniz. Scripti kendinize göre düzenledikten sonra, aşağıdaki adımlar ile durumu test edin.
# chmod 755 /scriptin/bulundugu/dizin/scriptin_adi.sh # sh /scriptin/bulundugu/dizin/scriptin_adi.sh
Backup işlemi sorunsuz şekilde tamamlanıyorsa, scripti örneğin her gün 06:54'de çalışmak üzere aşağıdaki gibi bir girdi ile cron'a ekleyebilirsiniz:
45 06 * * * /bin/sh /scriptin/bulundugu/dizin/scriptin_adi.sh
UYARI!: FTP'ye upload edilen backup dosyaları geçmişe yönelik olarak silinmemektedir. Bu nedenle ftp sunucunuzun diski zamanla şişebilir. Bu konuya dikkat edin. |
Artık backup'larınız hem mysql sunucusu üzerinde hem de ftp sunucunuz ya da e-posta kutunuzda (ya da ikisinde birden) saklanacaktır.
Bu yazılar da ilginizi çekebilir:
- Mysql – Backup to FTP (PHP Script)
- WordPress Update Scripti
- Mysql Server İçin Root Şifresi Tanımlamak
- Mysql Data Dizininin Yerinin Değiştirilmesi
- Komut Satırından MySQL Kullanıcısı Oluşturmak
Yorumlar
Trackbacks
Yorumda bulunun.
“mysqldump” komutunu scriptleriniz içerisinde ve ya manuel olarak kullanarak backup alırken, mevcut veritabanları içerisinde herhangi bir table; “mysqldump: Got error: 145: Table ‘./dbname/tablename’ is marked as crashed and should be repaired when using LOCK TABLES” hatası verirse ilgili veritabanı yedeklenmeyecektir. Sorunu gidermek için aşağıdaki komutu kullanarak yedeklerinizi almaya devam edebilirsiniz:
[root@host]# mysqlcheck -u root -p –repair dbname tablename
Enter password: ********
dbname.tablename OK
[Cevapla]
Selam, 2 kisimda sorun var,
find $BACKDIR -name “*.sql.gz” -mtime $DAYS -exec rm {} ; olan kisim find $BACKDIR -name “*.sql.gz” -mtime $DAYS -exec rm {} \; olacaktir.
DBS=`sed -e ‘:a;N;$!ba;s/n/ /g’ -e ‘s/Database //g’ dbs_on_$SERVER.txt`
database isimleri arasinda deneme ve cevirmen olsun, yukaridaki komut ile deneme olur de eme, cevirmen olur cevirme vs. vs vs. gibi. Ve yedek alma islemi gecersiz olur.
DBS=`cat dbs_on_$SERVER.txt` seklinde duzenleyebiliriz.
[Cevapla]
Selamlar,
1. sorun, benim text editörümden kaynaklanmış. Şimdi düzelttim.
Db isimleri ile ilgili uyarinizi da kontrol ettim ancak ben oyle bir sorunla karsilasmadim.
Katkınız için teşekkür ederim.
[Cevapla]
Ben bu işlemi MySQLDumper isimli bir script ile yapıyorum. Bir çok scriptte Türkçe karakter sorunu yaşamıştım MySQLDumper ile böyle bir sorun hiç yaşamadım. Yaklaşık 6 senedir kullanıyorum 4-5 GB lik veri tabanını sorunsuz bir şekilde yedekliyor. Ayrıca locale yolladığı yedeklerde bahsettiğiniz şişme olayına karşın panelde sadece son x yedeği sakla diyebiliyorsunuz. Ayrıca dedicated olmayan sunucularda büyük yedekleri geri yüklerken yaşadığınız time out sorununuda aşmaktadır.
Denemek isterseniz.
http://www.mysqldumper.net/
[Cevapla]
Evet oldukça kullanışlı bir araç.
Hatta testlerden sonra bu konu ile ilgili bir kullanım klavuzu da yazılabilir.
Katkınız için teşekkür ederim.
[Cevapla]
teşekkürler tam da ihitiyacım olan şeydi.
[Cevapla]