Xtrabackup搭建主從複製
- 2019 年 11 月 6 日
- 筆記
一次線上的Xtrabackup主從複製過程
一、Xtrabackup介紹
1.Xtrabackup和mysqlump的區別
mysqldump:邏輯備份,其最大的缺陷就是備份和恢復速度都慢,對於一個小於50G的數據庫而言,這個速度還是能夠接受的,如果數據庫非常大,那再使用mysqldump備份就不太適合了。
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一個開源的能夠對innodb和xtradb數據庫進行物理熱備的工具。測試環境中備份150G的數據,大概20多分鐘。
2.xtrabackup工具的特點
1)備份過程快速,可靠;
2)備份過程不會打斷正在執行的事務(不需要鎖表)
3)能夠給予壓縮等功能節約磁盤空間和流量。
4)自動實現備份檢驗;
5)還原速度快;
6)可以進行流傳出備份,備份到另外一台機器上
3.工具集
軟件包安裝完後一共有4個可執行文件,如下:
usr
├── bin
│ ├── innobackupex
│ ├── xbcrypt
│ ├── xbstream
│ └── xtrabackup
其中最主要的是 innobackupex 和 xtrabackup,前者是一個 perl 腳本,後者是 C/C++ 編譯的二進制。
a.innobackupex:此工具將xtrabackup進行封裝,本身是個perl腳本,可以備份mysiam表。innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 mysqld server 發送命令進行交互,如加讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。簡單來說,innobackupex 在 xtrabackup 之上做了一層封裝。
b.xtrabackup:用於熱備innodb,xtradb表中數據的工具,不能備份其他類型的表,只能備份表數據,不能備份表結構。xtrabackup是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 mysqld server 沒有交互;
另外兩個小眾的工具:
xbcrypt 是加解密用的;xbstream 類似於tar,是 Percona 自己實現的一種支持並發寫的流文件格式。兩都在備份和解壓時都會用到(如果備份用了加密和並發)。
4.原理
2個工具之間的交互和協調是通過控制文件的創建和刪除來實現的,主要文件有:
a. xtrabackup_suspended_1
b. xtrabackup_suspended_2
c. xtrabackup_log_copied
舉個例子,我們來看備份時 xtrabackup_suspended_2 是怎麼來協調2個工具進程的
1.innobackupex 在啟動 xtrabackup 進程後,會一直等 xtrabackup 備份完 InnoDB 文件,方式就是等待 xtrabackup_suspended_2 這個文件被創建出來;
2.xtrabackup 在備完 InnoDB 數據後,就在指定目錄下創建出這個文件,然後等這個文件被 innobackupex 刪除;
3.innobackupex 檢測到文件 xtrabackup_suspended_2 被創建出來後,就繼續往下走;
4.innobackupex 在備份完非 InnoDB 表後,刪除 xtrabackup_suspended_2 這個文件,這樣就通知 xtrabackup 可以繼續了,然後等 xtrabackup_log_copied 被創建;
5.xtrabackup 檢測到 xtrabackup_suspended_2 文件刪除後,就可以繼續往下了。
5.備份過程

