INNOBACKUPEX的全備和增量備份恢復學習筆記
INNOBACKUPEX 的全備和增量備份恢復學習筆記
說到備份MySQL資料庫,不少人可能會先想到其自帶的命令列工具mysqldump,要說這個工具確實不錯,操作簡單呼叫靈活,不過mysqldump屬於邏輯備份工具,類似ORACLE資料庫中的export,小資料量時效率尚可,當資料量達到一定規模時,使用mysqldump執行備份的時間也許還可接受,但恢復時間基本就不能忍受了。
這種情況下就需要一種好用又高效的工具,xtrabackup就是其中一款,號稱免費版的InnoDB HotBackup。
Xtrabackup提供了兩種命令列工具:
?1)xtrabackup:專用於備份InnoDB引擎的資料;
?2)innobackupex:這是一個perl指令碼,在執行過程中會呼叫xtrabackup命令,這樣
用該命令即可以實現備份InnoDB,也可以備份MyISAM引擎的物件。
Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDBHotbackup的一個很好的替代品。
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁碟空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
xtrabackup軟體可以到免費下載。
關於對xtrabackup安裝方法,可以參見:http://blog.itpub.net/28916011/viewspace-1753483/
一、備份
1.1、建立全備份集
[root@drbd-01 backup]# innobackupex --defaults-file=/etc/my.cnf --host 10.72.16.116 --port=3306 --user=root --password=123 --socket=/tmp/mysql.scok /data/backup/full
執行完全備份後,可以對資料庫建幾張表,插入點資料,模擬資料庫完全備份後資料的增長,然後再執行增量備份。
1.2增量備份
1.2.1執行基於2015-07-28_12-10-45(全備)的增量備份
這時候可以在資料庫做點操作,模擬資料庫的資料有更新。
增量備份僅針對InnoDB這類支援事務的引擎,對於MyISAM等引擎,則仍然是全備了。
[root@drbd-01 backup]# innobackupex
--defaults-file=/etc/my.cnf -no-timestamp --incremental
--incremental-basedir=/data/backup/full/2015-07-28_12-10-45/ --user=root
--password=123 /data/backup/001
--incremental 說明是什麼備份 ,後面跟要增量備份的路徑
--incremental-basedir 指向上一次的增量備份所在的目錄
--no-timestamp innobackupex--defaults-file=/etc/my.cnf --user=root --no-timestamp /data/backup/001使用--no-timestamp時,後面的這個011目錄必須跟上且不能提前自己建立,它由innobackupex自動建立,否則會報innobackupex: Error: Failed to create backup directory/data/backup/001: File exists at /usr/bin/innobackupex line 3899.)
1.2.2 執行基於/data/backup/001進行增量備份
這時候可以再對資料庫做點操作,模擬資料又進行增長,然後再做第二次增量備份。
[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf -no-timestamp --incremental --incremental-basedir=/data/backup/001 /data/backup/002
1.3 檢視備份資訊
可以透過以下檔案檢視備份資訊。
[root@drbd-01 backup]# cat /data/backup/full/2015-07-28_12-10-45/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 3194902
last_lsn = 3194902
compact = 0
[root@drbd-01 backup]# cat /data/backup/001/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3194902
to_lsn = 3198776
last_lsn = 3198776
compact = 0
[root@drbd-01 backup]# cat /data/backup/002/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3198776
to_lsn = 3202726
last_lsn = 3202726
compact = 0
上面看到,可以透過lsn看到這3個備份集關係。
小知識:
也可以透過此命令來進行指定lsn的方式進行備份
[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf --no-timestamp --incremental --incremental-lsn=3198776 /data/backup/003
二 恢復
刪除原來的mysql資料目錄/data/mysql,建立新的資料庫目錄,用來模擬資料庫損壞。
[root@drbd-01 data]#rm –rf /data/mysql
[root@drbd-01 data]# cd /data/
[root@drbd-01 data]# mkdir mysql
[root@drbd-01 data]# chown mysql.mysql mysql
2.1 先Prepare完整備份集(應用日誌)
一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”即prepare的主要作用正是透過回滾未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態,innobakupex命令的--apply-log選項可用於實現上述功能。
[root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/
--apply-log 在資料庫備份好後,這些備份的資料並不能立即用於恢復,因為這些剛備份的資料裡包含了未提交的資料,需要回滾,oracle裡稱undo資料!也包括的已完成的事務在重做日誌檔案中並沒有寫入資料檔案中,這些資料需要重做!oracle裡稱redo! 這個引數正是用於做這些事情,以保證資料檔案的一致性!在資料庫恢復之前,須先對備份的資料檔案應用此引數!(innobackup會重現重做日誌檔案(redo log file)中的事務條目,重做已經提交的事務和回滾未提交的事務!)
--redo-only 該選項表示在應用完成redo日誌之後,針對未提交的事務不執行回滾操作,因為前一個沒有提交的事務有可能在下一個備份中提交了,否則後續的增量備份無法進行恢復了。該選項需要結合--apply-log選項一起使用用。 但是最後一個增量備份的資料檔案恢復時不要加--redo-only了。
2.2 Prepare增量備份集
2.2.1 合併第一個增量備份到完全備份裡面
[root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/001/
2.2.2 將最後一次增量備份應用日誌(不用--redo-only)並且合併到全備庫中
為什麼這次不用 —redo-only 了呢?這是因為除了最後的一個增量備份外,前面的事務都不應該進行回滾因為有可能前一個沒有提交的事物在下一個備份中提交了,如果進行了回滾則有可能導致資料不一致從而無法進行還原。
[root@drbd-01 data]# innobackupex --defaults-file=/etc/my.cnf --apply-log /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/002
2.3 執行恢復操作
[root@drbd-01 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2015-07-28_12-10-45/
上述恢復時,只指定完全恢復的目錄就行,因為前面已經做過把其他增量備份的資料合併到全備份目錄裡面了。
--copy-back 把備份資料複製回server的datadir,它決定於my.cnf中的datadir引數,另外在恢復時datadir目錄必須是空的,並且mysql資料庫必須是shudown的!
修改許可權及屬主:
chown -R mysql:mysql /data/mysql
2.4、恢復完成,接下來啟動mysql服務
servce mysql start
2.5 登入資料庫進行驗證資料是否恢復到最新資料狀態
2.6 附錄
2.6.1 增量備份指令碼
此指令碼出自:
http://blog.csdn.net/yangzhawen/article/details/30282993
#cat backup.sh
點選( 此處)摺疊或開啟
-
#
!
/bin
/sh
-
#
-
# 第一次執行它的時候它會檢查是否有完全備份
,否則先建立一個全庫備份
-
# 當你再次執行它的時候,它會根據指令碼中的設定來基於之前的全庫備份進行增量備份
-
#備份的日誌在$BACKUP_DIR目錄下,
-
#ocpyang@126
.com
-
-
INNOBACKUPEX_PATH
=innobackupex #INNOBACKUPEX的命令
-
INNOBACKUPEXFULL
=
/usr
/bin
/
$INNOBACKUPEX_PATH #INNOBACKUPEX的命令路徑
-
-
#mysql目標伺服器以及使用者名稱和密碼
-
MYSQL_CMD
=
"--host=10.72.16.116 --user=root --password=123 --port=3306"
-
-
MYSQL_UP
=
"--user=root --password=123 " #mysql的使用者名稱和密碼
-
-
TMPLOG
=
"/tmp/innobackupex.$$.log"
-
-
MY_CNF
=
/etc
/my
.cnf #mysql的配置檔案
-
-
MYSQL
=
/usr
/bin
/mysql
-
-
MYSQL_ADMIN
=
/usr
/bin
/mysqladmin
-
-
BACKUP_DIR
=
/backup # 備份的主目錄
-
-
FULLBACKUP_DIR
=
$BACKUP_DIR
/full # 全庫備份的目錄
-
-
INCRBACKUP_DIR
=
$BACKUP_DIR
/incre # 增量備份的目錄
-
-
FULLBACKUP_INTERVAL
=604800 # 全庫備份的間隔週期,時間:秒,604800是間隔7天
-
-
KEEP_FULLBACKUP
=1 # 至少保留幾個全庫備份
-
-
logfiledate
=backup
.
`date
+
%Y%m%d%
H
%M`
.txt
-
LOG_DIR
=
/backup
/log
-
-
#開始時間
-
STARTED_TIME
=
`date
+
%
s
`
-
#date
+
%s從 1970 年 1 月 1 日 00
:00
:00 UTC 到目前為止的秒數
-
-
-
#############################################################################
-
-
# 顯示錯誤並退出
-
-
#############################################################################
-
-
error
(
)
-
{
-
echo
"$1" 1
>
&2
-
exit 1
-
}
-
-
-
-
# 檢查執行環境
-
-
if
[
!
-x $INNOBACKUPEXFULL
]
; then
-
error
"$INNOBACKUPEXFULL未安裝或未連結到/usr/bin."
-
fi
-
#
-x 測試是否有執行許可權
-
-
-
if
[
!
-d $BACKUP_DIR
]
; then
-
error
"備份目標資料夾:$BACKUP_DIR不存在."
-
fi
-
-
-
-
if
[
-z
"`$MYSQL_ADMIN $MYSQL_UP status | grep 'Uptime'`"
]
; then
-
error
"MySQL 沒有啟動執行."
-
fi
-
-
#
-z 空字串
-
-
-
-
if
! `echo
'exit'
| $MYSQL
-
s $MYSQL_CMD`
; then
-
error
"提供的資料庫使用者名稱或密碼不正確!"
-
fi
-
-
#mysql
-
s
,
-
-silent
/
/一行一行輸出,中間用tab分隔
-
-
-
# 備份的頭部資訊
-
-
echo
"----------------------------"
-
echo
-
echo
"$0: MySQL備份指令碼"
-
echo
"開始於: `date +%F' '%T' '%w`"
-
echo
-
#上面的$0 表示當前執行的程式名或是當前執行的指令碼名
-
-
-
#新建全備和差異備份的目錄
-
-
mkdir
-
p $FULLBACKUP_DIR
-
mkdir
-
p $INCRBACKUP_DIR
-
mkdir
-
p $LOG_DIR
-
-
-
#查詢最新的完全備份
-
LATEST_FULL_BACKUP
=
`find $FULLBACKUP_DIR
-mindepth 1
-maxdepth 1
-
type d
-printf
"%P\n"
| sort
-nr
|
head
-1`
-
-
#
-mindepthd 1
,表示從$FULLBACKUP_DIR目錄的第0層開始查;
-maxdepth 1,表示列出$FULLBACKUP_DIR內的檔案時深度最多為0層
-
-
-
# 查詢最近修改的最新備份
-
-
LATEST_FULL_BACKUP_CREATED_TIME
=
`stat
-c %Y $FULLBACKUP_DIR
/
$LATEST_FULL_BACKUP`
-
#stat
-c %Y 獲取檔案的修改時間
-
-
#如果全備有效進行增量備份否則執行完全備份
-
if
[
"$LATEST_FULL_BACKUP"
-
a `expr $LATEST_FULL_BACKUP_CREATED_TIME
+ $FULLBACKUP_INTERVAL
+ 5`
-ge $STARTED_TIME
]
; then
-
# 如果最新的全備未過期則以最新的全備檔名命名在增量備份目錄下新建目錄
-
echo
-e
"完全備份$LATEST_FULL_BACKUP未過期,將根據$LATEST_FULL_BACKUP名字作為增量備份目錄命名"
-
echo
" "
-
NEW_INCRDIR
=
$INCRBACKUP_DIR
/
$LATEST_FULL_BACKUP
-
mkdir
-
p $NEW_INCRDIR
-
-
-
-
# 查詢最新的增量備份是否存在
.指定一個備份的路徑作為增量備份的基礎
-
LATEST_INCR_BACKUP
=
`find $NEW_INCRDIR
-mindepth 1
-maxdepth 1
-
type d
| sort
-nr
|
head
-1`
-
-
if
[
! $LATEST_INCR_BACKUP
]
; then
-
INCRBASEDIR
=
$FULLBACKUP_DIR
/
$LATEST_FULL_BACKUP
-
echo
-e
"增量備份將以$INCRBASEDIR作為備份基礎"
-
echo
" "
-
else
-
INCRBASEDIR
=
$LATEST_INCR_BACKUP
-
echo
-e
"增量備份將以$INCRBASEDIR作為備份基礎"
-
echo
" "
-
fi
-
-
-
-
echo
"使用$INCRBASEDIR作為基礎做新的增量備份."
-
$INNOBACKUPEXFULL
-
-defaults
-
file
=
$MY_CNF
-
-use
-memory
=4G $MYSQL_CMD
-
-incremental $NEW_INCRDIR
-
-incremental
-basedir $INCRBASEDIR
> $TMPLOG 2
>
&1
-
else
-
echo
"*********************************"
-
echo
-e
"正在執行全新的完全備份...請稍等..."
-
echo
"*********************************"
-
#$INNOBACKUPEXFULL
-
-defaults
-
file
=
$MY_CNF
-
-use
-memory
=4G $MYSQL_CMD $FULLBACKUP_DIR
> $TMPLOG 2
>
&1
-
$INNOBACKUPEXFULL
-
-defaults
-
file
=
$MY_CNF
-
-use
-memory
=4G
-
-
rsync
-
-
compress
-
-
compress
-
threads
=
5
-
-
compress
-
chunk
-
size
=64K
-
-slave
-
info $MYSQL_CMD $FULLBACKUP_DIR
> $TMPLOG 2
>
&1
-
#上面黃色是czxin加的,為了壓縮備份
-
fi
-
#
-
-use
-memory該引數在 prepare 的時候使用,控制 prepare 時 innodb 例項使用的記憶體量
-
-
#保留一份備份的詳細日誌
-
-
cat $TMPLOG
> $LOG_DIR
/
$logfiledate
-
-
-
-
if
[
-z
"`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`"
]
; then
-
echo
"$INNOBACKUPEX命令執行失敗:"
; echo
-
echo
-e
"---------- $INNOBACKUPEX_PATH錯誤 ----------"
-
cat $TMPLOG
-
rm
-f $TMPLOG
-
exit 1
-
fi
-
-
-
-
THISBACKUP
=
`awk
-
-
"/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
-
rm
-f $TMPLOG
-
-
-
-
echo
-n
"資料庫成功備份到:$THISBACKUP"
-
echo
-
-
-
-
# 提示應該保留的備份檔案起點
-
LATEST_FULL_BACKUP
=
`find $FULLBACKUP_DIR
-mindepth 1
-maxdepth 1
-
type d
-printf
"%P\n"
| sort
-nr
|
head
-1`
-
echo
-e
"必須保留$KEEP_FULLBACKUP份全備和全備$LATEST_FULL_BACKUP以後的所有增量備份."
-
-
-
#刪除過期的全備
-
#echo
-e
"尋找過期的全備檔案並刪除"
>
> $LOG_DIR
/
$logfiledate
-
for efile in $
(
/usr
/bin
/find $FULLBACKUP_DIR
/
-mindepth 1
-maxdepth 1
-mtime
+8
)
-
do
-
if
[
-d $efile
]
; then
-
/bin
/rm rm
-rf $efile
-
echo
-e
"刪除過期全備目錄:$efile"
>
> $LOG_DIR
/
$logfiledate
-
# elif
[
-f $efile
]
; then
-
#
/bin
/rm rm
-rf $
file
-
# echo
-e
"刪除過期全備檔案:$efile"
>
> $LOG_DIR
/
$logfiledate
-
fi
;
-
-
done
-
-
if
[ $
?
-ne
"0"
]
;then
-
echo
-
echo
-e
"未找到可以刪除的過期全備檔案"
>
> $LOG_DIR
/
$logfiledate
-
fi
-
-
#刪除過期增量備份
-
#echo
-e
"尋找過期的增量備份目錄並刪除"
>
> $LOG_DIR
/
$logfiledate
-
for efile in $
(
/usr
/bin
/find $INCRBACKUP_DIR
/
-mindepth 1
-maxdepth 1
-mtime
+8
)
-
do
-
if
[
-d $efile
]
; then
-
/bin
/rm
-rf $efile
-
echo
-e
"刪除過期增量備份目錄:$efile"
>
> $LOG_DIR
/
$logfiledate
-
-
fi
;
-
-
done
-
-
if
[ $
?
-ne
"0"
]
;then
-
echo
-
echo
-e
"未找到可以刪除的過期增量備份檔案"
>
> $LOG_DIR
/
$logfiledate
-
fi
-
-
-
echo
-
echo
"完成於: `date +%F' '%T' '%w`"
- exit 0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-1754640/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql之 Innobackupex(全備+增量)備份恢復MySql
- 【MySql】innobackupex增量備份和恢復MySql
- 【MySql】innobackupex 增量備份和恢復MySql
- mysql innobackupex增量備份恢復MySql
- Percona XtraBackup 2.4 innobackupex全量、增量備份恢復流程
- 使用innobackupex線上增量備份和再增量備份及恢復mysql資料庫MySql資料庫
- MySQL innobackupex全量備份恢復MySql
- 【Xtrabackup】Xtrabackup全備、增量備份及恢復示例
- MySQL 5.6 xtrabackup 全量和增量的備份和恢復MySql
- innobackupex備份恢復實戰
- 【Mysql】xbackup全量與增量備份恢復MySql
- 【MySql】innobackupex 增量備份的bugMySql
- Percona XtraBackup 實現全備&增量備份與恢復
- innobackupex備份mysql大資料(全量+增量)操作記錄MySql大資料
- mysql學習筆記之備份與恢復MySql筆記
- rman資料備份恢復學習筆記筆記
- Mysql備份系列(3)--innobackupex備份mysql大資料(全量+增量)操作記錄MySql大資料
- MySQL增量備份的指令碼(innobackupex)MySql指令碼
- CUUG筆記--oracle備份和恢復筆記Oracle
- 利用innobackupex備份集恢復指定庫
- xtrabackup和innobackuppex的安裝和備份(含增量備份)已經恢復
- 【備份恢復】noarchive模式下使用增量備份恢復資料庫Hive模式資料庫
- oracle 增量備份恢復驗證Oracle
- oracle實驗記錄 (恢復-rman增量備份)Oracle
- innobackupex全備份流程圖流程圖
- 轉:DB2離線和線上全備、增量備份及恢復的操作步驟DB2
- Xtrabackup之innobackupex備份恢復詳解薦
- Percona XtraBackup 2.4 xtrabackup全量、增量備份恢復流程
- influxdb 筆記: 備份/恢復UX筆記
- Mysql 企業級備份與恢復(學習筆記七)MySql筆記
- mysql 利用binlog增量備份、恢復MySql
- MySQL增量備份與恢復例項MySql
- 備份和恢復
- Backup And Recovery User's Guide-備份和恢復概覽-備份和恢復介紹-備份和恢復的目的GUIIDE
- windwos server 路由備份和恢復 路由表備份和恢復Server路由
- mysqldump 全量和增量備份指令碼MySql指令碼
- Oracle的差異增量備份和累積增量備份Oracle
- redis 備份和恢復Redis