使用 mysqldump 邏輯備份還原單個數據庫/表很是方便。可是,當數據量比較大的時候,對邏輯備份進行恢復的時間太長了。這個時候選擇物理備份的方式能大大縮短其中時間。
mysql
使用 xtrabackup 進行全庫物理備份還原很是簡單,無須對其表空間(tablespace)進行從新導入。sql
xtrabackup 全庫備份還原步驟:數據庫
建立備份bash
$ xtrabackup --backup --target-dir=/data/backups/服務器
準備備份socket
$ xtrabackup --prepare --target-dir=/data/backups/ide
還原備份spa
$ xtrabackup --copy-back --target-dir=/data/backups/server
$ chown -R mysql:mysql /var/lib/mysqlget
單庫/表備份還原步驟:
建立備份
xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.]. * "
準備備份
$ xtrabackup --prepare --target-dir=/data/backups/
導出表結構
$ mysqldump -d ^test > test.sql
導入表結構
$ mysql test < test.sql
釋放表空間
# mysql -e "set foreign_key_checks=0;alter table test.* discard tablespace;"
複製文件到數據目錄
# cp -f /data/backups/*.cfg /data/backups/*.ibd /data/backups/*.frm /var/lib/mysql/test
修改屬主
# chown -R mysql:mysql /var/lib/mysql/test
導入表空間
# mysql -e "set foreign_key_checks=0;alter table test.* import tablespace;analyze table test.*;"
若是兩個實例都具備 GA(通用可用性)狀態而且它們的版本在同一個系列中,則從另外一個 MySQL 服務器實例導入表空間文件將起做用。 不然,該文件必須已在與其導入的服務器實例相同的服務器實例上建立。
如下是一個經過 xtrabackup 對單庫進行備份還原的腳本
#!/bin/bash # by geamover on 2017-12-26 # last updated on 2018-05-08 # This is for backup one DB to the orther DB on the same server by xtrabackup. BK_DIR=/data/backup/`date +%F`/$1 # 備份路徑 MT=$BK_DIR/$1.sql # 元數據 DT=/data/mysql/data/ # 數據目錄 SK=/tmp/mysql.sock # mysql.sock PW=123456 # mysql 密碼 if [ $# -ne 2 ]; then echo -e "\e[1;31mUsage:\e[0m $0 source_DB destination_DB" exit 1 fi mysql -u root -p"$PW" -e "use $1;" &> /dev/null if [ $? != 0 ]; then echo "There is no database $1, please check!" exit 1 fi echo "It will drop databae $2, are you sure continue?" echo -e "\e[1;31my\e[0m for continue, any orther for exit: " read input if [ $input == "y" ]; then echo "Go on!" else echo "Cancled!" exit fi if [ -d $BK_DIR ];then rm -rf $BK_DIR/* else mkdir -p $BK_DIR fi echo "From $1 to $2" | tee -a xtra.log echo `date "+%F %T"`" Backing up databae $1 to $BK_DIR" | tee -a xtra.log xtrabackup --backup -u root -p"$PW" --socket=$SK --databases="$1" --parallel=8 --target-dir=$BK_DIR &>> xtra.log JD=`tail -n 1 xtra.log | awk '{print $3$4}'` if [ $JD == "completedOK!" ]; then echo `date "+%F %T"`" Back up databae $1 to $BK_DIR completed OK!" else echo `date "+%F %T"`" Back up databae $1 to $BK_DIR failed!" exit 1 fi echo `date "+%F %T"`" Prepare the backup."| tee -a xtra.log xtrabackup --prepare --export --parallel=8 --target-dir=$BK_DIR &>> xtra.log JD=`tail -n 1 xtra.log | awk '{print $3$4}'` if [ $JD == "completedOK!" ]; then echo `date "+%F %T"`" Prepare up databae $1 to $BK_DIR completed OK!" else echo `date "+%F %T"`" Prepare up databae $1 to $BK_DIR failed!" exit 1 fi echo `date "+%F %T"`" Dump the metadata of $1 to $MT." # --set-gtid-purged=OFF 若是開啓 GTID 請指定該選項導出元數據 mysqldump -u root -p"$PW" -d $1 > $MT echo "Drop database $2 if exists.Then create it and import metadata." mysql -u root -p"$PW" -e "Drop database if exists $2;create database $2;use $2;source $MT;" &> /dev/null for i in $(grep "CREATE TABLE" $MT | awk '{print $3}' | sed "s#\`##g") do mysql -u root -p"$PW" -e "set foreign_key_checks=0;alter table $2.$i discard tablespace;" &> /dev/null cp -f $BK_DIR/$1/$i.cfg $BK_DIR/$1/$i.ibd $BK_DIR/$1/$i.frm $DT$2/ chown -R mysql:mysql $DT$2/ mysql -u root -p"$PW" -e "set foreign_key_checks=0;alter table $2.$i import tablespace;analyze table $2.$i;" &> /dev/null done echo `date "+%F %T"`" From $1 to $2 done." | tee -a xtra.log # delete the backup rm -rf $BK_DIR