xtrabackup對MySQL進行備份和恢復

對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

[email protected]

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

[email protected]

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目錄不爲空,此處直接拷貝就可以了。

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章