Ana Sayfa » *nix » Mysql Backup to FTP (Shell Script)

Mysql Backup to FTP (Shell Script)


BerbatKötüİdare EderGüzelHarika (Toplam 2 oy. 5 puan üzerinden ortalama 5,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYVWGxEd' (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 'ı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 'i bulabilirsiniz. Ameir Abdeldayem tarafından yazılmış olan bu script, temel olarak belirlediğiniz mysql database'lerinin 'ını alıyor ve 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 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.

Visited 1.412 times, 1 visit(s) today
Kategoriler: *nix,ipucu,Mysql,Scripts |

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


  1. Sezgin Bayrak | (Haziran 4th, 2009 5:38 am)

    “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]

  2. Murat Ugur Eminoglu | (Ekim 19th, 2010 12:44 pm)

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

  3. Serkan | (Aralık 26th, 2010 1:53 pm)

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

  4. hakan | (Şubat 24th, 2011 1:54 am)

    teşekkürler tam da ihitiyacım olan şeydi.

    [Cevapla]

Trackbacks

Yorumda bulunun.