ipsure logo
Logo and Language
Giriş ikonu Dil seçim ikonu
Merhaba, misafir
*NIX Aktif kategori menüsü sol parantez Aktif kategori menüsü sağ parantez Uygulamalar bloğunun başlık resmi Uygulamalar başlık resmi sağ bloğu Uygulamalar başlık resmi son menü bloğu
MS İPUCU PKI PROJELER WORDPRESS YEDEKLEME Aktif kategori menüsü sol parantez Aktif kategori menüsü sağ parantez English UYGULAMALAR HİZMETLER IT BUSINESS İLETİŞİM HAKKIMIZDA REFERANSLAR KOŞULLAR RSS
Ana sayfa Uygulamalar Hizmetler IT Business İletişim Hakkımızda Referanslar Kullanım Koşulları RSS

08/01/2010

MySQL Veritabanlarının Yedeklenmesi

Kategori: *NIX, yedekleme — Etiketler:, , , , , , ̵ 2; Sezgin Bayrak @ 04:57

MySQL sunucunuz üzerinde bulunan veritabanlarından istenilenlerin yedeklenerek tercih edilen bir dizine kopyalanması için aşağıdaki scripti yapınıza göre düzenleyip kullanabilirsiniz. Dilerseniz bu işlemi cron üzerinde tanımlayarak yedeklemenin belirli aralıklarla otomatik olarak gerçekleşmesini sağlayabilirsiniz. Bu yedekleri aynı ve ya uzak bir lokasyondaki farklı bir sunucuda düzenli olarak depolamak, yönetmek ve raporlamasının yapılmasını sağlamak üzere merkezi bir yedekleme çözümü arayışındaysanız FreeBSD Üzerinde Rsync İle Otomatik Yedekleme ve Senkronizasyon Çözümü başlıklı projem hakkındaki makalemi incelemenizi tavsiye ederim.

Script, isimleri ve toplam adedi verilen MySQL veritabanlarının yedeklerini alırken sıkıştırıyor, belirtilen günden eski yedek dosyalarını ise siliyor. Yedeklemeyi gerçekleştiren satırda (:71) birbirine bağlı (piped) komutların ilki olan ve STDERR yönlendirmesini göremeyeceğimiz “mysqldump” komutu için alternatif kullanıcı adı ve şifre sorgulaması deyimi (:31) içeren scriptimiz, MB. olarak belirtilen büyüklük aşıldığında ise log dosyasını rotasyona sokarak, belirtilen günden eski log dosyalarını da temizlemekte.

#!/usr/local/bin/bash
# Sezgin Bayrak (sbayrak@ipsure.com)
# http://www.ipsure.com (2010)
#
# db-backup.sh; Processes MySQL database(s) backups and logs
#
MyUSER="root"           # USERNAME
MyPASS="password"       # PASSWORD
MyHOST="localhost"      # Hostname
COUNT=0                 # Counter reset. Do not edit.
###################
# Local Databases #
###################
DB[1]="company"                 # Database 1
DB[2]="dblife"                  # Database 2
DB[3]="dbmatch"                 # Database 3
DB[4]="facebook"                # Database 4
DB[5]="mail"                    # Database 5
DB[6]="intrapub"                # Database 6
DB[7]="pureftp"                 # Database 7
DB[8]="phplist"                 # Database 8
DBN=8                           # Total number of databases
LOGDATE=`date +"%d.%m.%Y %H:%M"`
GZIP="gzip"
MBD="/space/mysql-backups"      # Backup path and folder
LOGFILE="backup.log"
MDAY=15                         # Max. day that backups will be kept on disk
LSZ=5                           # Max. size of logfile in MB. before initiation of rotation
LDAY=21                         # Max. day that rotated logs will be kept on disk
# Checking MySQL authentication
DBCONN=$(mysql -u $MyUSER --password=$MyPASS -e "show databases;" | grep "mysql")
if [[ $DBCONN != "mysql" ]]
 then
 echo "MySQL DB connection can not not be established. Check you username and password and try again."
 exit
fi
# Checking if backup directory exists. If it doesn't, we'll create it.
if  [ -e $MBD ]
then
 echo "Backup directory already exists"
else
 mkdir $MBD
fi
# Checking if logfile exists. If it doesn't, we'll create it.
if  [ -e $MBD/$LOGFILE ]
then
 echo "$LOGFILE is with us"
else
 touch $MBD/$LOGFILE
fi
# Checking if mysqldump exists
mysqldump --help > /dev/null 2>&1
if [ $? -ne 0 ]; then
 echo "$LOGDATE Error: mysqldump can not be located" >> $MBD/$LOGFILE;
 exit 1;
fi;
#
# Checking if GZIP exists
$GZIP --help > /dev/null 2>&1
if [ $? -eq 127 ]; then
 echo "$LOGDATE Error: $GZIP can not be located" >> $MBD/$LOGFILE;
 exit 1;
fi;
##################
# Backup process #
##################
for (( c=1; c<=$DBN; c++ ))
do
FNUM=$c
 FILENAME="${DB[$c]}-backup-`date +%Y.%m.%d.%H.%M`.sql.gz"
 mysqldump -u $MyUSER -h $MyHOST --password=$MyPASS ${DB[$c]} | $GZIP -f -9 > $MBD/$FILENAME
 if [ $? -eq 0 ]
 then
 COUNT=$(($COUNT+1))
 echo "$LOGDATE Backup process completed succesfully for $COUNT. of $DBN databases: $FILENAME" >> $MBD/$LOGFILE
 # Removing backups older than $MDAY
 rm -f `find $MBD/ -type f -mtime +$MDAY -name "*-backup*.gz"`
 else
 echo "$LOGDATE An error occured while processing database backup: $?" >> $MBD/$LOGFILE
 fi
done
if [ $COUNT -eq $FNUM ]
 then
 echo "All backup processes for total of $FNUM databases were completed successfully"
 else
 if [ $COUNT -eq 0 ]
 then
 echo "None of databases were processed as expected, please inspect $MBD/$LOGFILE for further details"
 else
 echo "Backup processes were completed for $COUNT of $FNUM databases, please inspect $MBD/$LOGFILE for further details"
 fi
fi
################
# Log rotation #
################
RLOG="$LOGFILE-`date +%Y.%m.%d.%H.%M`.rotated.bak"
if [ $(du -m $MBD/$LOGFILE | awk '{ print $1 }') -ge $LSZ ]
 then
 echo "Logfile size is greater than $LSZ MB., rotating... "
 mv $MBD/$LOGFILE $MBD/$RLOG
 touch $MBD/$LOGFILE
 rm -f `find $MBD/ -type f -mtime +$LDAY -name "*.rotated.bak"`
 else
 echo " " >> $MBD/$LOGFILE
fi
exit

“mysqldump” komutunu scriptleriniz içerisinde ve ya komut satırında direk 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 kullanabilirsiniz;

# mysqlcheck -u root -p –repair dbname tablename
Enter password: ********
dbname.tablename OK
Related Posts with Thumbnails
RSS Beslemelerimize ye olun FeedBurner yoluyla email yelii FeedBurner yoluyla RSS yelii

İlgili Makaleler

  İlgili makale bulunamadı.

1 Yorum »

Geri İzlemeler

Okuyucu Yorumları

Henüz bir okuyucu yorumu mevcut değil.

RSS feed for comments RSS feed for comments on this post. Geri İzleme URL'si.

Yorum yapın