Xtrabackup是由percona開發的一個開源軟件,是使用perl語言完成的腳本工具,能夠非常快速地備份與恢復mysql數據庫,且支持在線熱備份,備份時不影響數據讀寫
在備份的時候,備份工具主要執行兩個任務來完成備份:
① 在后台啟動一個日志拷貝線程。這個線程會監視InnoDB日志文件,當日志文件發生改變時,這個線程會將發生變化的數據塊拷貝到備份目錄下一個名為xtrabackup_logfile的文件中。這個操作是必要的,因為備份可能會持續很長時間,在數據庫恢復時,需要所有從備份開始到結束的這些日志文件。
② 拷貝InnoDB數據文件到指定備份目錄下。這不是一個簡單的拷貝,備份工具打開並讀取文件的方式類似InnoDB,通過讀取文件目錄並以頁(page)為單位進行拷貝。
當數據文件拷貝結束時,xtrabackup會停止日志拷貝線程,並在指定備份目錄中創建一個名為xtrabackup_checkpoints的文件,這個文件包含備份的類型、開始備份的日志序列號和結束備份的日志序列號。
Xtrabackup 下載地址:
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.13/source/tarball/percona-xtrabackup-2.4.13.tar.gz
解壓安裝過程省略。。。
innobackupex常用參數
--compress:該選項表示壓縮innodb數據文件的備份。
--compact: 創建一個不包含第二索引(除了主鍵之外的索引)的備份 --defaults-file=[MY.CNF] 配置文件的路徑 --use-memory=# 這個參數用於在准備備份時,xtrabackup執行crash recovery所使用的內存大小。這個參數僅和--apply-log搭配時才生效。 --include:該選項表示使用正則表達式匹配表的名字[db.tb],要求為其指定匹配要備份的表的完整名稱,即databasename.tablename。 --user:該選項表示備份賬號。 --password:該選項表示備份的密碼。 --port:該選項表示備份數據庫的端口。 --host:該選項表示備份數據庫的地址。 --databases:該選項接受的參數為數據名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表。此外,此選項也可以接受一個文件為參數,文件中每一行為一個要備份的對象。 --tables-file:該選項表示指定含有表列表的文件,格式為database.table,該選項直接傳給--tables-file。 --socket:該選項表示mysql.sock所在位置,以便備份進程登錄mysql。 --slave-info:該選項表示對slave進行備份的時候使用,打印出master的名字和binlog pos,同樣將這些信息以change master的命令寫入xtrabackup_slave_info文件。可以通過基於這份備份啟動一個從庫。 --safe-slave-backup:該選項表示為保證一致性復制狀態,這個選項停止SQL線程並且等到show status中的slave_open_temp_tables為0的時候開始備份,如果沒有打開臨時表,bakcup會立刻開始,否則SQL線程啟動或者關閉知道沒有打開的臨時表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默認300秒)秒之后不為0,從庫sql線程會在備份完成的時候重啟。 --rsync:該選項表示通過rsync工具優化本地傳輸,當指定這個選項,innobackupex使用rsync拷貝非Innodb文件而替換cp,當有很多DB和表的時候會快很多,不能--stream一起使用。 --history:該選項表示percona server 的備份歷史記錄在percona_schema.xtrabackup_history表。 --redo-only 當准備數據庫的全備或合並增量備份時,需要指定這個參數。這個參數實際上執行的是xtrabackup --apply-log-only,會讓xtrabackup跳過回滾節點,只做“redo”步驟。當數據庫需要應用增量備份時,需要指定這個參數。 --no-timestamp 這個參數會讓xtrabackup在備份的時候不創建帶有時間格式的子文件夾。當指定了這個參數,備份會直接創建在指定的備份目錄下。 --stream=STREAMNAME 指定流備份的格式。備份將會以指定格式輸出到STDOUT。目前支持的格式有tar 和 xbstream。如果指定了這個參數,后面需要接tmpdir目錄作為處理流的一個中間目錄。 --incremental 創建增量備份,當指定這個參數的時候,應該指定--incremental-lsn或--incremental-basedir參數,否則將會備份到--incremental-basedir路徑 --incremental-basedir 以上一次全量或增量備份的路徑,作為增量備份的基礎。指定這個參數的同時,應該同樣指定--incremental參數 --incremental-dir:該選項表示增量備份的目錄。 --incremental-force-scan:該選項表示創建一份增量備份時,強制掃描所有增量備份中的數據頁。 --incremental-lsn:該選項表示指定增量備份的LSN,與--incremental選項一起使用。 --incremental-history-name:該選項表示存儲在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜索歷史表查找最近(innodb_to_lsn)成功備份並且將to_lsn值作為增量備份啟動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error。 --incremental-history-uuid:該選項表示存儲在percona_schema.xtrabackup_history基於增量備份的特定歷史記錄的UUID。 --close-files:該選項表示關閉不再訪問的文件句柄,當xtrabackup打開表空間通常並不關閉文件句柄目的是正確的處理DDL操作。如果表空間數量巨大,這是一種可以關閉不再訪問的文件句柄的方法。使用該選項有風險,會有產生不一致備份的可能。
全備及本地或者異地恢復過程
備份
innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf /data/backups/ --user=root -H127.0.0.1 -P3307 --password=***
--defaults-file:mysql配置文件。不指定默認為 /etc/my.cnf
/data/backups/ 備份文件要寫入的目錄,會創建一個以時間格式為名的目錄2019-02-13_15-19-58
恢復
1、本地恢復的話 要先關閉數據庫,並且刪除數據文件,確保數據目錄為空
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=4G --apply-log /data/backups/2019-02-13_15-19-58
--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 2、innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58 --copy-back,即把備份文件拷貝至原數據目錄下。 3、修改數據目錄權限 chown mysql.mysql /data/mysql_data/3307/data -R
相關備份binlog點都存在下圖中,用作主從同步及記錄,數據庫啟動后根據文件中的點從做主備的相關參數即可

以上流程也適合異地恢復及做主從同步,把備份目錄scp到遠程服務器目錄,再執行第二三步即可
增備及本地或者異地恢復過程
備份及恢復
注意:innobackupex 增量備份僅針對InnoDB這類支持事務的引擎,對於MyISAM等引擎,則仍然是全備。
1、增量備份:增量備份需要基於全備
innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf --user=root -H127.0.0.1 -P3307 --password=*** --incremental /data/backups --incremental-basedir=/data/backups/2019-02-13_15-19-58
--incremental-basedir 指向全量備份目錄
--incremental 指向增量備份的目錄
上面語句執行成功之后,會在--incremental執行的目錄下創建一個時間戳子目錄
可以持續做增量備份
只需要把--incremental-basedir 的目錄指向上一次增量備份的目錄即可
2、增量備份恢復
innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/INCREMENTAL-DIR(2019-02-13_15-19-58)
- innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-1
- innobackupex --apply-log --redo-only --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G /data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-2
- 多個備份往后以此類推
INCREMENTAL-DIR:全備目錄
INCREMENTAL-DIR-1:增備目錄1
INCREMENTAL-DIR-2:增備目錄2
。。。
此時兩次增量備份其實都合並到全備上了,恢復是只需要使用全備進行恢復就可以了
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G --apply-log /data/backups/2019-02-13_15-19-58
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58
3、修改數據目錄權限啟動即可