閱讀678 返回首頁    go 技術社區[雲棲]


Percon-Xtrabackup備份

Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。特點:
  • (1)備份過程快速、可靠;
  • (2)備份過程不會打斷正在執行的事務;
  • (3)能夠基於壓縮等功能節約磁盤空間和流量;
  • (4)自動實現備份檢驗;
  • (5)還原速度快;
一、下載和安裝

XtraBackup現在最新版本為2.1.5,官方也提供了2.0的版本可供下載,官方鏈接地址:https://www.percona.com/software/percona-xtrabackup;可以下載源碼編譯安裝,也可以下載適合的RPM包或使用yum進行安裝。由於沒有需要特殊定製的,因此建議直接使用RPM安裝即可。

安裝方法一:

下載RPM安裝包:

wget https://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm

安裝依賴:
[root@localhost ~]# yum install -y perl-DBD-MySQL perl-DBI  perl-Time-HiRes libaio*

安裝:
[root@localhost ~]# rpm -ivh percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm
Preparing...                      ########################################### [100%]
1:percona-xtrabackup     ########################################### [100%]

安裝方法二:

安裝percona源:
[root@localhost ~]# rpm -Uhv https://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

使用yum安裝percona-xtrabackup:
[root@localhost ~]# yum -y install percona-xtrabackup

查看安裝結果:

[root@iZ2zeh44pi6rlahxj7s9azZ mnt ]# rpm -qa |grep  xtrabackup
percona-xtrabackup-2.1.5-680.rhel6.x86_64
[root@iZ2zeh44pi6rlahxj7s9azZ mnt ]# rpm -ql percona-xtrabackup-2.1.5-680.rhel6.x86_64
/usr/bin/innobackupex
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55
/usr/bin/xtrabackup_56
/usr/share/doc/percona-xtrabackup-2.1.5
/usr/share/doc/percona-xtrabackup-2.1.5/COPYING

安裝方法三:
二進製包安裝:
進入網站選擇的合適的二進製包https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/

