前言:說到數據庫備份,我們知道可以用來對數據庫進行備份的工具有mysqldump、mydumer、mysqlpump等等,實際工作中,機器上的數據庫不大的話,都是用mysqldump工具來備份,這些備份工具各有優缺點,這里不詳細介紹,今天分享另一個數據庫備份工具,叫XtraBackup。
一、Xtrabackup介紹
1.官網說明
支持InnoDB,XtraDB和HailDB 存儲引擎的完全非阻塞備份

4.為什么要用XtraBackup
因為當數據庫超過100G的話,用mysqldump就沒有XtraBackup有優勢,工作中mysqldump備份大的數據還會出現卡住,斷開的可能性,XtraBackup支持完整備份,增量備份,完整恢復,增量恢復,對於innodb引擎備份時不鎖表進行熱備份。
二、XtraBackup安裝
1.xtrabackup官網有很多個版本,有1.6、2.0-2.4和8.0,每個版本都有不同,根據自己需要下載安裝,如:
xtrabackup1.6版本支持MySQL 5.0、5.1和5.5。
xtrabackup2.2和2.3版本支持備份MySQL 5.1 、5.5和5.6。
xtrabackup2.4版本支持MySQL 5.1、5.5、5.6和5.7。
xtrabackup8.0版本只支持MySQL8.0,不支持8.0之前的。
本文章使用xtrabackup2.3。
2.下載安裝
官網有源碼包下載,二進制包、還有存儲庫,官網推薦存儲庫下載,我這里環境用Centos7,所以用yum安裝,這里選擇安裝yum install -y percona-xtrabackup.x86_64
1 yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm 2 yum list | grep percona 3 percona-xtrabackup.x86_64 2.3.10-1.el7 percona-release-x86_64 4 percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_64 5 percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_64 6 percona-xtrabackup-24.x86_64 2.4.18-1.el7 percona-release-x86_64 7 percona-xtrabackup-24-debuginfo.x86_64 2.4.18-1.el7 percona-release-x86_64 8 percona-xtrabackup-80.x86_64 8.0.9-1.el7 percona-release-x86_64 9 percona-xtrabackup-80-debuginfo.x86_64 8.0.9-1.el7 percona-release-x86_64 10 percona-xtrabackup-debuginfo.x86_64 2.3.10-1.el7 percona-release-x86_64 11 percona-xtrabackup-test.x86_64 2.3.10-1.el7 percona-release-x86_64 12 percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona-release-x86_64 13 percona-xtrabackup-test-24.x86_64 2.4.18-1.el7 percona-release-x86_64 14 percona-xtrabackup-test-80.x86_64 8.0.9-1.el7 percona-release-x86_64
安裝之后,可以檢查xtrabackup版本,我本地的數據庫版本是5.6
1 xtrabackup --version 2 xtrabackup version 2.3.6 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
3.工具介紹
Xtrabackup安裝完成后有4個可執行文件,其中2個比較重要的備份工具是innobackupex、xtrabackup
innobackupex
innobackupex是一個封裝xtrabackup的Perl腳本。。
xtrabackup
編譯后的C二進制文件,提供了使用MyISAM,InnoDB和XtraDB表備份整個MySQL數據庫實例的功能。
xbcrypt加密
用於加密和解密備份文件的實用程序。
xbstream
允許以流的形式從xbstream格式提取文件,類似tar。
xbcloud
用於從雲中下載xbstream歸檔的全部或部分或將其上傳到雲。
官網說明:innobackupex仍然像2.2版本一樣支持所有功能和語法,但是現在已棄用,並且將在下一個主要版本中刪除,Percona XtraBackup 2.3版本的推薦方式采取的備份是使用xtrabackup腳本,這篇文章介紹innobackupex腳本,差別不大。
4.innobackupex命令參數
--user= #指定數據庫備份用戶 --password= #指定數據庫備份用戶密碼 --port= #指定數據庫端口 --host= #指定備份主機 --socket= #指定socket文件路徑 --databases= #備份指定數據庫,多個空格隔開,如--databases="dbname1 dbname2",不加備份所有庫 --defaults-file= #指定my.cnf配置文件 --apply-log #日志回滾 --incremental= #增量備份,后跟增量備份路徑 --incremental-basedir= #增量備份,指上次增量備份路徑 --redo-only #合並全備和增量備份數據文件 --copy-back #將備份數據復制到數據庫,數據庫目錄要為空 --no-timestamp #生成備份文件不以時間戳為目錄名 --stream= #指定流的格式做備份,--stream=tar,將備份文件歸檔,--stream=xbstream --remote-host=user@ip DST_DIR #備份到遠程主機 --use-memory= #該參數在prepare的時候使用,控制prepare時innodb實例使用的內存量 --parallel #用於復制數據文件的線程數。配合-stream=xbstream --compress #壓縮功能,配合-stream=xbstream --compress-threads=4 #用於並行數據壓縮的線程數。此選項的默認值為1。配合-stream=xbstream --throttle= #限制innobackupex讀寫InnoDB數據的速率
三、用innobackupex進行完整備份
1.執行完整備份命令
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password="123456" --socket=/tmp/mysql.sock --no-timestamp /data/backup/$(date +%F)/full
最后輸出下面信息表示成功備份
xtrabackup: Transaction log of lsn (42677124128) to (42677124128) was copied.
200127 13:21:18 completed OK!
在/data/backup目錄下面生成一個當前日期命名的目錄,時間目錄下面的full目錄里面存放着備份出來的文件
1 [root@devops 13:17:24/data/backup/]# ll 2 total 2535576 3 drwx------ 3 root root 4096 Jan 27 13:17 2020-01-27
介紹一下目錄的文件信息
1 [root@devops 13:21:18/data/backup/]# ll 2020-01-27/full/ 2 total 141364 3 -rw-r----- 1 root root 388 Jan 27 13:21 backup-my.cnf #備份命令用到的配置信息 4 -rw-r----- 1 root root 144703488 Jan 27 13:17 ibdata1 #備份的表空間的文件 5 drwx------ 2 root root 4096 Jan 27 13:21 mysql #備份出來的mysql、performance_schema、test數據庫 6 drwx------ 2 root root 4096 Jan 27 13:21 performance_schema 7 drwx------ 2 root root 4096 Jan 27 13:21 test 8 -rw-r----- 1 root root 21 Jan 27 13:21 xtrabackup_binlog_info #binlog日志信息 9 -rw-r----- 1 root root 121 Jan 27 13:21 xtrabackup_checkpoints #這個比較重要,里面存放着lsn(日志序列號) 10 -rw-r----- 1 root root 602 Jan 27 13:21 xtrabackup_info #存放一些工具版本、數據庫版本、執行開始結束時間等信息 11 -rw-r----- 1 root root 2560 Jan 27 13:21 xtrabackup_logfile #重做日志文件
2.模擬刪除整個數據目錄
cd /data/ && rm -rf mysqldata
3.kill掉mysql進程
pgrep mysql | xargs kill
4.准備
准備(prepare)一個完全備份
一般情況下,在備份完成后,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“准備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobackupex命令的-apply-log選項可用於實現上述功能
不建議在准備時中斷xtrabackup過程,因為這可能會導致數據文件損壞並且備份將變得不可用。如果准備過程中斷,則不能保證備份的有效性。
innobackupex --apply /data/backup/2020-01-27/full/
最后輸出:200127 13:44:47 completed OK!
5.查看xtrabackup_checkpoints文件
查看合並后的 checkpoints 其中的類型變為 full-prepared 即為可恢復。
backup_type = full-prepared
6.執行恢復之前要在my.cnf指定數據目錄
恢復備份之前,datadir必須為空。要注意在執行還原之前需要關閉MySQL服務器。不能還原到正在運行的mysqld實例的數據目錄(導入部分備份時除外)
1 cat /usr/local/mysql/my.cnf | grep datadir 2 datadir = /data/mysqldata
7.執行恢復命令
innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/2020-01-27/full
200127 13:56:37 completed OK!
如果恢復最后輸出OK就沒問題
8.修改權限
由於將保留文件的屬性,因此在大多數情況下,mysql在啟動數據庫服務器之前,需要將文件的所有權更改為mysql
chown -R mysql.mysql /data/mysqldata
9.啟動
service mysqld start
10.檢查數據
總結:這篇文章介紹xtrabackup完整備份和還原,后面還會繼續寫,如果那里寫得不好,請多多指教,謝謝