閱讀342 返回首頁    go 阿裏雲 go 技術社區[雲棲]


xtrabackup 用法【備忘】

優點

快速進行完整,可靠的備份
在備份過程中不中斷進行中的事務
節省備份空間及網絡帶寬
支持自動備份機製,備份後自動完成校驗
快速恢複
支持Percona Server, MySQL MariaDB, Drizzle 版本的熱備份,流備份,壓縮備份及增量備份機製
支持InnoDB, XtraDB, HailDB 存儲引擎的無堵塞(在線)備份機製
對於 MyISAM, Merge Archive, 分區表,觸發器,備份過程中需對引擎執行隻讀鎖定
可在兩個服務器之間在線遷移表
支持壓縮的流備份到另外一台服務器上
輕鬆建立 MySQL AB 複製

 

下載地址
https://www.percona.com/software/percona-xtrabackup

 

編譯方法

tar xf percona-xtrabackup-2.1.6.tar.gz
cd  percona-xtrabackup-2.1.6

參考
  ================== =========  =============================================
  Value              Alias      Server
  ================== =========  =============================================
  innodb51           plugin build against InnoDB plugin in MySQL 5.1
  innodb55           5.5  build against InnoDB in MySQL 5.5
  xtradb51           xtradb     build against Percona Server with XtraDB 5.1
  xtradb55           xtradb55   build against Percona Server with XtraDB 5.5
  innodb56           5.6        build against InnoDB in MySQL 5.6
  ================== =========  =============================================

根據你當前的數據庫版本進行編譯,如,當前使用 innodb 5.5 版本, 則編譯如下

 AUTO_DOWNLOAD="yes" ./utils/build.sh innodb55

 

獲得當前數據庫版本方法
如, xtradb55 返回結果如下

select PLUGIN_DESCRIPTION, PLUGIN_VERSION from information_schema.plugins where plugin_name = 'Innodb';
+----------------------------------------------------------------------------+----------------+
| PLUGIN_DESCRIPTION                                                         | PLUGIN_VERSION |
+----------------------------------------------------------------------------+----------------+
| Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | 5.5            |
+----------------------------------------------------------------------------+----------------+
1 row in set (0.00 sec)


 

如innodb55 返回結果如下

select PLUGIN_DESCRIPTION, PLUGIN_VERSION from information_schema.plugins where plugin_name = 'Innodb';
+------------------------------------------------------------+----------------+
| PLUGIN_DESCRIPTION                                         | PLUGIN_VERSION |
+------------------------------------------------------------+----------------+
| Supports transactions, row-level locking, and foreign keys | 5.5            |
+------------------------------------------------------------+----------------+
1 row in set (0.00 sec)


 

當前編譯版本

AUTO_DOWNLOAD="yes" ./utils/build.sh xtradb55

 

編譯成功,會生成  innobackupex 及 xtrabackup_55 二進製文件, 複製文件至 /usr/local/bin 下

[root@db2 percona-xtrabackup-2.1.6]# cp innobackupex /usr/local/bin/.
[root@db2 percona-xtrabackup-2.1.6]# cp src/xtrabackup_55  /usr/local/bin/.

 

注: innobackup 文件是 perl 腳本,可看做是調用 xtrabackup 的工具
    xtrabackup 是又 C 編譯出來的二進製文件

 

常見編譯錯誤

/usr/bin/ld: cannot find -laio
collect2: ld 返回 1
gmake: *** [xbstream] 錯誤 1
gmake: *** 正在等待未完成的任務....
xtrabackup.cc: In function ‘my_bool x

 

解決方法

yum install -y  libaio libaio-devel 



 

權限

備份過程中係統用戶需要對存放備份數據的係統文件目錄具備讀寫執行權限

而對數據庫進行備份時候,建議具備下麵的權限能力
RELOAD, LOCK TABLES (除非指定 --no-lock 參數) 以便具備 flush tables with read lock 能力
REPLICATION CLIENT 具備獲得二進製日誌文件備份能力
CREATE TABLESPACE 具備恢複整個表空間,並導入表的能力
SUPER 用於啟動/關閉從服務器複製線程環境

 

全庫完整備份方法

innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket /backup


備份過程中可以看到 innobackupex 調用了 xtrabackup 工具

131223 14:09:34  innobackupex: Starting ibbackup with command: xtrabackup_55  --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/backup/2013-12-23_14-09-34 --tmpdir=/tmp
innobackupex: Waiting for ibbackup (pid=13829) to suspend
innobackupex: Suspend file '/backup/2013-12-23_14-09-34/xtrabackup_suspended_2'


備份過程中終止日誌線程,並以上一次 checkpoint 作為日誌備份時間點

xtrabackup: The latest check point (for incremental): '85727497'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (85727497)


完成所有備份後,可以看到下麵信息返回

innobackupex: Backup created in directory '/backup/2013-12-23_14-09-34'
131223 14:09:39  innobackupex: Connection to database server closed
131223 14:09:39  innobackupex: completed OK!


上述全庫備份方法將會自動把備份信息存放到一個以當前年-月-日_時-分-秒的目錄中
如果你希望自定義備份目錄(注,目錄需在備份過程中自動生成),可以增加 --no-timestamp 參數,如

innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket /backup/2013_12_23 --no-timestamp


則備份時候會自動創建 2013_12_23 目錄並把備份集存放至該目錄中

注意,當前全庫備份隻備份至上文提到 checkpoint '85727497' 序號的事務及已經完成同步至磁盤中的數據,而已經執行,但還沒有提交的事務仍然存放在內存中(innodb buffer),導致當前數據文件處於非一致性狀態
假設當前要對全備進行恢複,則我們卻要利用回滾未提交的事務,使得數據文件處於一致狀態,因此,我們再執行完整全備之後,切記要執行一次  --apply-log 操作,這點是十分重要的


