percona-xtrabackup備份mysql


title: 1.percona-xtrabackup備份mysql
date: 2016-04-10 23:19:12
tags: mysql
categories: mysql
---mysql

1、percona-xtrabackup

它是開源免費的支持MySQL 數據庫熱備份的軟件,它能對InnoDB和XtraDB存儲引擎的數據庫非阻塞地備份。它不暫停服務建立Innodb熱備份;
爲mysql作增量備份;在mysql服務器之間作在線表遷移;使建立replication更加容易;備份mysql而不增長服務器的負載。
percona是一家老牌的mysql技術諮詢公司。它不只提供mysql的技術支持、培訓、諮詢,還發布了mysql的分支版本--percona Server。並圍繞
percona Server還發布了一系統的mysql工具。
innobackupex比xtarbackup有更強的功能,它整合了xtrabackup和其餘的一些功能,他不但能夠全量備份/恢復,還能夠基於時間的增量備份與恢復。
innobackupex備份原理
innobackupex首先調用xtrabackup來備份innodb數據文件,當xtrabackup完成後,innobackupex就查看文件 xtrabackup_suspended ;而後執行「FLUSH TABLES WITH READ LOCK」來備份其餘的文件
innobackupex恢復原理
innobackupex首先讀取my.cnf,查看變量sql

(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)
對應的目錄是存在,肯定相關目錄存在後,而後先copy myisam表和索引,而後在copy innodb的表、索引和日誌。數據庫

=================================================================================centos

環境:bash

centos6.6服務器

數據庫:mysql5.5.16app

xtrabackup:v1.5.1socket

=================================================================================函數

1)完整備份工具

命令:innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE BACK_DIR_PATH


1. # PASSWORD 數據庫密碼
2. # DATE 數據庫名
3. # --database=DATE 針對全部庫作備份去掉該選項便可
4. # BACK_DIR_PATH 徹底備份目錄位置
5. 注:該命令執行後會在備份目錄位置以當前時間爲命名生成一個目錄,備份的文件會備份到該目錄中。例如2014-12-06_16-00-15
6. #--port=端口號
7. #--no-timestamp 此參數能夠取消自動時間戳

2)完整備份的恢復

  1. 首先須要備份數據庫
  2. 中止數據庫運行
  3. 刪除數據庫目錄內全部文件
  4. 而後執行下列命令進行恢復
  5. 恢復第一步:應用日誌。

    innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --apply-log BACK_DIR_PATH/你的全備數據庫文件名
    參數:
    # PASSWORD 數據庫密碼
    # DATE 數據庫名
    # BACK_DIR_PATH 徹底備份目錄位置
    #恢復第二步:拷貝文件。

    innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --copy-back /BACK_DIR_PATH

註釋一下,經常使用的參數。

--defaults-file=/etc/my.cnf     恢復會使用my.cnf文件把須要恢復的文件,恢復到my.cnf指定的位置。
--apply-log            這是備份時產生的日誌,
--copy-back            這是備份源,解壓後的備份文件。
--database=DATE        若是不加此參數,默認恢復所有數據庫

提示:若是重啓服務報錯。文章結尾有解決辦法。

3)增量備份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --incremental-basedir=BACK_DIR_PATH/全備數據庫的文件名 --incremental BACK_DIR_ZENG_1

2. # PASSWORD 數據庫密碼
3. # DATE 數據庫名
4. # BACK_DIR_PATH 徹底備份目錄位置
5. # BACK_DIR_ZENG_1 第一次增量備份目錄位置
6. # --incremental-basedir 該選項後面寫的爲第一次完整備份的路徑
7. 注:這次增量備份是在第一次完整備份的基礎之上進行的增量備份

4)第二次增量備份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --incremental-basedir=BACK_DIR_ZENG_1 --incremental BACK_DIR_ZENG_2
2. # PASSWORD 數據庫密碼
3. # DATE 數據庫名
4. # BACK_DIR_PATH 徹底備份目錄位置
5. # BACK_DIR_ZENG_1 第一次增量備份目錄位置
6. # BACK_DIR_ZENG_2 第二次增量備份目錄位置
7. # --incremental-basedir 該選項後面寫的爲第一次增量備份的路徑
8. 注:這次增量備份是在第一次增量備份的基礎之上進行的第二次增量備份

5)屢次增量備份以後的恢復

一、首先須要備份現有數據庫
二、中止數據庫運行
三、刪除數據庫目錄內全部文件
四、而後執行下列命令進行恢復
先恢復第一次全備的數據庫的應用日誌
命令:
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密碼' --apply-log --redo-only BACK_DIR_PATH

恢復第一次增量備份的數據庫應用日誌
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密碼' --apply-log --redo-only BACK_DIR_PATH --incremental-dir=BACK_DIR_ZENG_1 
恢復第二次增量備份的數據庫應用日誌
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密碼' --apply-log BACK_DIR_PATH --incremental-dir=BACK_DIR_ZENG_2

1. # BACK_DIR_PATH 徹底備份目錄位置
2. # BACK_DIR_ZENG_1 第一次增量備份目錄位置
3. # BACK_DIR_ZENG_2 第二次增量備份目錄位置
4. 注: 若是隻有2次增量備份則執行此條命令,若是有屢次增量命令,則參照上一條命令
5. 最後一次恢復的時候不須要加--redo-only這個參數。

