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
İlgili Makaleler
İlgili makale bulunamadı.







RSS feed for comments on this post.




