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