[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/tarball/percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz

[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# tar -xvf percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz

[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# cd percona-xtrabackup-2.3.2-Linux-x86_64

[root@iZ2zeh44pi6rlahxj7s9azZ percona-xtrabackup-2.3.2-Linux-x86_64]# cp bin/innobackupex /usr/bin

[root@iZ2zeh44pi6rlahxj7s9azZ percona-xtrabackup-2.3.2-Linux-x86_64]# cp bin/xtrabackup* /usr/bin

安裝相關插件(重要)
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-DBI -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-DBD-MySQL -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-Time-HiRes -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-IO-Socket-SSL –y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-Time-HiRes libaio*
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#yum install perl-TermReadKey.x86_64 -y
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#wget     https://www.percona.com/downloads/perconatoolkit/3.0.3/binary/redhat/7/x86_64/percona-toolkit-3.0.3-1.el7.x86_64.rpm
[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#rpm -ivh percona-toolkit-3.0.3-1.el7.x86_64.rpm

Xtrabackup中主要包含兩個工具:

xtrabackup:是用於熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構;

innobackupex:是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。

二、使用xtrabackup實現對MySQL的備份:

2.1 完全備份:

基本語法1(信息盡量不全,順序也很重要):
# innobackupex --defaults-file=/etc/my.cnf --user=user_name --host=IP --password='password' --port=dk     
/data/backup
基本語法2:
xtrabackup --backup --target-dir=/data/backup/

用戶所具備的權限(insert、select、create、super、process、create table space、replication client、reload、lock tables):
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

(1)還不支持mysql最新版的
mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.19-log |
+------------+
1 row in set (0.00 sec)

[root@iZ2zeh44pi6rlahxj7s9azZ mnt]#innobackupex --user=root --host=127.0.0.1 --password='abc123' -P3307 --defaults-file=/data/my3307/my.cnf /data/backup/
170802 11:26:37 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

170802 11:26:37  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=127.0.0.1;port=3307;mysql_socket=/data/my3307/run/mysql.sock' as 'root'  (using password: YES).
170802 11:26:37  version_check Connected to MySQL server
170802 11:26:37  version_check Executing a version check against the server...
170802 11:26:37  version_check Done.
170802 11:26:37 Connecting to MySQL server host: 127.0.0.1, user: root, password: set, port: 3307, socket: /data/my3307/run/mysql.sock
Error: Unsupported server version: '5.7.19-log'. Please report a bug at https://bugs.launchpad.net/percona-xtrabackup


(2)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.37    |
+-----------+
1 row in set (0.00 sec)

[root@iZ2zeh44pi6rlahxj7s9azZ mnt]# innobackupex --user=root --host=127.0.0.1 /data/backup/
170802 11:25:27 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

170802 11:25:27  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=127.0.0.1;mysql_socket=/var/lib/mysql/mysql.sock' as 'root'  (using password: NO).

···

170802 11:25:31  version_check Done.
170802 11:25:31 Connecting to MySQL server host: 127.0.0.1, user: root, password: not set, port: 0, socket: 
170802 11:25:33 Executing UNLOCK TABLES
170802 11:25:33 All tables unlocked
170802 11:25:33 Backup created in directory '/data/backup//2017-08-02_11-25-27'
170802 11:25:33 [00] Writing backup-my.cnf
170802 11:25:33 [00]        ...done
170802 11:25:33 [00] Writing xtrabackup_info
170802 11:25:33 [00]        ...done
xtrabackup: Transaction log of lsn (1626133) to (1626133) was copied.
170802 11:25:33 completed OK!

結果:

[root@iZ2zeh44pi6rlahxj7s9azZ backup]# ls
2017-08-02_14-05-03

[root@iZ2zeh44pi6rlahxj7s9azZ backup]# cd 2017-08-02_14-05-03/

[root@iZ2zeh44pi6rlahxj7s9azZ 2017-08-02_14-05-03]# ls
backup-my.cnf  ibdata1  mysql  performance_schema  test  xtrabackup_checkpoints  xtrabackup_info  xtrabackup_logfile

(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息;

每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫係統的係統版本號,每個頁麵相關的LSN能夠表明此頁麵最近是如何發生改變的。
(2)xtrabackup_info —— mysql服務器當前正在使用的二進製日誌文件及至備份這一刻為止二進製日誌事件的位置等信息。
(3)backup-my.cnf —— 備份命令用到的配置選項信息;

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

 2.2增量備份:

[root@iZ2zeh44pi6rlahxj7s9azZ backup]# xtrabackup --backup --target-dir=/data/backup/inc1 --incremental-basedir=/data/backup
注:--target-dir=/data/backup/inc1 為增量備份所在的目錄
--incremental-basedir=/data/backup 為增量備份之前備份的目錄

[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --incremental /data/backups/inc1 --incremental-basedir=/data/backups/2017-08-02_15-51-39/
注:--incremental-basedir=/data/backups/2017-08-02_15-51-39/ 全備目錄
--incremental /data/backups/inc1 是增量備份目錄

出現completed OK!即成功
 170802 15:10:15 [00]        ...done
170802 15:10:15 [00] Writing xtrabackup_info
170802 15:10:15 [00]        ...done
xtrabackup: Transaction log of lsn (1739172) to (1739172) was copied.
170802 15:10:15 completed OK!

[root@iZ2zeh44pi6rlahxj7s9azZ backup]# ls
backup-my.cnf  ibdata1  inc1  mysql  performance_schema  test  xtrabackup_checkpoints  xtrabackup_info  xtrabackup_logfile

分別查看xtrabackup_checkpoints文件可查看backup_type以及二進製日誌的情況
[root@iZ2zeh44pi6rlahxj7s9azZ inc1]# vim /data/backup/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1710465
last_lsn = 1710465
compact = 0
recover_binlog_info = 0

[root@iZ2zeh44pi6rlahxj7s9azZ inc1]# vim /data/backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1710465
to_lsn = 1739172
last_lsn = 1739172
compact = 0
recover_binlog_info = 0

2.3恢複(備份合並後mysql服務器停掉)
[root@iZ2zeh44pi6rlahxj7s9azZ backup]# xtrabackup --copy-back --target-dir=/data/backup/
語法2(合並增量備份到全量備份,然後利用合並後全量備份恢複):
第一步是在所有備份目錄下重做已提交的日誌
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log --redo-only BASE-DIR
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
[root@iZ2zeh44pi6rlahxj7s9azZ backups]# innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。要注意的是:最後一步的增量備份並沒有--redo-only選項
第二步 回滾未完成的日誌
innobackupex --apply-log BASE-DIR
拷貝(默認為/var/lib/mysql,可以用--datadir=''指定)
[root@iZ2zeh44pi6rlahxj7s9azZ mysql]# innobackupex --copy-back /data/backups/2017-08-02_15-51-39/

出現completed OK!即為成功
170802 15:31:46 [01] Copying ./test/test2.ibd to /var/lib/mysql/test/test2.ibd
170802 15:31:46 [01]        ...done
170802 15:31:46 [01] Copying ./test/test2.frm to /var/lib/mysql/test/test2.frm
170802 15:31:46 [01]        ...done
170802 15:31:46 completed OK!
賦權:
chown -R mysql:mysql /var/lib/mysql
增量備份的恢複也是按照語法恢複,不同的是target-dir

二進製包卸載方法:
[root@iZ2zeh44pi6rlahxj7s9azZ backup]#  cd /usr/bin
[root@iZ2zeh44pi6rlahxj7s9azZ bin]# rm -rf innobackupex
[root@iZ2zeh44pi6rlahxj7s9azZ bin]# rm -rf xtrabackup*

--defaults-file 同xtrabackup的--defaults-file參數,指定配置文件的位置
--apply-log 對xtrabackup的--prepare參數的封裝
--copy-back做數據恢複時將備份數據文件拷貝到MySQL服務器的datadir ;
--remote-host=HOSTNAME通過ssh將備份數據存儲到進程服務器上;
--stream=[tar]備份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因為使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候並發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。
--tmpdir=DIRECTORY當有指定--remote-host or --stream時, 事務日誌臨時存儲的目錄, 默認采用MySQL配置文件中所指定的臨時目錄tmpdir
--redo-only --apply-log組,強製備份日誌時隻redo ,跳過rollback。這在做增量備份時非常必要。
--use-memory=#該參數在prepare的時候使用,控製prepare時innodb實例使用的內存量
--throttle=IOS同xtrabackup的--throttle參數
--sleep=是給ibbackup使用的,指定每備份1M數據,過程停止拷貝多少毫秒,也是為了在備份時盡量減小對正常業務的影響,具體可以查看ibbackup的手冊 ;
--compress[=LEVEL]對備份數據迚行壓縮,僅支持ibbackup,xtrabackup還沒有實現;
--include=REGEXP對 xtrabackup參數--tables的封裝,也支持ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份 test庫中所有的表。如果需要全備份,則省略這個參數;如果需要備份test庫下的2個表:test1和test2,則寫 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST列出需要備份的databases,如果沒有指定該參數,所有包含MyISAM和InnoDB表的database都會被備份;
--uncompress解壓備份的數據文件,支持ibbackup,xtrabackup還沒有實現該功能;
--slave-info備份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這裏會保存主日誌文件以及偏移, 文件內容類似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET 指定mysql.sock所在位置,以便備份進程登錄mysql.
測試:

最後更新:2017-08-13 22:23:23

  上一篇:go  雲服務器 ECS 建站教程:快速使用AMH建站
  下一篇:go  MySQL replication partial transaction