xtrabackup 實現MySQL數據庫備份

mysqldump備份方式是採用邏輯備份,其最大的缺陷就是備份和恢復速度都慢,對於一個小於50G的 數據庫而言,這個速度仍是能接受的,但若是數據庫很是大,那再使用mysqldump備份就不太適合了。 這時就 須要一種好用又高效的工具,xtrabackup就是其中一款,號稱免費版的InnoDB HotBackup。 Xtrabackup實現是 物理備份,並且是物理熱備 目前主流的有兩個工具能夠實現物理熱備:ibbackup和xtrabackup;ibbackup是商 業軟件,須要受權,很是昂貴。而xtrabackup功能比ibbackup還要強大,但倒是開源的。所以咱們這裏就來介 紹xtrabackup的使用。 Xtrabackup提供了兩種命令行工具: xtrabackup:專用於備份InnoDB和XtraDB引擎的 數據; innobackupex:這是一個perl腳本,在執行過程當中會調用xtrabackup命令,這樣用該命令便可以實現備 份InnoDB,也能夠備份MyISAM引擎的對象。 mysql

Xtrabackup是由percona提供的mysql數據庫備份工具,特色:
(1)備份過程快速、可靠;
(2)備份過程不會打斷 正在執行的事務;
(3)可以基於壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快。sql

一、安裝xtrabackup數據庫

