它是開源免費的支持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,查看變量mysql
(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)
對應的目錄是存在,肯定相關目錄存在後,而後先copy myisam表和索引,而後在copy innodb的表、索引和日誌。sql
=========================================================================數據庫
環境:centos
centos6.6bash
數據庫:mysql5.5.16服務器
xtrabackup:v1.5.1markdown
=========================================================================app
1)完整備份socket
命令: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)屢次增量備份以後的恢復
一、首先須要備份現有數據庫 二、中止數據庫運行 三、刪除數據庫目錄內全部文件 四、而後執行下列命令進行恢復 先恢復第一次全備的數據庫的應用日誌 命令: 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 ];