更多詳情可參考網站:
http://www.cnblogs.com/zhoujinyi/p/5888271.html
二、xtrabackup的安裝部署配置
安裝方法:
1.下載安裝包。
可直接登陸網站,也可使用以下命令:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.3/binary/redhat/6/x86_64/percona-xtrabackup-2.3.3-1.el6.x86_64.rpm |
---|
下載的是rpm包。
2.安裝依賴
yum install -y perl-DBD-MySQL per-DBI perl-Time-HiRes libaio* |
---|
3.安裝rpm包
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpm |
---|
此時會發現提示如下錯誤:
warning: percona-xtrabackup-2.3.3-1.e16.x86_64.rpm: Header V4 DSA/SHA1 Signature,key ID cd2efd2a: NOKEYerror: Faild dependencies:lidev.so4()(64bit) is needed by percona-xtrabackup-2.3.3-1.e16.x86_64 |
---|
原因是缺少依賴項,去官網下載依賴項。官網地址:
地址:http://rpmfind.net/linux/RPM/index.html
搜索libev.so.4()(64bit),這裡我下載的版本是:
libev-4.04-2.e16.x86_64.rp
4.安裝依賴:
rpm -ivh libev-4.04-2.e16.x86_64.rpm |
---|
5.安裝xtrabackup
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpmPreparing… ########################################### [100%] 1:percona-xtrabackup ########################################### [100%] |
---|
三、xtrabackup重要參數
Xtrabackup常用參數
–user=USER #指定備份用戶,不指定的話為當前系統用戶
–password=PASSWD #指定備份用戶密碼
–port=PORT #指定數據庫端口
–defaults-group=GROUP-NAME #在多實例的時候使用
–host=HOST #指定備份的主機,可以為遠程數據庫服務器
–apply-log #回滾日誌
–database #指定需要備份的數據庫,多個數據庫之間以空格分開
–defaults-file #指定mysql的配置文件
–copy-back #將備份數據複製回原始位置
–incremental #增量備份,後面跟要增量備份的路徑
–incremental-basedir=DIRECTORY #增量備份時使用指向上一次的增量備份所在的目錄
–incremental-dir=DIRECTORY #增量備份還原的時候用來合併增量備份到全量,用來指定全備路徑
–redo-only #對增量備份進行合併
–rsync #加快本地文件傳輸,適用於non-InnoDB數據庫引擎。不與–stream共用
–safe-slave-backup
–no-timestamp #生成的備份文件不以時間戳為目錄.
四、一次線上xtrabackup主從複製
生產環境:主從節點各一台,需要將主節點中的數據複製出來,然後再恢復到從節點上,然後從節點追主節點的binlog。其中主節點上面不停的有數據刷新,主從節點有一個共享的掛載硬盤服務器。
1.備份主節點上面的數據。
innobackupex –socket=/data/mysql_3306/tmp/mysql.sock /data/我的備份目錄/xtra_backup -udba_admin -pXXXXXX -h127.0.0.1 -P3306 |
---|
此處有坑!!!
上面的語句一直不能通過,提示錯誤:
Access deneied for user root@localhost (using password Yes)。
一開始懷疑是密碼輸錯,重新輸入之後,發現沒有問題;
再懷疑是socket連接出錯,去掉-h參數和-P參數,錯誤提示變為socket連接問題;
充新添加-h和-P參數,調換目錄和-h -u -P的順序,發現提示-h參數錯誤;
innobackupex –help:

發現-H參數需要大寫,更改為如下語句之後,備份成功。
innobackupex –socket=/data/mysql_3306/tmp/mysql.sock /data/我的備份目錄/xtra_backup -udba_admin -pXXXXXX -H 127.0.0.1 -P3306 |
---|
2.還原(在從庫上執行,切記關閉從庫的mysql服務,進入共享的掛載目錄)
第一步:先prepare,利用–apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態
innobackupex –apply-log /data/備份目錄/xtra_backup/2018-08-22_11-40-58/ |
---|
此步驟提示:
data目錄和innodblog目錄已經存在,無法進行還原。
這時候,我們需要先將從庫上的data目錄和innodblog目錄進行備份,然後重新進行還原。
–apply-log應用全備時 log sequence number 之後的數據,完了後會輸出類似 InnoDB: Last MySQL binlog file position 0 262484673, file name ./mysql-bin.000135 的信息,如圖所示,此時需要保存這個位置信息,為後面的還原做好準備。

第二步:copy:需要數據目錄為空
innobackupex –socket=/data/mysql_3306/tmp/mysql.sock -udba_admin -p -H 127.0.0.1 -P3306 –copy-back –rsync /data/備份目錄/xtra_backup/2018-08-22_11-40-58/ |
---|
這裏面需要注意–copy-back和–rsync兩個備份參數。
3.還原成功後,需要進行從節點的配置過程:
首先啟動mysql服務:
./mysqld_safe –defaults-file=/data/mysql_3306/my.cnf &
此時會彈出錯誤:
無法啟動,然後查詢錯誤日誌,發現:
File '/data/mysql_3306/innodblog/mysqlbin.~rec~' not found
原因:本分之後,需要改變data文件夾和innnodblog文件夾的用戶組和用戶:
解決方案:
//改變權限
chown -R mysql.mysql datachown -R mysql.mysql innodblog |
---|
啟動客戶端
./mysql -udba_admin -p -h127.0.0.1 -P3306 |
---|
配置主從(這裡已經提前配置好了binlog、server_id、以及relay_log):
change master to master_host='10.30.124.60',master_user='dba_repl',master_password='replsafe',master_log_file='mysqlbin.000051',master_log_pos=670453415; |
---|
這裡的位置就是剛才prepare階段記錄的那個位置。
show slave statusG發現無法連接,思考原因應該是從庫防火牆未開啟,開啟從庫防火牆:
vim /etc/sysconfig/iptables
之後
添加:
-A INPUT -p tcp -s 10.30.124.0/24 –sport 1024:65535 -m multiport –dports 3306 -m state –state NEW -j ACCEPT
結果如下:


從節點開始追主節點,主從複製過程結束。