=================================================================================

恢復第三步:
修改文件權限。
cd 到data目錄
chown -R mysql.mysql data、
可能出現的報錯:
一、出現下面錯誤,
# ./mysql.server start
Starting MySQL...The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED] 
初始化一下mysql
# ./mysql_install_db --basedir=/你的mysql 目錄 --no-defaults --skip-name-resolve --user=mysql --datadir=/你的數據存放目錄

二、權限:應該恢復使用的是root用戶,可是MySQL須要MySQL用戶去訪問。
# ./mysql.server restart
MySQL server PID file could not be found![FAILED]
Starting MySQL.The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]

三、鏈接MySQL的時候
#./mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
沒有這個文件,touch  mysql.sock 並修改文件權限。

恢復備份文件要保證datadir文件爲空,不然會報以下的錯誤
# innobackupex --user=root   /data/backup/
IMPORTANT: Please check that the copy-back run completes successfully.
       At the end of a successful copy-back run innobackupex
       prints "completed OK!".
Original data directory is not empty! at /usr/bin/innobackupex line 568.

=================================================================================

實例腳本:

腳本是每週天整備,週一到週六增倍

自動判斷是否存在昨天和今天的數據來進行全備或者增倍

#!/bin/bash
export PATH=$PATH:/usr/local/xtrabackup/bin
HOST=127.0.0.1
DATE=`date  +"%Y-%m-%d-%A"`
LASTDATE=`date  +"%Y-%m-%d-%A" -d  "-1 days"`
DATEDAY=`date +%A`
WEEKDAY='Sunday'
BACKUP_DIR_PATH=/要備份的目錄
FILE_CNF=/usr/local/mysql55/conf/配置文件
USER_NAME=用戶名
PASSWORD="密碼"
MYPORT=端口號
#全備備份函數
cd $BACKUP_DIR_PATH
all_bak () {
echo "start $DATE-all" >> $BACKUP_DIR_PATH/access.log
innobackupex --defaults-file=$FILE_CNF --user=$USER_NAME --password=$PASSWORD --port=MYPORT --host=$HOST --no-timestamp $BACKUP_DIR_PATH/$DATE-all
if [ $? -eq 0 ];then
   echo "$DATE-all is succeed" >> $BACKUP_DIR_PATH/access.log
   tar -zcvf $BACKUP_DIR_PATH/$DATE-all.tar.gz $DATE-all
   if [ $? -eq 0 ];then
       echo "$DATE-all is packaging succeed" >> $BACKUP_DIR_PATH/access.log
#       rm -rf $DATE-all
   else
   echo "$DATE-all is packaging failure" >> $BACKUP_DIR_PATH/access.log
   fi
else
   echo "$DATE-all is failure" >> $BACKUP_DIR_PATH/access.log
fi
echo "stop $DATE-all" >> $BACKUP_DIR_PATH/access.log
}
#增量備份函數
incremental(){
echo "start $DATE-incremental" $BACKUP_DIR_PATH/access.log  
innobackupex --defaults-file=$FILE_CNF --user=$USER_NAME --password=$PASSWORD --port=MYPORT  --host=$HOST --incremental-basedir=$BACKUP_DIR_PATH/$LASTDATE-$1 --no-timestamp --incremental $BACKUP_DIR_PATH/$DATE-incremental 
if [ $? -eq 0 ];then
   echo "$DATE-incremental is succeed" >> $BACKUP_DIR_PATH/access.log
   tar -zcvf $BACKUP_DIR_PATH/$DATE-incremental.tar.gz $DATE-incremental
   if [ $? -eq 0 ];then
       echo "$DATE-incremental is packaging succeed" >> $BACKUP_DIR_PATH/access.log
#      rm -rf $DATE-incremental
   else
       echo "$DATE-ncremental  is packaging failure" >> $BACKUP_DIR_PATH/access.log
   fi
else
   echo "$DATE-incremental is failure" >> $BACKUP_DIR_PATH/access.log
fi
echo "stop $DATE-incremental" >> $BACKUP_DIR_PATH/access.log
}
#判斷數據庫備份存放目錄,不存在建立
if [ ! -d $BACKUP_DIR_PATH ];then
    mkdir $BACKUP_DIR_PATH
fi
#判斷若是今天是周天,那麼全備,不然增備
if [ $DATEDAY = $WEEKDAY ];then
    if [ ! -d "$BACKUP_DIR_PATH/$DATE-all" ];then
    all_bak
    fi
else
    #判斷昨天的數據是否存在
    if [ ! -d "$BACKUP_DIR_PATH/$LASTDATE-all" ];then
    if [ ! -d "$BACKUP_DIR_PATH/$LASTDATE-incremental" ];then
        if [ ! -d "$BACKUP_DIR_PATH/$DATE-all" ];then
            if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
            all_bak
        fi
        fi
    else
        if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
            incremental incremental
        fi
    fi
    else
    #若是昨天是全備,今天增量不存在,那麼進行增量備份
    if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
        incremental all
    fi
fi
fi
相關文章
相關標籤/搜索