當前參考文件 /backup/2013-12-23_14-09-34/xtrabackup_checkpoints

cat /backup/2013-12-23_14-09-34/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 85727497
last_lsn = 85727497
compact = 0


執行 --apply-log 時,必須要指定之前的備份目錄(因為需要獲得正確的 xtrabackup_checkpoints 文件)

cd /backup/2013-12-23_14-09-34
innobackupex --apply-log --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket  ./

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
131223 16:23:40  InnoDB: Starting shutdown...
131223 16:23:44  InnoDB: Shutdown completed; log sequence number 85728268
131223 16:23:44  innobackupex: completed OK!


參見最新後的 xtrabackup_checkpoints 文件信息

backup_type = full-prepared
from_lsn = 0
to_lsn = 85727826
last_lsn = 85727826
compact = 0


默認情況下,--apply-log 參數,隻調用係統 100M 內存,如果當前 innodb buffer pool 比較大,則同步內存中數據時間可能會比較長,可以通過定義內存大小加快備份速度, 如參數 --use-memory=4G

 

 

恢複方法

要進行全庫恢複,可調用參數  --copy-back

注: 當前全庫恢複為離線恢複模式
   需保證  datadir (/mdb) 數據庫目錄當前為空
   需保證數據庫處於關閉狀態
  數據恢複後,需對 datadir (/mdb) 目錄重新修改文件所有者為 mysql 用戶

innobackupex --copy-back --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket /backup/2013-12-23_16-22-34

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-12-23_16-22-34'
innobackupex: back to original InnoDB log directory '/mdb'
innobackupex: Copying '/backup/2013-12-23_16-22-34/ib_logfile1' to '/mdb/ib_logfile1'
innobackupex: Copying '/backup/2013-12-23_16-22-34/ib_logfile0' to '/mdb/ib_logfile0'
innobackupex: Finished copying back files.

131223 16:39:06  innobackupex: completed OK!


備份完成後需要對數據庫文件目錄授權 mysql 用戶屬性

[root@db2 /]# chown mysql:mysql /mdb -R


 

增量備份

注: 增量備份隻支持 innodb 引擎, MyISAM 引擎無法實現增量,隻會進行全表備份

innobackupex --incremental /data/backups --incremental-basedir=BASEDIR


備份恢複過程,先參考之前文檔,執行一次全備份。(增量備份需建立在全備份之上)

全備

innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket  /backup 


apply-log 備份

innobackupex --user=root --password=123 --apply-log --socket=/var/run/mysqld/mysql5.socket  /backup/2013-12-24_14-58-26/


檢查當前 check-point 位置

cat 2013-12-24_14-58-26/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 85760880
last_lsn = 85760880
compact = 0


檢查當前數據庫的 lsn

---
LOG
---
Log sequence number 85760880
Log flushed up to   85760880
Last checkpoint at  85760880
Max checkpoint age    7782360
Checkpoint age target 7539162


為數據庫插入數據.. (略)

增加數據後的  lsn

---
LOG
---
Log sequence number 85764524
Log flushed up to   85764524
Last checkpoint at  85764524
Max checkpoint age    7782360
Checkpoint age target 7539162


 

執行增量備份

innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket --incremental /backup --incremental-basedir=/backup/2013-12-24_14-58-26/


--incremental-basedir 需要指定之前完整備份的目錄
--incremental  將會在改目錄下生成新的目錄用於存放增量備份數據

執行成功後, /backup 將會出現兩個目錄
2013-12-24_14-58-26 (完整備份)  2013-12-24_15-02-57 (增量備份)

查看當前增量備份 check-point 信息

cat /backup/2013-12-24_15-02-57/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 85760880
to_lsn = 85764524
last_lsn = 85764524
compact = 0


完整備份 lsn 從 0 ~ 85760880, 增量備份 lsn 從 85760880 ~ 85764524 匹配當前數據庫中的最後一次 lsn


分別按順序(先全備再增量)對備份目錄執行 --apply-log --redo-only 操作確保數據一致性(該操作隻需要在恢複前執行)

innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket --apply-log --redo-only /backup/2013-12-24_14-58-26

innobackupex --user=root --password=123 --socket=/var/run/mysqld/mysql5.socket --apply-log --redo-only /backup/2013-12-24_14-58-26 --incremental-dir=/backup/2013-12-24_15-02-57


 

執行後再重新檢驗一次 check-point 文件, 發現全庫備份的 checkpoint 已經包含了增量備份中的 lsn

[root@db4 backup]# cat 2013-12-24_14-58-26/xtrabackup_checkpoints   
backup_type = full-prepared
from_lsn = 0
to_lsn = 85764524
last_lsn = 85764524
compact = 0
[root@db4 backup]# cat 2013-12-24_15-02-57/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 85760880
to_lsn = 85764524
last_lsn = 85764524
compact = 0


 

恢複方法跟之前一樣, 隻需要指定全庫備份位置則可

innobackupex --copy-back /backup/2013-12-24_14-58-26 



時間點備份

全備恢複後,利用二進製日誌進行時間點恢複,與 xtrabackup 無關, 純 MYSQL 特點, 不詳細討論

 

備份壓縮

利用 --compress 參數實現

最後更新:2017-04-03 12:54:02

  上一篇:go Apk如何調用非係統jar包
  下一篇:go 我的2013:從北京到石家莊的軟件開發曆程