title: 1.percona-xtrabackup備份mysql
date: 2016-04-10 23:19:12
tags: mysql
categories: mysql
一、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,查看變量
(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)
對應的目錄是存在,確定相關目錄存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。
=================================================================================
環境:
centos6.6
數據庫:mysql5.5.16
xtrabackup:v1.5.1
=================================================================================
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)完整備份的恢復
-
首先需要備份數據庫
-
停止數據庫運行
-
刪除數據庫目錄內所有文件
-
然后執行下列命令進行恢復
-
恢復第一步:應用日志。
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)多次增量備份之后的恢復
1、首先需要備份現有數據庫
2、停止數據庫運行
3、刪除數據庫目錄內所有文件
4、然后執行下列命令進行恢復
先恢復第一次全備的數據庫的應用日志
命令:
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、
可能出現的報錯:
1、出現下面錯誤,
# ./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=/你的數據存放目錄
2、權限:應該恢復使用的是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]
3、連接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