mysql備份工具innobackupex,xtrabackup-2.1安裝與測試
1、Xtrabackup介紹
1.1:Xtrabackup是什麼
Xtrabackup是一個對InnoDB作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表
2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是爲了方便的 同時備份InnoDB和MyISAM引擎的表,但在處理myisam時須要加一個讀鎖。而且加入了一些使用的選項。如slave-info能夠記錄備份恢 復後,做爲slave須要的一些信息,根據這些信息,能夠很方便的利用備份來重作slave。
1.2:Xtrabackup能夠作什麼 :
在線(熱)備份整個庫的InnoDB、 XtraDB表
在xtrabackup的上一次整庫備份基礎上作增量備份(innodb only)
以流的形式產生備份,能夠直接保存到遠程機器上(本機硬盤空間不足時頗有用)
MySQL數據庫自己提供的工具並不支持真正的增量備份,二進制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。
Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工做原理以下:
(1)首先完成一個徹底備份,並記錄下此時檢查點的LSN(Log Sequence Number)。
(2)在進程增量備份時,比較表空間中每一個頁的LSN是否大於上次備份時的LSN,若是是,則備份該頁,同時記錄當前檢查點的LSN。
首先,在logfile中找到並記錄最後一個checkpoint(「last checkpoint LSN」),而後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接着,開始拷貝所有的數據文件.ibd;在拷貝所有數據文件結束以後,才中止拷貝logfile。
由於logfile裏面記錄所有的數據修改狀況,因此,即時在備份過程當中數據文件被修改過了,恢復時仍然可以經過解析xtrabackup_logfile保持數據的一致。
1.3:Xtrabackup備份原理
XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。 :
InnoDB維護了一個redo log,又稱爲transaction log,事務日誌,它包含了innodb數據的全部改動狀況。當InnoDB啓動的時候,它會先去檢查data file和transaction log,而且會作二步操做:
XtraBackup在備份的時候, 一頁一頁地複製innodb的數據,並且不鎖定表,與此同時,XtraBackup還有另一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複製走。爲何要急着複製走呢?由於transactions log文件大小有限,寫滿以後,就會從頭再開始寫,因此新數據可能會覆蓋到舊的數據。
在prepare過程當中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。
1.4:實現細節
XtraBackup以read-write模式打開innodb的數據文件,而後對其進行復制。其實它不會修改此文件。也就是說,運行 XtraBackup的用戶,必須對innodb的數據文件具備讀寫權限。之因此採用read-write模式是由於XtraBackup採用了其內置的 innodb庫來打開文件,而innodb庫打開文件的時候就是rw的。
XtraBackup要從文件系統中複製大量的數據,因此它儘量地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據,從 而提高性能。由於這些數據不會重用到了,OS卻沒有這麼聰明。若是要緩存一下的話,幾個G的數據,會對OS的虛擬內存形成很大的壓力,其它進程,好比 mysqld頗有可能被swap出去,這樣系統就會受到很大影響了。
在備份innodb page的過程當中,XtraBackup每次讀寫1MB的數據,1MB/16KB=64個page。這個不可配置。讀1MB數據之 後,XtraBackup一頁一頁地遍歷這1MB數據,使用innodb的buf_page_is_corrupted()函數檢查此頁的數據是否正常,若是數據不正常,就從新讀取這一頁,最多從新讀取10次,若是仍是失敗,備份就失敗了,退出。在複製transactions log的時候,每次讀寫512KB的數據。一樣不能夠配置。
2、xtrabackup-2.1.2-611安裝
本文經過源碼方式安裝xtrabackup-2.1.2-611
xtrabackup-2.1.2-611下載連接:
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.2/binary/Linux/x86_64/percona-xtrabackup-2.1.2-611.tar.gz
其它各版本下載清單:
http://www.percona.com/downloads/XtraBackup/
2.1:安裝編譯所需的依賴包
yum install libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* package -y
安裝步驟以下:
1.解壓軟件包鍵入命令文件目錄
tar xvf percona-xtrabackup-2.1.2-611.tar.gz
cd /workspace/percona-xtrabackup-2.1.2/bin/
2.查看文件
ll
-rwxr-xr-x 1 root root 110729 May 18 08:00 innobackupex
lrwxrwxrwx 1 root root 12 Jun 3 21:11 innobackupex-1.5.1 -> innobackupex
-rwxr-xr-x 1 root root 2211237 May 18 08:00 xbcrypt
-rwxr-xr-x 1 root root 2285672 May 18 08:00 xbstream
-rwxr-xr-x 1 root root 13033745 May 18 08:00 xtrabackup
-rwxr-xr-x 1 root root 16333506 May 18 07:26 xtrabackup_55
-rwxr-xr-x 1 root root 80988093 May 18 07:44 xtrabackup_56
3.將innobackupex、xtrabackup等文件copy到mysql程序目錄下/bin、目錄
cp * /mysql/bin/
4.將mysql安裝目錄下的文件作軟連接到/usr/bin/目錄下。這個比變量方便,這樣就完成了部署安裝!!!!!!!!!!!
ln -s /mysql/bin/* /usr/bin/
5.驗證:
執行以下命令按 tab 鍵可以自動關聯補全爲安裝成功!
[root@slave1 ~]# innobackupex
innobackupex innobackupex-1.5.1
[root@slave1 ~]# xtrabackup
xtrabackup xtrabackup_55 xtrabackup_56
三.innobackupex使用參數介紹
因爲innobackupex能同時備份InnoDB和MyISAM引擎的表,這裏重點介紹innobackupex的備份與恢復使用
一般通常都直接使用innobackupex,由於它能同時備份InnoDB和MyISAM引擎的表。要注意的是my.cnf裏datadir這個參數是必需要指定的,xtrabackup_55是根據它去定位innodb數據文件的位置。
3.1.innobackupex語法及參數說明
innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD]
[--port=PORT] [--socket=SOCKET] [--no-timest a mp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]
[--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR
innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR
innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR
各參數說明:
--defaults-file
同xtrabackup的--defaults-file參數
--apply-log
對xtrabackup的--prepare參數的封裝
--copy-back
作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir ;
--remote-host=HOSTNAME
經過ssh將備份數據存儲到進程服務器上;
--stream=[tar]
備份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中得到.若是備份時有指定--stream=tar, 則tar4ibd文件所處目錄必定要在$PATH中(由於使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可得到該文件)。
在使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,若是你備份的時候併發寫入較大的話xtrabackup_logfile可能會很大(5G+),極可能會撐滿你的/tmp目錄,能夠經過參數--tmpdir指定目錄來解決這個問題。
--tmpdir=DIRECTORY
當有指定--remote-host or --stream時, 事務日誌臨時存儲的目錄, 默認採用MySQL配置文件中所指定的臨時目錄tmpdir
--redo-only --apply-log組,
強制備份日誌時只redo ,跳過rollback。這在作增量備份時很是必要。
--use-memory=#
該參數在prepare的時候使用,控制prepare時innodb實例使用的內存量
--throttle=IOS
同xtrabackup的--throttle參數
--sleep=是給ibbackup使用的,指定每備份1M數據,過程中止拷貝多少毫秒,也是爲了在備份時儘可能減少對正常業務的影響,具體能夠查看ibbackup的手冊 ;
--compress[=LEVEL]
對備份數據迚行壓縮,僅支持ibbackup,xtrabackup尚未實現;
--include=REGEXP
對xtrabackup參數--tables的封裝,也支持ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份test庫中全部的表。若是須要全備份,則省略這個參數;若是須要備份test庫下的2個表:test1和test2,則寫成:--include="test.test1|test.test2"。也可使用通配符,如:--include="test.test*"。
--databases=LIST
列出須要備份的databases,若是沒有指定該參數,全部包含MyISAM和InnoDB表的database都會被備份;
--uncompress
解壓備份的數據文件,支持ibbackup,xtrabackup尚未實現該功能;
--slave-info,
備份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這裏會保存主日誌文件以及偏移, 文件內容相似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便備份進程登陸mysql.
四、備份並打包壓縮
innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --database=zztx --stream=tar /data/back_data/ 2>/data/back_data/zztx.log | gzip 1>/data/back_data/zztx.tar.gz
說明:
--database=zztx 單獨對zztx數據庫作備份 ,如果不添加此參數那就那就是對全庫作備份
2>/data/back_data/zztx.log 輸出信息寫入日誌中
1>/data/back_data/zztx.tar.gz 打包壓縮存儲到該文件中
此處能夠寫個腳本作備份(backup.sh)
#!/bin/sh
echo "開始備份..."`date`
log=test01_`date +%y%m%d%H%M`.log
str=test01_`date +%y%m%d%H%M`.tar.gz
innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --stream=tar /data/back_data/ 2>/data/back_data/$log | gzip 1>/data/back_data/$str
echo "備份完畢..."`date`
五、恢復數據
1) 先中止數據庫:service mysqld stop
2) 解壓 tar -izxvf zztx.tar.gz -C /data/back_data/db/ (沒有db ,須要mkdir /data/back_data/db/)
3) 恢復 innobackupex --user=root --password --defaults-file=/etc/my.cnf --apply-log /data/back_data/db/ (--apply-log選項的命令是準備在一個備份上啓動mysql服務)
innobackupex --user=root --password --defaults-file=/etc/my.cnf --copy-back /data/back_data/db/ (--copy-back 選項的命令從備份目錄拷貝數據,索引,日誌到my.cnf文 件裏規定的初始位置。)
4) 賦權 chown -R mysql.mysql /var/lib/mysql/*
5) 重啓數據庫 service mysqld restart
6) 刪除垃圾 cd /var/lib/mysql/ && rm xtrabackup*
進入數據庫查看,一切OK~
歡迎關注本站公眾號,獲取更多信息