[root@mysql ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz               # 下載xtrabackup
#解壓並進入目錄複製
[root@mysql ~]# tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz 
[root@mysql ~]# cd percona-xtrabackup-2.4.4-Linux-x86_64/
[root@mysql percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
[root@mysql percona-xtrabackup-2.4.4-Linux-x86_64]# ls bin/

Xtrabackup中主要包含兩個工具: xtrabackup:是用於熱備份innodb, xtradb表中數據的工具,支持在線熱備 份,能夠在不加鎖的狀況下備份Innodb數據表,不過此工具不能操做Myisam引擎表; innobackupex:是將 xtrabackup進行封裝的perl腳本,能同時處理Innodb和Myisam,但在處理Myisam時須要加一個讀鎖。 因爲操 做Myisam時須要加讀鎖,這會堵塞線上服務的寫操做,而Innodb沒有這樣的限制,因此數據庫中Innodb表類 型所佔的比例越大,則越有利。 服務器

#安裝相關插件
[root@mysql ~]# yum -y install  perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perlTermReadKey.x86_64 perl-Digest-MD5
#下載percona-toolkit並安裝
[root@mysql /]# wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/perconatoolkit-2.2.19-1.noarch.rpm 
[root@mysql ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm

就這樣,xtrabackup工具就安裝好了,接下來就能夠開始備份了
方案1、xtrabackup徹底備份+binlog增量備份
一、建立備份目錄app

[root@mysql ~]# mkdir -p /opt/mysqlbackup/{full,inc}
#full:全備存放的目錄;inc:增量備份存放的目錄

1)、徹底備份ide

[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /opt/mysqlbackup/full/

注: --defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg,若是指定則必須是第一個參數。 /path/to/BACKUP-DIR/指定備份所存放的目標目錄,備份過程會建立一個以當時備份時間命名的目錄存放備份 文件。
出現以下圖所示,則表示備份成功:
xtrabackup 實現MySQL數據庫備份
在備份的同時,備份數據會在備份目錄下建立一個以當前日期時間爲名字的目錄存放備份文件:工具

[root@mysql ~]# cd /opt/mysqlbackup/full/
[root@mysql full]# ll
total 0
drwxr-x--- 6 root root 206 Jun 15 22:35 2020-06-15_22-35-02
[root@mysql full]# ll 2020-06-15_22-35-02/
total 12336
-rw-r----- 1 root root      425 Jun 15 22:35 backup-my.cnf
-rw-r----- 1 root root      338 Jun 15 22:35 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 15 22:35 ibdata1
drwxr-x--- 2 root root     4096 Jun 15 22:35 mysql
drwxr-x--- 2 root root     8192 Jun 15 22:35 performance_schema
drwxr-x--- 2 root root     8192 Jun 15 22:35 sys
drwxr-x--- 2 root root       50 Jun 15 22:35 test1
-rw-r----- 1 root root      113 Jun 15 22:35 xtrabackup_checkpoints
-rw-r----- 1 root root      459 Jun 15 22:35 xtrabackup_info
-rw-r----- 1 root root     2560 Jun 15 22:35 xtrabackup_logfile

各文件說明:
(1)xtrabackup_checkpoints ——備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared 狀態)和LSN(日誌序列號)範圍信息; 每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是 整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事 件的位置。
(3)xtrabackup_binlog_pos_innodb ——二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前 position。
(4)xtrabackup_binary ——備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf ——備份命令用到的配置選項信息; 測試

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

注意:相關選項說明: 其中,--user指定鏈接數據庫的用戶名,--password指定鏈接數據庫的密碼,-defaults-file指定數據庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份 的數據庫,這裏指定的數據庫只對MyISAM表有效,對於InnoDB 數據來講都是全備(全部數據庫中的 InnoDB數據都進行了備份,不是隻備份指定的數據庫,恢復時也同樣);/opt/mysqlbackup/full是備份 文件的存放位置。命令行

注:備份數據庫的用戶須要具備相應權限,若是要使用一個最小權限的用戶進行備份,則可基於以下 命令建立此類用戶:

#建立用戶
mysql> create user 'bkpuser'@'localhost' identified by '123456';
#回收用戶全部權限
mysql> revoke all privileges,grant option from 'bkpuser'@'localhost';
#受權有關備份的相應權限
mysql> grant reload,lock tables,replication client, process on *.* to 'bkpuser'@'localhost'; 
mysql> flush privileges;

至此全備徹底成功,而後向mysql某個庫插入幾條數據,而後進行增量備份 對徹底備份的後數據庫更改進行二 進制日誌增量備份:

#查看徹底備份時binlog日誌位置
[root@mysql full]# cat /opt/mysqlbackup/full/2020-06-15_22-49-41/xtrabackup_binlog_info 
bin_log.000001  154
#模擬數據庫修改:
mysql>select * from tb1;
+------+----------+--------+
|   id | name     | back   |
|------+----------+--------|
|    1 | zhangsan | w      |
|    2 | lisi     | q      |
|    3 | wangwu   | e      |
|    4 | zhaoliu  | r      |
|    5 | liuyi    | t      |
|    6 | didi     | y      |
+------+----------+--------+
6 rows in set
mysql>insert into tb1 values(7,'tom','u');
mysql>insert into tb1 values(8,'tom2','i');
[root@mysql data]# pwd
/usr/local/mysql/data
[root@mysql data]# mysqlbinlog -v bin_log.000001       # 能夠經過mysqlbinlog二進制日誌號
[root@mysql data]# cat /opt/mysqlbackup/full/2020-06-15_22-49-41/xtrabackup_binlog_info 
bin_log.000001  154            # 後面這個154 就是開始
#因爲我全備以後還作了一些操做,因此我這裏並非154
#增量備份二進制文件
[root@mysql data]# mysqlbinlog --start-position=219 /usr/local/mysql/data/bin_log.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
[root@mysql data]# ls /opt/mysqlbackup/inc/
2020-06-15.sql

二、還原數據庫
#模擬數據庫損壞, 我這裏直接使用刪除數據目錄文件來模擬損壞。

[root@mysql ~]# rm -rf /usr/local/mysql/data/*

還原徹底備份:
準備(prepare)一個徹底備份 通常狀況下,在備份完成後,數據尚且不能用於恢復操做, 由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文 件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得 數據文件處於一致性狀態。 在準備(prepare)過程結束後,InnoDB表數據已經前滾到整個備份結束的點,而 不是回滾到xtrabackup剛開始時的點。

[root@mysql ~]# innobackupex --apply-log /opt/mysqlbackup/full/2020-06-15_22-49-41/

注:/opt/mysqlbackup/full/2020-06-15_22-49-41/ 備份文件所在目錄名稱 若是執行正確,其最後輸出的幾行信 息一般以下:
xtrabackup 實現MySQL數據庫備份
在實現「準備」的過程當中,innobackupex一般還可使用--use-memory選項來指定其可使用的內存的大小,默 認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度。 innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器 DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
(2)還原數據庫語法:

[root@mysql ~]# innobackupex --copy-back /opt/mysqlbackup/full/2020-06-15_22-49-41/

這裏的--copy-back指明是進行數據恢復。數據恢復完成以後,須要修改相關文件的權限mysql數據庫才能正常 啓動。
若是執行正確,其輸出信息的最後幾行一般以下:
xtrabackup 實現MySQL數據庫備份
請確保如上信息的最行一行出現「completed OK!」。 修改還原後的數據目錄權限:

[root@mysql ~]# ll /usr/local/mysql/data/
total 122916
-rw-r----- 1 root root      357 Jun 15 23:36 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 15 23:36 ibdata1
-rw-r----- 1 root root 50331648 Jun 15 23:36 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 15 23:36 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 15 23:36 ibtmp1
drwxr-x--- 2 root root     4096 Jun 15 23:36 mysql
drwxr-x--- 2 root root     8192 Jun 15 23:36 performance_schema
drwxr-x--- 2 root root     8192 Jun 15 23:36 sys
drwxr-x--- 2 root root       50 Jun 15 23:36 test1
-rw-r----- 1 root root      504 Jun 15 23:36 xtrabackup_info

當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在 啓動mysqld以前還須要事先修改數據文件的屬主和屬組。如:

[root@mysql ~]# chown -R mysql:mysql /usr/local/mysql/data/
[root@mysql ~]# ll /usr/local/mysql/data/
total 122916
-rw-r----- 1 mysql mysql      357 Jun 15 23:36 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jun 15 23:36 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jun 15 23:36 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jun 15 23:36 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 15 23:36 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Jun 15 23:36 mysql
drwxr-x--- 2 mysql mysql     8192 Jun 15 23:36 performance_schema
drwxr-x--- 2 mysql mysql     8192 Jun 15 23:36 sys
drwxr-x--- 2 mysql mysql       50 Jun 15 23:36 test1
-rw-r----- 1 mysql mysql      504 Jun 15 23:36 xtrabackup_info
[root@mysql ~]# systemctl restart mysqld
#驗證還原後的數據
mysql> select * from tb1;
+------+----------+------+
| id   | name     | back |
+------+----------+------+
|    1 | zhangsan | w    |
|    2 | lisi     | q    |
|    3 | wangwu   | e    |
|    4 | zhaoliu  | r    |
|    5 | liuyi    | t    |
|    6 | didi     | y    |
+------+----------+------+
6 rows in set (0.00 sec)

(3)還原增量備份:
爲了防止還原時產生大量的二進制日誌,在還原時可臨時關閉二進制日誌後再還原:

mysql> set sql_log_bin=0;
mysql> source /opt/mysqlbackup/inc/2020-06-15.sql

也能夠在命令行執行以下語句

mysql –uroot –p  < /opt/mysqlbackup/inc/2020-06-15.sql
mysqlbinlog /opt/mysqlbackup/inc/2020-06-15.sql | mysql –uroot -p

從新啓動二進制日誌並驗證還原數據:

mysql> set sql_log_bin=1;
mysql> select * from tb1;       # 能夠看到兩個tom已經回來了
+------+----------+------+
| id   | name     | back |
+------+----------+------+
|    1 | zhangsan | w    |
|    2 | lisi     | q    |
|    3 | wangwu   | e    |
|    4 | zhaoliu  | r    |
|    5 | liuyi    | t    |
|    6 | didi     | y    |
|    7 | tom      | u    |
|    8 | tom2     | i    |
+------+----------+------+
8 rows in set (0.00 sec)

方案2、xtrabackup徹底備份+xtrabacup增量備份
前面咱們進行增量備份時,使用的仍是老方法:備份二進制日誌。其實xtrabackup還支持進行增量備份。 先介 紹下xtrabackup的備份原理 在InnoDB內部會維護一個redo日誌文件,咱們也能夠叫作事務日誌文件 (transaction log,事務日誌)。事務日誌會存儲每個InnoDB表數據的記錄修改。當InnoDB啓動時,InnoDB 會檢查數據文件和事務日誌,並執行兩個步驟:它應用已經提交的事務日誌到數據文件,並將修改過但沒有提 交的數據進行回滾操做。 xtrabackup在啓動時會記住log sequence number(LSN),而且複製全部的數據文 件。複製過程須要一些時間,因此這期間若是數據文件有改動,那麼將會使數據庫處於一個不一樣的時間點。這 時,xtrabackup會運行一個後臺進程,用於監視事務日誌,並從事務日誌複製最新的修改。xtrabackup必須持 續的作這個操做,是由於事務日誌是會輪轉重複的寫入,而且事務日誌能夠被重用。因此xtrabackup自啓動開 始,就不停的將事務日誌中每一個數據文件的修改都記錄下來。這就是xtrabackup的備份過程 因此每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加。 這正是InnoDB表能夠進行增量備份的基礎。 xtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的 data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。 當InnoDB啓動的時候,它會先去檢查data file和transaction log,而且會作二步操做:
1.It applies committed transaction logentries to the data files
2.it performs an undo operation on anytransactions that modified data but did not commit. 因此在prepare過程當中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。

準備測試環境,建立一個測試數據庫,並建立一張表輸入幾行數據

mysql> create database test2;
mysql> use test2;
mysql> create table tab1(id int,name varchar(20));
mysql> insert into tab1 values(1,'tom1');
mysql> insert into tab1 values(2,'tom2');

一、 xtrabacup進行備份 執行徹底備份:

[root@mysql ~]# xtrabackup --default-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/full/full_incre_$(date+%Y-%m-%d_%H:%M:%S)
#查看徹底備份文件
[root@mysql ~]# ls /opt/mysqlbackup/full/ -l
total 0
drwxr-x--- 6 root root 288 Jun 15 23:33 2020-06-15_22-49-41
drwxr-x--- 7 root root 249 Jun 15 23:56 full_incre_
#xtrabackup進行增量備份 先錄入些數據,實現第一次增量數據:
mysql> use test2;
mysql> insert into tab1 values(3,'tom3');
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date  +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_

部分顯示信息以下圖所示:
xtrabackup 實現MySQL數據庫備份

#查看增量備份文件:
[root@mysql ~]# ls -l /opt/mysqlbackup/inc/
total 8
drwxr-x--- 7 root root  275 Jun 16 00:04 incre_20200616_000403
#這裏的增量備份其實只針對的是InnoDB,對於MyISAM來講,仍是完整備份。 
#向表中再插入幾行數據,繼續第二次增量備份 
mysql> insert into tab1 values (4,'tom4');
mysql> commit;
#接下來進行第二次增量備份
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password="123" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date  +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200616_000403

以下圖所示:
xtrabackup 實現MySQL數據庫備份
注:第二次增量備份--incremental-basedir指向上一次增量備份文件的位置。
注:第二次增量備份--incremental-basedir指向上一次增量備份文件的位置。
注:第二次增量備份--incremental-basedir指向上一次增量備份文件的位置。

#查看增量備份文件
[root@mysql ~]# ls -l /opt/mysqlbackup/inc/
total 8
drwxr-x--- 7 root root  275 Jun 16 00:04 incre_20200616_000403
drwxr-x--- 7 root root  275 Jun 16 00:08 incre_20200616_000826

二、 xtrabacup進行增量恢復 爲了驗證比對,先刪除兩個增量備份前表裏面的數據

mysql> delete from tab1 where id=3;

完整備份恢復: 在進行恢復前,若是完整備份在遠程主機上,首先將完整備份複製到本地主機上,若是是tar 包,則須要先解包,解包命令爲:tar –izxf xxx.tar,這裏必須使用-i參數(忽略存檔中的 0 字節塊(一般意味着 文件結束))。
開始全備份恢復 :

[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/

恢復成功如圖所示:
xtrabackup 實現MySQL數據庫備份
恢復到第一次增量的時刻 增量備份恢復的步驟和完整備份恢復的步驟基本一致,只是應用日誌的過程稍有不 同。增量備份恢復時,是先將全部的增量備份挨個應用到完整備份的數據文件中,而後再將完整備份中的數據 恢復到數據庫中。

[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_000403/

如圖所示:
xtrabackup 實現MySQL數據庫備份
恢復到第二次增量備份前面:

[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_000826/

如圖所示:
xtrabackup 實現MySQL數據庫備份
恢復整個庫 :

[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123" --target-dir=/opt/mysqlbackup/full/full_incre_/

如圖所示:
xtrabackup 實現MySQL數據庫備份
中止mysql數據庫:

[root@mysql ~]# systemctl stop mysqld

開始rsync同步數據文件:

[root@mysql full_incre_]# rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /usr/local/mysql/data/
#當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在 啓動mysqld以前還須要事先修改數據文件的屬主和屬組。 
[root@mysql data]# ll
total 122972
-rw-r----- 1 mysql mysql       56 Jun 15 23:38 auto.cnf
-rw-r----- 1 root  root       425 Jun 15 23:56 backup-my.cnf
-rw-r----- 1 mysql mysql      177 Jun 15 23:38 bin_log.000001
-rw-r----- 1 mysql mysql      177 Jun 15 23:40 bin_log.000002
-rw-r----- 1 mysql mysql     1847 Jun 16 00:42 bin_log.000003
-rw-r----- 1 mysql mysql      111 Jun 15 23:41 bin_log.index
-rw-r----- 1 root  root       298 Jun 15 23:56 ib_buffer_pool
-rw-r----- 1 root  root  12582912 Jun 16 00:19 ibdata1
-rw-r----- 1 root  root  50331648 Jun 16 00:19 ib_logfile0
-rw-r----- 1 root  root  50331648 Jun 16 00:19 ib_logfile1
-rw-r----- 1 root  root  12582912 Jun 16 00:19 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Jun 16 00:18 mysql
-rw-r----- 1 mysql mysql    22460 Jun 16 00:42 mysql.err
drwxr-x--- 2 mysql mysql     8192 Jun 16 00:18 performance_schema
drwxr-x--- 2 mysql mysql     8192 Jun 16 00:18 sys
drwxr-x--- 2 mysql mysql       50 Jun 16 00:18 test1
drwxr-x--- 2 mysql mysql       52 Jun 16 00:18 test2
-rw-r----- 1 root  root        20 Jun 16 00:18 xtrabackup_binlog_info
-rw-r--r-- 1 root  root        20 Jun 16 00:19 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root  root       628 Jun 16 00:18 xtrabackup_info
[root@mysql data]# chown -R mysql:mysql /usr/local/mysql/data/
[root@mysql data]# systemctl restart mysqld
mysql> select * from tab1;
+------+------+
| id   | name |
+------+------+
|    1 | tom1 |
|    2 | tom2 |
|    3 | tom3 |
|    4 | tom4 |
+------+------+

方案3、innobackupex全庫備份+innobackupex增量備份
測試環境準備建立一個測試數據庫,並建立一張表輸入幾行數據

mysql> create database test3;
mysql> use test3;
mysql> create table tab1(id int,name varchar(20));
mysql> insert into tab1 values(1,'lisi1');
mysql> insert into tab1 values(2,'lisi2');

一、innobackupex先作徹底備份

[root@mysql data]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123" /opt/mysqlbackup/full/full_incre_$(date +%Y%m%d_%H%M%S) --no-timestamp
#查看徹底備份文件
[root@mysql data]# ls /opt/mysqlbackup/full/
full_incre_20200616_005156

作第一次增量備份 先錄入增量數據

mysql> insert into tab1 values(3,'lisi3');
#進行加強備份
[root@mysql data]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_20200616_005156 --user=root --password="123" --no-timestamp
#查看增量備份文件
[root@mysql data]# ll /opt/mysqlbackup/inc/
drwxr-x--- 8 root root  288 Jun 16 00:56 incre_20200616_005610

基於全備和第一個增量備份來作第二次增量備份 先錄入增量數據錄入

mysql> insert into tab1 values(4,'lisi4');
[root@mysql inc]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200616_005610/ --user=root --password="123" --no-timestamp
#查看增量備份文件
[root@mysql inc]# ll
total 8
drwxr-x--- 8 root root  288 Jun 16 00:56 incre_20200616_005610
drwxr-x--- 8 root root  288 Jun 16 01:03 incre_20200616_010301
#**先刪除兩次增量數據,用來查看驗證恢復結果**
mysql> delete from tab1 ;
#開始作恢復,恢復全備份
[root@mysql inc]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/
#--redo-only 用於準備增量備分內容把數據合併到全備份目錄,配合incremental-dir 增量備份目錄使用
#基於全備份進行第一次增量備份的恢復 
[root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_005610/
#基於全備份和第一次增量備份,恢復第二次增量備份 
[root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_20200616_005156/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200616_010301/
#中止數據庫
[root@mysql ~]# systemctl stop mysqld
#清空數據目錄下全部文件

[root@mysql ~]# mkdir -p /tmp/mysqldatabak
[root@mysql ~]# mv /usr/local/mysql/data/* /tmp/mysqldatabak/
#將恢復好的數據按照配置文件的需求拷貝到相應目錄
[root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123" --copy-back /opt/mysqlbackup/full/full_incre_20200616_005156/
#當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在 啓動mysqld以前還須要事先修改數據文件的屬主和屬組
[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# ll
total 12328
-rw-r----- 1 root root      298 Jun 16 01:12 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 16 01:12 ibdata1
drwxr-x--- 2 root root     4096 Jun 16 01:12 mysql
drwxr-x--- 2 root root     8192 Jun 16 01:12 performance_schema
drwxr-x--- 2 root root     8192 Jun 16 01:12 sys
drwxr-x--- 2 root root       50 Jun 16 01:12 test1
drwxr-x--- 2 root root       52 Jun 16 01:12 test2
drwxr-x--- 2 root root       52 Jun 16 01:12 test3
-rw-r----- 1 root root       20 Jun 16 01:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      598 Jun 16 01:12 xtrabackup_info
[root@mysql data]# chown -R mysql:mysql /usr/local/mysql/data/
#啓動服務
[root@mysql data]# systemctl restart mysqld

登陸mysql界面,查看數據是否已經恢復

mysql> select * from tab1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | lisi1 |
|    2 | lisi2 |
|    3 | lisi3 |
|    4 | lisi4 |
+------+-------+
4 rows in set (0.00 sec)

Xtrabackup的「流」及「備份壓縮」功能 Xtrabackup對備份的數據文件支持「流」功能,便可以將備份的數據經過 STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅須要使用-stream選項便可。

# innobackupex --user=root --password="123" --stream=tar /opt/mysqlbackup/full/ | gzip >/opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz
相關文章
相關標籤/搜索