一個用於MySQL數據庫物理熱備的備份工具,支持MySQL、Percona server和MariaDB,開源免費,是目前較爲受歡迎的主流備份工具。xtrabackup只能備份innoDB和xtraDB兩種數據引擎的表,而不能備份MyISAM數據表。mysql
Percona XtraBackup的工做原理是在啓動時記住日誌序列號(LSN),而後複製數據文件。同時,Percona XtraBackup運行一個後臺檢測進程,該進程監視mysq redo事務日誌文件,並從其中複製更改,記入後臺日誌文件xtrabackup_log中。以後複製innodb的數據文件一系統表空間文件ibdatax,複製結束後,將執行flush tables with readlock,而後複製.frm MYI MYD等文件,最後執行unlock tables,最終中止xtrabackup_logsql
方法一(官方推薦):
1.下載相應的rpm安裝包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_6 4.rpm數據庫
2.安裝已下載的rpm安裝包
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpmcentos
3.查看是否已安裝成功
rpm -qa | grep -i xtrabackup
相關文件查詢
rpm -ql percona-xtrabackup-80緩存
4.建立備份目錄服務器
5.修改mysql配置文件 開啓bin-log日誌,添加或修改數據庫目錄併發
方法二(官方推薦):app
安裝Percona yum存儲庫
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpmsocket
安裝Percona XtraBackup
yum install percona-xtrabackup-80工具
方法三:
解壓
tar zxvf percona-xtrabackup-8.0.7-Linux-x86_64.libgcrypt20.tar.gz mv percona-xtrabackup-8.0.7-Linux-x86_64 xtrabackup cp -r xtrabackup /usr/local/xtrabackup
添加環境變量
echo "export PATH=$PATH:/usr/local/xtrabackup/bin" > /etc/profile.d/xtrabackup.sh
讓環境變量生效
source /etc/profile.d/xtrabackup.sh
#####注意新版本8.0: (1)移除了innobackupex命令;
(2)Percona XtraBackup 8.0 支持MySQL8.0的版本;
(3)mysql8.0以前的版本須要使用xtrabackup2.4備份和恢復.
Xtrabackup一個以徹底備份所需的最低特權建立數據庫用戶:
mysql> CREATE USER ‘bkpuser'@'localhost' IDENTIFIED BY 's3cr%T';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON . TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
#####注意: 一旦鏈接到服務器,在服務器執行備份你對datadir須要READ和EXECUTE的文件系統級權限。 若是有多個服務器實例,則必須指定正確的鏈接參數(port, socket, host),以便xtrabackup與正確的服務器通訊。
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --backup --target-dir=/backup/full/
#####選項優化:
--rsync
使用rsync實用程序優化本地文件傳輸。指定此選項後,xtrabackup將使用rsync複製全部非InnoDB文件,而不是爲每一個文件生成單獨的cp,這對於具備大量數據庫或表的服務器而言能夠更快。此選項不能與--stream一塊兒使用。
--use-memory
此選項會影響分配多少內存以使用進行備份
--parallel=#
此選項指定建立備份時用於同時複製多個數據文件的線程數。默認值爲1(即無併發傳輸)。
在恢復備份以前,datadir必須爲空。一樣重要的是,在執行恢復以前,MySQL服務器須要關閉。不能還原到正在運行的mysqld實例的datadir(導入部分備份時除外)。
準備一個全量備份,主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使用得數據文件處於一致性狀態。 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --prepare (--apply-log-only)--target-dir=/backup/full/
當數據恢復至數據目錄之後,您應該檢查恢復的文件是否具備正確的全部權和權限。因爲文件屬性將被保留,在大多數狀況下,在啓動數據庫服務器以前,您須要將文件的全部權更改成mysql,由於它們將由建立備份的用戶擁有:
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --copy-back --target-dir=/backup/full/
chown -R mysql:mysql /var/lib/mysql
從新啓動mysql服務
若是您打算將備份做爲進一步增量備份的基礎,那麼在準備備份時應該使用—apply-log-only選項,不然將沒法對其應用增量備份
--defaults-file
指定mysql配置文件:只能從給定的文件中讀取默認選項。 且必須做爲命令行上的第一個選項;必須是一個真實的文件,它不能是一個符號連接。
--target-dir
指定備份數據目錄
--prepare
數據文件在準備好以前不是時間點一致的,由於它們是在程序運行的不一樣時間複製的,而且在此過程當中可能已經被更改,此步驟使文件在同一時刻徹底一致
--backup
作一個備份,放入--target-dir
--copy-back
拷貝先前備份全部文件到它們的原始路徑。但原路徑下不能有任何文件或目錄,除非指定 --force-non-empty-directories 選項。
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --databases=」xxx」 --backup --target-dir=/part/single
prepare部分備份的過程相似於導出表的過程,要使用--export選項進行,還原部分備份的過程跟導入表的過程相同。固然,也能夠經過直接複製prepared狀態的備份直接至數據目錄中實現還原,不要此時要求數據目錄處於一致狀態。
--export
建立導出表所需的文件
要將innodb_file_per_table開啓,數據要是innodb存儲引擎,若是是delete數據的話,datadir目錄下仍是會有.ibd、.frm文件,若是是drop的數據,那麼咱們的手動執行要恢復表的建表語句,.cfg文件是用來和數據字典進行匹配的。
增量備份主要是經過拷貝innodb中有變動的頁(指的是LSN大於xtrabackup_checkpoints中的LSN號)。文件xtrabackup_checkpoints會記錄備份完成時檢查點的LSN,增量備份是基於全備的,第一次增量備份的數據是基於上一次全備,以後的每一次增備都是基於上一次的增備,最終達到一致性的增備,增備的過程當中,和全備很相似,區別在於第二步
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/incr/incr1 --incremental-basedir=/data/backup/
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/part/incr2 --incremental-basedir=/incr/incr1
須要注意的是,增量備份僅能應用於InooDB或XtraDB表,對於MyISAM表,增量與全備相同.
準備徹底備份,確保全備數據目錄數據的一致性
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup
恢復增量備份到徹底備份(開始恢復的增量備份要添加--apply-log-only參數,到最後一次的增量備份要去掉--apply-log-only),即便--apply-log-only在最後一次的增量備份中使用了,備份仍將保持一致,但在這種狀況下,服務器將執行回滾階段。
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup/ --incremental-dir=/incr/incr1
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/ --incremental-dir=/incr/incr2
最終數據會在/data/backup/上,對應用了增量備份的新備份進行恢復
xtrabackup --user=root --password=xxxyyy --copy-back --target-dir=/data/backup/
chown -R mysql:mysql /var/lib/mysql
--prepare增量備份的步驟與徹底備份的步驟不一樣。在徹底備份中,執行兩種類型的操做以使數據庫保持一致:已提交的事務相對於數據文件從日誌文件中重放,未提交的事務被回滾。在準備增量備份時,必須跳過未提交事務的回滾,由於在備份時未提交的事務可能正在進行中,而且頗有可能將在下一個增量備份中提交。您應該使用該 --apply-log-only選項來防止回滾階段。
--apply-log-only
此選項只致使在準備備份時執行重作階段。這對於增量備份很是重要。
--target-dir
備份:增量備份目錄
恢復:在準備增量備份時,這是增量備份與完整備份相結合以建立新的完整備份的目錄。
--incremental-basedir
在建立增量備份時,此目錄包含完整備份,即增量備份的基本數據集。
—apply-log-only
防止事務回滾階段
(1)xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息。
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_info —— 記錄的是你備份的時候的一些參數,腳本版本,數據庫版本,備份時間,binlog,是否壓縮,備份增量仍是全量等信息。
(4)backup-my.cnf —— 包含了my.cnf中備份時須要的信息。
(5)xtrabackup_logfile——記錄了備份過程當中的日誌,在對數據進行prepare時須要經過日誌將數據還原成一致的可用的數據。
(6)其餘一些數據庫文件信息
有時您能夠看到to_lsn (最後一個檢查點LSN)和last_lsn(最後一個複製的LSN)之間存在差別,這意味着在備份過程當中服務器上有一些流量
導出SQLy語句文件
mysqldump命令必須帶上--flush-logs選項以生成新的二進制日誌文件 mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 --all-database > /backup/all.sql ####參數介紹 對於MyISAM將–single-transaction替換爲–lock-all-tables
--flush-logs爲結束當前日誌,生成新日誌文件;
--master-data=2 選項將會在輸出SQL中記錄下徹底備份後新日誌文件的名稱;以及其開始的pos位置
--all-database 全部數據庫
--master-data=[0|1|2]
0 : 不記錄
1 : 記錄爲CHANGE MASTER語句
2 : 記錄爲註釋的CHANGE MASTER語句
--single-transaction 該選項在導出數據以前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB
mysql -h127.0.0.1 -P3306 -uroot -p < /backup/all.sql
mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 dbname > /backup/part.sql
mysql -h127.0.0.1 -P3306 -uroot -pxxxx < /backup/part.sql
增量備份的數據是從上次全量備份以後更新的數據,對mysql來講binlog日誌文件存儲着增量備份的數據。binlog是一個二進制格式的文件,用於記錄用戶對數據庫更新的SQL語句信息。
mysqladmin -uroot -pxxxx flush-logs
執行增量備份的前提條件是MySQL打開binlog日誌功能,在mysql配置文件my.cnf中加入log-bin=mysql-bin
mysqldump增量恢復:
mysqlbinlog mysql-bin.0000xx | mysql -uroot -p
mysqldump數據恢復指定的時間點或位置:
--start-datetime=YYYY-mm-dd HH:MM:SS
--stop-datetime=YYYY-mm-dd HH:MM:SS
上邊一組參數用於指定恢復開始時間點和結束時間點,能夠一塊兒或單獨給出
--start-position=xxxxx
--stop-position=xxxxx
上邊一組參數用於指定恢復開始位置和結束位置,能夠一塊兒或單獨給出
兩組參數也能夠結合使用
工具 | mysqldump | xtrabackup |
---|---|---|
數據量 | 1G左右 | 1G左右 |
全備時間 | 平均1m15s | 平均20s |
恢復全備時間 | 平均8m | 平均18s |
佔用空間 | 617MB | 930MB |
工具 | mysqldump | xtrabackup |
---|---|---|
數據量 | 5G左右 | 5G左右 |
全備時間 | 平均3m50s | 平均1m10s |
恢復全備時間 | 平均45m | 平均1m5s |
佔用空間 | 3.3GB | 4G |
一週作一次全量備份,其他時間增量備份或者一個月作一次全量備份,一週一次增量備份,依靠系統定時任務,在業務壓力比較小的時間點凌晨(0--5點),定時執行備份腳本
若全量備份,能夠天爲單位進行刪除 若全量+增量備份,按期刪除(建議週期一個月)已過期備份文件