對MySQL數據庫的備份與恢復是非常有必要的,它可以用很多種方法來實現,本文我們主要介紹了使用Xtrabackup來進行備份的全部過程,接下來就讓我們一起來了解一下這部分內容。
Xtrabackup是percona公司的開源項目,用以實現類似innodb官方的熱備份工具InnoDB Hot Backup的功能,能夠非常快速地備份與恢復mysql數據庫。 Xtrabackup中包含兩個工具:
xtrabackup是用於熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構;
innobackupex是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。
由於innobackupex的功能更爲全面和完善,所以,本文以innobackupex作爲基礎進行研究描述。
下載和安裝
在以下地址可以下載到xtrabackup:http://www.percona.com/downloads/XtraBackup/,可以根據自己的需要選擇穩定版本或者最新版本以及操作系統、源碼包或者rpm包等等。
其中,
innobackupex是我們要使用的備份工具;
xtrabackup是被封裝在innobackupex之中的,innobackupex運行時需要調用它;
xtrabackup_51是xtrabackup運行時需要調用的工具;
tar4ibd是以tar流的形式產生備份時用來打包的工具。
以下是幾個備份小腳本,僅供參考:
1.完整備份
#!/bin/bash
#
DATE=`date "+%F"`
User="root"
Passwd="mysql"
IP="localhost"
databak_dir="/mysqlbackup/full/$DATE" #備份的目錄
eMailFile=/mysqlbackup/full/email.txt
logFile=/mysqlbackup/full/logs/mysql-$DATE.log
Database="test_db"
if [ ! -d $databak_dir ] ; then
mkdir -p $databak_dir
fi
echo " " > $eMailFile
echo "---------------------------------" >> $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
/usr/bin/innobackupex --user=$User --password=$Passwd --defaults-file=/etc/my.cnf --database=$Database $databak_dir >> $eMailFile 2>&1
ls -d /mysqlbackup/full/$DATE > /mysqlbackup/full/1.txt
ls /mysqlbackup/full/$DATE > /mysqlbackup/full/2.txt
if [[ $? == 0 ]]; then
echo "BackupFileName:$Database" >> $eMailFile
echo "DataBase Backup Success" >> $eMailFile
else
echo "DataBase Backup Fail!" >> $eMailFile
mail -s " DataBase Backup Fail " $eMail < $eMailFile #如果備份不成功發送郵件通知
fi
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
find /mysqlbackup/full/ -name "*" -mtime +30 |xargs rm -rf
2.增量備份
#!/bin/bash
#
DATE=`date "+%F"`
User="root"
Passwd="mysql"
IP="localhost"
databak_dir="/mysqlbackup/increment/$DATE" #備份的目錄
eMailFile=/mysqlbackup/increment/email.txt
logFile=/mysqlbackup/increment/logs/mysql-$DATE.log
Database="test_db"
FDIR1=`cat /mysqlbackup/full/1.txt`
FDIR2=`cat /mysqlbackup/full/2.txt`
if [ ! -d $databak_dir ] ; then
mkdir -p $databak_dir
fi
echo " " > $eMailFile
echo "---------------------------------" >> $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
/usr/bin/innobackupex --user=$User --password=$Passwd --database=$Database --incremental --incremental-basedir=$FDIR1/$FDIR2/ $databak_dir >> $eMailFile 2>&1
ls -d /mysqlbackup/increment/$DATE > /mysqlbackup/increment/1.txt
ls /mysqlbackup/increment/$DATE > /mysqlbackup/increment/2.txt
if [[ $? == 0 ]]; then
echo "BackupFileName:$Database" >> $eMailFile
echo "DataBase Increment Backup Success" >> $eMailFile
else
echo "DataBase Increment Backup Fail!" >> $eMailFile
mail -s " DataBase Increment Backup Fail " $eMail < $eMailFile #如果備份不成功發送郵件通知
fi
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
find /mysqlbackup/increment/ -name "*" -mtime +30 |xargs rm -rf
3.還原
#!/bin/bash
#
DATE=`date "+%F"`
User="root"
Passwd="mysql"
IP="localhost"
Database="test_db"
FDIR1=`cat /mysqlbackup/full/1.txt`
FDIR2=`cat /mysqlbackup/full/2.txt`
IDIR1=`cat /mysqlbackup/increment/1.txt`
IDIR2=`cat /mysqlbackup/increment/2.txt`
#stop mysql
/etc/init.d/mysqld stop
#apply full log
/usr/bin/innobackupex --user=$User --password=$Passwd --defaults-file=/etc/my.cnf --apply-log $FDIR1/$FDIR2/
#apply increment log to full data
/usr/bin/innobackupex --user=$User --password=$Passwd --defaults-file=/etc/my.cnf --apply-log --redo-only $FDIR1/$FDIR2/ --incremental-dir=$IDIR1/$IDIR2/
rm -f /data/mysqldata/ib*
rm -rf /data/mysql/3306/data/test_db
cp $FDIR1/$FDIR2/ib* /data/mysqldata
chown -R mysql:mysql /data/mysqldata/
cp -r $FDIR1/$FDIR2/$Database /data/mysql/3306/data/
chown -R mysql:mysql /data/mysql/3306/data/$Database
#start mysql
/etc/init.d/mysqld start
還原腳本採用的是直接複製的做法,本人使用--copy-back時,老是出現報錯的情況,如下:
Original data directory is not empty! at /usr/local/xtrabackup/bin/innobackupex line 538.恢復的目錄必須爲空。經查官網,這是xtrabackup的一個BUG。
innobackupex did not check that MySQL datadir was empty before –copy-back was run. With this bug fix, innobackupex will now error out of the –copy-back operation if the destination is not empty, avoiding potential data loss or a strang combination of a restored backup and previous data. Bug Fixed: #737569 (Valentine Gostev)
由於我的data目錄不爲空,此處直接拷貝就可以了。