xtrabackup 資料庫備份工具是由percona提供的mysql資料庫備份工具,目前惟一開源的能夠對innodb和xtradb資料庫進行熱備的工具
Percona XtraBackup 2.4 - Documentation
Percona XtraBackup is an open-source hot backup utility for MySQL - based servers that doesn’t lock your database during the backup.
It can back up data from InnoDB, XtraDB, and MyISAM tables on MySQL 5.1 [1], 5.5, 5.6 and 5.7 servers, as well as Percona Server for MySQL with XtraDB.
For a high-level overview of many of its advanced features, including a feature comparison, please see About Percona XtraBackup.
Whether it is a 24x7 highly loaded server or a low-transaction-volume environment, Percona XtraBackup is designed to make backups a seamless procedure without disrupting the performance of the server in a production environment. Commercial support contracts are available.
- 由於場景限制,以下內容為Percona XtraBackup 2.4版本的內容
xtrabackup 特點
- InnoDB熱備份、增量備份支援
- 可直接備份資料到其他資料庫伺服器上
- 備份MySQL過程不增加伺服器負載
- 備份還原過程快速、可靠
- 備份過程不會打斷正在執行的事務
- 能夠基於壓縮等功能節約磁碟空間和流量
- 自動實現備份檢驗
- 基於時間點恢復
備份生成的相關檔案
使用innobackupex備份時,其會呼叫xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關檔案(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關檔案,同時還會備份觸發器和資料庫配置資訊相關的檔案。這些檔案會被儲存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立如下檔案:
- xtrabackup_info:文字檔案,innobackupex工具執行時的相關資訊,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置
- xtrabackup_checkpoints:文字檔案,備份型別(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN範圍資訊,每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號LSN。LSN是整個資料庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的
- xtrabackup_binlog_info:文字檔案,MySQL伺服器當前正在使用的二進位制日誌檔案及至備份這一刻為止二進位制日誌事件的位置,可利用實現基於binlog的恢復
- backup-my.cnf:文字檔案,備份命令用到的配置選項資訊
- xtrabackup_logfile:備份生成的二進位制日誌檔案
xtrabackup 安裝
wget -P /tmp/ https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
yum -y localinstall /tmp/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm qpress
# rpm -ql percona-xtrabackup-24.x86_64
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.22
/usr/share/doc/percona-xtrabackup-24-2.4.22/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
xtrabackup 用法
https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
- 備份:對資料庫做完全或增量備份
- 預準備: 還原前,先對備份的資料,整理至一個臨時目錄
- 還原:將整理好的資料,複製回資料庫目錄中
1 備份
# innobackupex --help
--user:#該選項表示備份賬號
--password:#該選項表示備份的密碼
--host:#該選項表示備份資料庫的地址
--databases:#該選項接受的引數為資料庫名,如果要指定多個數據庫,彼此間需要以空格隔開;
如:"xtra_test dba_test",同時,在指定某資料庫時,也可以只指定其中的某張表。
如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表
--defaults-file:#該選項指定從哪個檔案讀取MySQL配置,必須放在命令列第一個選項位置
--incremental:#該選項表示建立一個增量備份,需要指定--incremental-basedir
--incremental-basedir:#該選項指定為前一次全備份或增量備份的目錄,與--incremental同時使用
--incremental-dir:#該選項表示還原時增量備份的目錄
--include=name:#指定表名,格式:databasename.tablename
2 預備份
# innobackupex --apply-log [option] BACKUP-DIR
--apply-log:#一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。此選項作用是通過**回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態**
--use-memory:#和--apply-log選項一起使用,當prepare 備份時,做crash recovery分配的記憶體大小,單位位元組,也可1MB,1M,1G,1GB等,推薦1G
--export:#表示開啟可匯出單獨的表之後再匯入其他Mysql中
--redo-only:#此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併
3 還原
innobackupex --copy-back [選項] BACKUP-DIR
innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR
--copy-back:#做資料恢復時將備份資料檔案拷貝到MySQL伺服器的datadir
--move-back:#這個選項與--copy-back相似,唯一的區別是它不拷貝檔案,而是移動檔案到目的地。這個選項移除backup檔案,用時候必須小心。使用場景:沒有足夠的磁碟空間同事保留資料檔案和Backup副本
--force-non-empty-directories #指定該引數時候,使得innobackupex --copy-back或--move-back選項轉移檔案到非空目錄,已存在的檔案不會被覆蓋。如果--copy-back和--move-back檔案需要從備份目錄拷貝一個在datadir已經存在的檔案,會報錯失敗
4 其他
還原注意事項
- datadir 目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-back選項不會覆蓋
- 在restore之前,必須shutdown MySQL例項,不能將一個執行中的例項restore到datadir目錄中
- 由於檔案屬性會被保留,大部分情況下需要在啟動例項之前將檔案的屬主改為mysql,這些檔案將屬於建立備份的使用者, 執行
chown -R mysql:mysql /data/mysql
,以上需要在使用者呼叫innobackupex之前完成
xtrabackup實現完全備份及還原
1 安裝xtrabackup備份工具
wget -P /tmp/ https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
yum -y localinstall /tmp/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm qpress
# install qpress error see PS:1
2 完全備份
mkdir /backup
xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
3 預準備資料
釋義參見PS:4
# scp -r /backup/ 目標主機:/ # 拷貝資料到還原主機上
# 預準備:確保資料一致,提交完成的事務,回滾未完成的事務
xtrabackup --prepare --target-dir=/backup/base
4 還原資料
# 1 複製到資料庫目錄
## 資料庫目錄必須為空,MySQL服務不能啟動,必要時可使用 rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/base
# 2 還原檔案屬性
chown -R mysql:mysql /var/lib/mysql/
# 3 啟動資料庫服務驗證
service mysqld start
xtrabackup增量備份及還原
備份操作
# 建立備份根目錄
mkdir /backup
# 第一次完全備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
# 第一次增量備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
# 第二次增量備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
# 拷貝備份資料到目標機器上準備還原
scp -r /backup/* 目標主機:/bakcup/
還原操作
# 預準備完成備份,此選項--apply-log-only 不回滾未完成的事務
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
# 合併第1次增量備份到完全備份
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
# 合併第2次增量備份到完全備份,最後一次備份的還原不需要加選項--apply-log-only
xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
# 複製到資料庫目錄
xtrabackup --copy-back --target-dir=/backup/base
# 按需還原檔案屬性
chown -R mysql:mysql /var/lib/mysql
# 啟動服務
service mysqld start
xtrabackup單表匯出和匯入
#匯出
# 1 單表備份
innobackupex -uroot -p123456 --include='hellodb.students' /backup
# 2備份表結構
mysql -e 'show create table hellodb.students' > student.sql
# 3刪除表
mysql -e 'drop table hellodb.students'
# 匯出資料
# 4 innobackupex --apply-log --export /backups/2000-01-01_01-01-01/
# 5 建立表
mysql>CREATE TABLE `students` (
`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NOT NULL,
`Age` tinyint(3) unsigned NOT NULL,
`Gender` enum('F','M') NOT NULL,
`ClassID` tinyint(3) unsigned DEFAULT NULL,
`TeacherID` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
# 6 刪除表空間
alter table students discard tablespace;
# 7 cp /backups/2000-01-01_01-01-01/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/
# 8 chown -R mysql.mysql /var/lib/mysql/hellodb/
# 9 mysql>alter table students import tablespace;
PS
1. install qpress
To be able to make compressed backups, install the qpress package
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xvf qpress-11-linux-x64.tar
cp qpress /usr/bin
2. 檢視xtrabackup備份相關檔案
cat /backup/inc1/xtrabackup_info
cat /backup/inc1/xtrabackup_checkpoints
cat /backup/inc1/xtrabackup_binlog_info
3.舊版xtrabackup備份指令
# 備份
mkdir /backup/inc{1,2}
innobackupex --incremental /backup/inc1 --incremental-basedir=/backup/2000-01-01_01-01-01 # (完全備份生成的路徑)
innobackupex --incremental /backup/inc2 --incremental-basedir=/backup/inc1/2000-01-01_01-02-02 #(上次增量備份生成的路徑)
# 預準備
innobackupex --apply-log --redo-only /data/2000-01-01_01-01-01/
innobackupex --apply-log --redo-only /2000-01-01_01-01-01/ --incremental-dir=/data/inc1/2000-01-01_01-02-02
innobackupex --apply-log /data/2000-01-01_01-01-01/ --incremental-dir=/data/inc2/2000-01-01_01-03-03/
# 還原
innobackupex --copy-back /data/2000-01-01_01-01-01/
4. 預準備資料回滾理解
基於xtrabackup的備份原理,熱備份基於資料庫的lLSN事件記錄判斷資料記錄是否提交成功落盤,每次備份只要確認哪些事務被成功提交
所以每次的增量備份都把這些記錄還原到總的預準備資料中,不需要把準備的資料中未提交的事務回滾,後續備份中有中斷的事務的記錄可以補全半提交事務
最後一次增量備份新增進入總的預準備的資料中需要回滾未提交的事務,因為後面沒有關於未提交事務的資訊,也就需要回滾未提交的,以免產生資料衝突,然後才可以直接應用資料
5.結合binlog檔案實現高精度資料恢復
結合PS:4所述,最終還是會有部分未執行完全的事務被丟棄,也就是有部分資料被丟棄,如果需要高精度的資料還原,就需要結合binlog做高精度還原
# 檢視備份檔案中的binlog檔名(確認預備份檔案備份記錄到什麼位置)
cat xtrabackup_binlog_info
# 找到對於故障資料庫的對應binlog檔案,並匯出增量sql
mysqlbinlog /backup/xxx-bin.000088 --start-position=xxxxx > /tmp/inc.sql
# 關閉二進位制binlog日誌,還原增量資料
show master logs;
set sql_log_bin=off;
source /tmp/inc.sql
set sql_log_bin=on;