一、 xtrabackup安裝
根據實際情況選擇相應版本的xtrabackup,mysql是5.7.xx對應的xtrabackup版本爲2.4.*,mysql8.0以上的對應的xtrabackup版本爲8.x.x
#安裝依賴包:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
#下載軟件並安裝
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
二 、介紹
Percona XtraBackup工具提供了一種在系統運行時執行MySQL數據熱備份的方法。2.4版本開始支持非innodb表的備份
工作原理
InnoDB表:
對於innodb不鎖表,拷貝數據頁,最終以數據文件的方式保存下來,把一部分redo和undo一併備走,屬於熱備方式。
大概的工作流程如下
- xbk備份執行的瞬間,立即觸發checkpiont,已提交的數據髒頁,從內存刷寫到磁盤,並記錄此時的LSN號
- 拷貝innoDB表相關的文件(ibdata,frm,ibd…)
- 記錄備份過程中產生的redo和undo一起拷貝走,也就是checkpoint LSN之後的日誌
- 再次統計LSN
- 記錄二進制日誌位置
非InnoDB表:
進行溫備份,即鎖表備份
三、xtrabackup 備份使用方法
Usage: [xtrabackup [--defaults-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]
1、全備
使用xtrabackup
命令進行全量熱備份示例:
[root@db01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=123 --port=3306 --backup --target-dir=/data/backup
--defaults-file
:指定MySQL的配置文件所在路徑,因爲XtraBackup需要通過讀取配置文件才能知道數據目錄在哪--host
:指定MySQL服務的ip地址,因爲全量備份時需要備份表結構,所以得連接到MySQL加讀鎖--user
:指定使用哪個MySQL用戶進行備份--password
:MySQL用戶的密碼--port
:指定MySQL服務的端口號--target-dir=name
:備份文件存儲的目錄--backup
:進行備份並將其放入備份文件存儲的目錄
2、增量備份
[root@db01 ~]# xtrabackup --backup --target-dir=/data/backupv1 --incremental-basedir=/data/backup --user=root --password=123 --socket=/tmp/mysql.sock
--incremental-basedir
:該選項告訴xtrabackup創建增量備份的參照點。
該版本下,to_lsn和last_lsn差9可以理解爲在備份過程中數據沒有發生變化,由上圖可以看到lsn號是連續的
四、備份還原實戰
1、數據環境準備
#第一天對數據進行全備
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/full
#模擬第一天的數據變化
mysql> use test;
mysql> create table t1(id int);
mysql> insert into t1 values (1),(2),(3);
#第二天對數據進行增量備份
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/inc1 --incremental-basedir=/data/full
#模擬第二天數據變化
mysql> create table t2(id int);
mysql> insert into t2 values (1),(3),(5);
#第三天對數據進行增量備份
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
#對數據庫搞破壞
[root@db01 ~]# rm -rf /data/mysql/*
2、準備備份
全備的整理:
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/full
--prepare
prepare a backup for starting mysql server on the backup 爲啓動備份上的mysql服務器準備一個備份。--apply-log-only
此項較爲重要。主要應用與增備,在常規備份中,執行兩種操作以使數據庫保持一致:從redo log對數據文件redo已提交的事務,回滾undo的事務。在準備備份時,必須跳過未提交事務的回滾,因爲在備份時未提交的事務可能正在進行中,它們很可能在下一次增量備份中提交。您應該使用--apply-log-only
選項來防止回滾階段。
將第一次增量備份應用到完全備份:
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/full --incremental-dir=/data/inc1
準備第二次增量備份是一個類似的過程:
最後一次準備備份過程需要將回滾的內容也準備進去,所以不需要加--apply-log-only
參數
[root@db01 ~]# xtrabackup --prepare --target-dir=/data/full --incremental-dir=/data/inc2
3、進行恢復
[root@db01 ~]# cp -a /data/full/* /data/mysql/
[root@db01 ~]# chown -R mysql.mysql /data/mysql/