xtrabackup-2.4.8的安裝及使用
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。特點:
- (1)備份過程快速、物理備份可靠;
- (2)備份過程不會打斷正在執行的事務(無需鎖表);
- (3)能夠基於壓縮等功能節約磁盤空間和流量;
- (4)自動實現備份檢驗;
- (5)還原速度快;
- (6)可以流傳將備份傳輸到另外一台機器上;
xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,二者區別如下:
Xtrabackup:只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
Innobackup:是一個封裝了xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支持增量備份;
---Yum安裝
官網地址:https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html
[root@001 ~]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
[root@001 ~]# yum list | grep percona
[root@001 ~]# yum install percona-xtrabackup-24 -y # 卸載命令:yum remove percona-xtrabackup

[root@001 ~]# xtrabackup -version
xtrabackup version 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7)
---使用二進制編譯好的通用安裝包
下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/ #自行選擇版本
下載地址:https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/tarball/percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz #本次使用版本
[root@001 ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/tarball/percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
[root@001 ~]# tar xf percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz -C /usr/local/
[root@001 ~]# mv /usr/local/percona-xtrabackup-2.4.8-Linux-x86_64/ /usr/local/xtrabackup
[root@001 local]# echo "export PATH=\$PATH:/usr/local/xtrabackup/bin" >> /etc/profile
[root@001 local]# source /etc/profile
[root@001 ~]# yum install numactl -y #安裝依賴
----全量備份
備份數據存放在/data/backup/下面,innobackupex會自動創建一個文件夾+當前系統的時間戳
創建測試數據庫,表
mysql> create database test;
mysql> use test;
mysql> create table t1;
mysql> create table t1(id int auto_increment primary key);
mysql> insert into t1 values(null);
mysql> insert into t1 values(null);
mysql> insert into t1 values(null);

[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/data/mysqldata/mysqld.sock /data/backup/full
#這里測試直接使用root權限附上創建用戶及權限命令
mysql> create user 'backup'@'localhost' identified by '123456';
mysql> grant reload,lock tables,replication client,show view,event,process on *.* to 'backup'@localhost;
mysql> plush privileges;

#備份后的文件:在備份的同時,備份數據會在備份目錄下創建一個以當前日期時間為名字的目錄存放備份文件。

各文件說明:
(1) backup-my.cnf —— 備份命令用到的配置選項信息;
(2) ibdata1 —— 備份的表空間文件;
(3) xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(4) xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置;
(5) xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
6) xtrabackup_logfile —— 備份的重做日志文件。

可以看見相關文件記錄了LSN,日志偏移量,還可以看見這次是全備份
刪除數據庫,然后恢復全備(線上不要這樣搞)
mysql> drop database test;
恢復全備
恢復備份到mysql的數據文件目錄,這一過程要先關閉mysql數據庫,重命名或者刪除原數據文件目錄都可以,再創建一個新的數據文件目錄,將備份數據復制到新的數據文件目錄下,賦權,修改權限,啟動數據庫
[root@001 ~]# service mysqld stop
[root@001 ~]# mv /data/mysqldata/ /tmp/mysqldata/
[root@001 ~]# mkdir /data/mysqldata
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --use-memory=4G --apply-log /data/2017-08-05_11-44-06/ #第1步是apply-log,為了加快速度,一般建議設置--use-memory,這個步驟完成之后,目錄就准備就緒
170805 16:49:32 completed OK! #成功
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/2017-08-05_11-33-06/ #第2步是copy-back,即把備份文件拷貝至原數據目錄下。注意:innobackupex 增量備份僅針對InnoDB這類支持事務的引擎,對於MyISAM等引擎,則仍然是全備
170805 16:49:32 completed OK! #成功

可以看見已經成功恢復,修改數據目錄權限,啟動mysql,效驗數據是否正常,查看yayun庫下面的t1表中的數據。
[root@001 ~]# chown -R mysql.mysql /data/
[root@001 ~]# service mysqld start
數據已經成功恢復
增量備份
在進行增量備份時,首先要進行一次全量備份,第一次增量備份是基於全備的,之后的增量備份是基於上一次的增量備份,以此類推。
全備份放在/data/backup/full,增量備份放在/data/backup/incremental
先來全量備份
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/data/mysqldata/mysqld.sock /data/backup/full
為了測試效果,我們在t1表中插入數據
mysql> insert into t1 values(null);

再來增量備份
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/data/mysqldata/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/full/2017-08-05_11-59-39/ --parallel=2

我們看看增量備份的大小以及文件內容

在test種創建t2,並插入數據然后創建增量備份2
mysql> use test;
mysql> create table t2(name varchar(20));
mysql> insert into t2 values('will');
mysql> insert into t2 values('tom');
mysql> insert into t2 values('jim');

創建增量備份2(這次是基於上次的增量備份)
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/data/mysqldata/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/incremental/ 2017-08-05_12-13-27/ --parallel=2
增量備份恢復
增量備份的恢復大體為3個步驟
*恢復完全備份
*恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最后一次增量備份去掉--redo-only參數)
*對整體的完全備份進行恢復,回滾那些未提交的數據
恢復完全備份(注意這里一定要加--redo-only參數,該參數的意思是只應用xtrabackup日志中已提交的事務數據,不回滾還未提交的數據)
[root@001 ~]# innobackupex --apply-log --redo-only /data/backup/full/2017-08-05_11-59-39
將增量備份1應用到完全備份
[root@001 ~]# innobackupex --apply-log --redo-only /data/backup/full/2017-08-05_11-59-39 --incremental-dir=/data/backup/incremental/2017-08-05_12-04-59
將增量備份2應用到完全備份(注意恢復最后一個增量備份時需要去掉--redo-only參數,回滾xtrabackup日志中那些還未提交的數據)
[root@001 ~]# innobackupex --apply-log --redo-only /data/backup/full/2017-08-05_11-59-39 --incremental-dir=/data/backup/incremental/2017-08-05_12-13-27
把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的數據:
[root@001 ~]# innobackupex --apply-log /data/backup/full/2014-04-07_23-37-20/
把恢復完的備份復制到數據庫目錄文件中,賦權,然后啟動mysql數據庫,檢測數據正確性
[root@001 ~]# service mysqld start
[root@001 ~]# mv /data/mysqldata/ /tmp/mysqldata/
[root@001 ~]# mkdir /data/mysqldata
[root@001 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/backup/full/2017-08-05_11-59-39/
[root@001 ~]# chown -R mysql.mysql /data/
克隆slave
在日常工作中,我們有時候需要在線添加從庫,比如線上有一主一從兩個數據庫,但是由於業務的需要,一台從庫的讀取無法滿足現在的需求,這樣就需要我們在線添加從庫,由於出於安全考慮,我們通常需要在從庫上進行在線克隆slave。
克隆slave時,常用參數--slave-info和--safe-slave-backup。
--slave-info會將master的binlog文件名和偏移量位置保存到xtrabackup_slave_info文件中
--safe-slave-backup會暫停slave的SQL線程直到沒有打開的臨時表的時候開始備份。備份結束后SQL線程會自動啟動,這樣操作的目的主要是確保一致性的復制狀態。
下面的例子,將介紹一主一從情況下在線搭建新的從庫,環境如下:
master 192.168.0.10 #主庫
slave 192.168.0.20 #從庫
newslave 192.168.0.100 # 新的從庫
在上述示例中,newslave即為要新搭建的從庫。在老的從庫上面進行備份:
[root@MySQL-02 ~]# innobackupex --user=root --password=12345 --socket=/tmp/mysqld.sock --defaults-file=/etc/my.cnf --slave-info --safe-slave-backup --no-timestamp /data/cloneslave
innobackupex: Backup created in directory '/data/cloneslave'
innobackupex: MySQL binlog position: filename 'mysql-bin.000022', position 107
innobackupex: MySQL slave binlog position: master host '192.168.0.10', filename 'mysql-bin.000006', position 732
140413 23:25:13 innobackupex: completed OK!
這里的/data/cloneslave 目錄要不存在,如果存在是會報錯的。
查看目錄下生成的文件:
[root@MySQL-02 ~]# ll /data/cloneslave/
total 26668
-rw-r--r-- 1 root root 261 Apr 13 23:24 backup-my.cnf
-rw-r--r-- 1 root root 27262976 Apr 13 23:24 ibdata1
drwxr-xr-x 2 root root 4096 Apr 13 23:25 mysql
drwxr-xr-x 2 root root 4096 Apr 13 23:25 performance_schema
drwxr-xr-x 2 root root 4096 Apr 13 23:25 sakila
drwxr-xr-x 2 root root 4096 Apr 13 23:25 world_innodb
-rw-r--r-- 1 root root 13 Apr 13 23:25 xtrabackup_binary
-rw-r--r-- 1 root root 23 Apr 13 23:25 xtrabackup_binlog_info
-rw-r--r-- 1 root root 79 Apr 13 23:25 xtrabackup_checkpoints
-rw-r--r-- 1 root root 2560 Apr 13 23:25 xtrabackup_logfile
-rw-r--r-- 1 root root 72 Apr 13 23:25 xtrabackup_slave_info
drwxr-xr-x 2 root root 4096 Apr 13 23:25 yayun
[root@MySQL-02 ~]#
查看xtrabackup_slave_info文件內容,這個內容就是為搭建從庫時需要change master to的參數:
[root@MySQL-02 ~]# cat /data/cloneslave/xtrabackup_slave_info
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=732
[root@MySQL-02 ~]#
在老的slave服務器上進行還原,即192.168.0.20
[root@MySQL-02 ~]# innobackupex --apply-log --redo-only /data/cloneslave/
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
140413 23:30:37 InnoDB: Starting shutdown...
140413 23:30:37 InnoDB: Shutdown completed; log sequence number 12981048
140413 23:30:37 innobackupex: completed OK!
[root@MySQL-02 ~]#
將還原的文件復制到新的從庫newslave,即192.168.0.100
[root@MySQL-02 data]# rsync -avprP -e ssh /data/cloneslave/ 192.168.0.100:/data/mysql/
在主庫master上添加對新從庫newslave的授權:
mysql> grant replication slave on *.* to 'repl'@'192.168.0.100' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
mysql>
拷貝老的從庫的配置文件到新的從庫newslave,並且修改server-id參數,修改完畢后,啟動新的從庫;
[root@MySQL-02 data]# scp /etc/my.cnf 192.168.0.100:/etc/
root@192.168.0.100's password:
my.cnf 100% 4881 4.8KB/s 00:00
[root@MySQL-02 data]#
[root@newslave mysql]# egrep 'log-slave|^server-id|skip_slave' /etc/my.cnf
server-id = 3
skip_slave_start
log-slave-updates=1
[root@newslave mysql]#
[root@newslave mysql]# chown -R mysql.mysql .
[root@newslave mysql]# /etc/init.d/mysqld restart
Shutting down MySQL. [ OK ]
Starting MySQL.. [ OK ]
[root@newslave mysql]#
查找老的從庫備份后生成的xtrabackup_slave_info文件,提取其中的master_log_file和master_log_pos信息,然后在新的從庫上進行change master to操作:
在新的從庫上進行同步:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.10',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=732;
Query OK, 0 rows affected (0.09 sec)
mysql>
啟動io線程和sql線程,並觀察復制是否正常:
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.10
Master_User: repl
Master_Port: 3306
Connect_Retry: 2
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 1309
Relay_Log_File: MySQL-02-relay-bin.000002
Relay_Log_Pos: 830
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: yayun.%
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1309
Relay_Log_Space: 989
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
mysql>
查看主庫,發現已經有兩個線程(Binlog Dump)
mysql> show processlist\G
*************************** 1. row ***************************
Id: 8
User: slave
Host: 192.168.0.20:44251
db: NULL
Command: Binlog Dump
Time: 1088
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 9
User: root
Host: localhost
db: yayun
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 3. row ***************************
Id: 10
User: repl
Host: 192.168.0.100:45844
db: NULL
Command: Binlog Dump
Time: 124
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
3 rows in set (0.00 sec)
mysql>
正常工作,到此在線克隆slave就結束啦。
參考自:https://yq.aliyun.com/articles/45746
