1、XtraBackup相關概念介紹:html
一、XtraBackup簡介:node
熱備中兩種主要的方式就是邏輯備份和物理備份,物理備份要比邏輯備份在速度上更快一些,由於它是在底層複製數據文件的,比起一條條SQL語句插入要快不少。物理備份的表明就是XtraBackup,它是Percona公司的開源項目,據官方介紹它是世界上惟一一款開源的可以對InnoDB和XtraDB表進行熱備的工具。XtraBackup支持對InnoDB和XtraDB表進行熱備、全量備份、增量備份和差別備份。XtraBackup支持對MyISAM表進行溫備,而且不會對MyISAM表進行增量備份,每次備份MyISAM表都是全量備份,即便名義上是增量備份,但實際上仍然是全量備份。若是數據庫中既有MyISAM表又有InnoDB表時,想要總體的全部數據都一致,則只能以MyISAM表的一致性時間點做爲最終備份的一致性時間點,因此XtraBackup在備份時,會先備份InnoDB表,備份完InnoDB表後,再備份MyISAM表,而且在備份MyISAM表時施加讀鎖。mysql
二、InnoDB表邏輯存儲結構:算法
InnoDB表邏輯單元從大到小分別爲:表空間(Tablespace)、段(Segment)、區(Extent)、頁(Page)、行(Row),每一個大的邏輯單元中都包含了N個小的邏輯單元。此處只需關心Extent邏輯單元和Page邏輯單元便可,Extent區域中的每一個小方塊(Page)看成XtraBackup須要備份的數據塊,由於數據存放於行中,行存在於Page中,因此備份對應的Page,便可備份出對應的數據。使用XtraBackup鏈接到MySQL服務端時,XtraBackup會讀取InnoDB中的Page進行備份。InnoDB的邏輯存儲結構以下圖所示:sql
三、XtraBackup備份原理:數據庫
備份開始時,XtraBackup會同時運行兩個線程,一個線程負責備份InnoDB中的Page,另外一個線程負責備份InnoDB的事務日誌(redo log),事務日誌都會被XtraBackup記錄到本身的日誌文件中,備份結束後,會獲得兩份文件,一份是不可用的備份文件,另外一份是備份時的事務日誌。備份文件之因此不可用,是由於有一部分不肯定的數據可能在事務日誌中,並且熱備過程當中數據也可能發生改變,須要經過這兩份文件,獲得一份可用的備份文件。這個過程在XtraBackup中稱爲prepare準備,即對於寫入事務日誌文件中,但尚未同步到datafile中的已提交事務進行replay重放,對於未提交的事務進行rollback回滾,prepare操做保證了備份數據的一致性,沒有通過prepare的備份數據是不可用的。若是存在增量備份,XtraBackup會將全部增量都合併到以前的全量上,而後使用最後的全量數據進行恢復。在合併數據的過程當中,上一次未提交的事務有可能在下次的增量備份中已經提交,因此若是存在多個增量備份,在進行prepare時,只須要將已經提交的事務同步到數據文件中便可,未提交的事務不用進行回滾,由於在增量備份中,這些事務可能已經提交了,只須要在最後一份增量數據進行prepare時,將對應的未提交事務回滾便可。vim
四、XtraBackup實現增量備份的判斷依據:安全
每一個Page都有本身的LSN(Log Sequence Number,日誌序列號),LSN是一個全局遞增的號碼,每次對Page中的記錄進行修改時,都會有對應的LSN,每一個Page中的數據被更改時,都會在這個Page中記錄下本次的LSN。若是這個Page中記錄的LSN越大,就證實這個Page中的數據越新(最近被修改),而XtraBackup就是經過LSN實現對InnoDB表的增量備份。每次備份開始時,XtraBackup會記錄下當前備份到的LSN,當下次進行增量備份時,XtraBackup就只會拷貝出LSN大於上次記錄的Page,那些LSN小於上次記錄的Page則會被略過。若是Page中的LSN小於上次備份時記錄的LSN,則證實這個Page在上次備份後並無被修改過。若是Page中的LSN大於上次備份時記錄的LSN,則證實這個Page在上次備份後已經被修改了,只要備份出這些Page,便可實現增量備份的目的。服務器
五、XtraBackup工具:session
XtraBackup主要有兩個工具:xtrabackup和innobackupex。xtrabackup只能備份InnoDB和XtraDB兩種數據表,不能備份MyISAM數據表;innobackupex封裝了xtrabackup,不只能備份InnoDB和XtraDB兩種數據表,同時還能夠備份MyISAM數據表。在新版本中xtrabackup實現了innobackupex的功能。
備註:
(1)本文安裝的是2.4的版本,innobackupex的功能已經徹底整合進xtrabackup中,爲了兼容以前用戶的使用習慣,官方保留了innobackupex,它做爲一個軟連接,指向xtrabackup
(2)innobackupex在8.0的版本中已被棄用,只保留xtrabackup
(3)Percona XtraBackup 8.0的版本不支持備份恢復MySQL 5.7
六、XtraBackup備份後生成的文件:
(1)backup-my.cnf:備份用到的配置選項信息
(2)xtrabackup_binlog_info:記錄當前正在使用的二進制日誌文件及備份這一刻爲止二進制日誌事件的位置
(3)xtrabackup_binlog_pos_innodb:記錄當前正在使用的二進制日誌文件及備份這一刻爲止用於InnoDB和XtraDB表的二進制日誌事件的位置
(4)xtrabackup_checkpoints:記錄備份類型(如:全量或增量)、備份起始和結束時的LSN等信息
(5)xtrabackup_info:記錄備份時使用的工具名稱(如:innobackupex)、工具選項、工具版本、MySQL版本、備份開始和結束時間、當前正在使用的二進制日誌文件及備份這一刻爲止二進制日誌事件的位置、備份起始和結束時的LSN等信息
(6)xtrabackup_logfile:記錄備份過程當中的日誌
備註:若是都是InnoDB存儲引擎的表,用於時間點恢復的二進制日誌事件的位置能夠以xtrabackup_binlog_pos_innodb文件中記錄的爲準;若是是InnoDB和其它存儲引擎混合操做的表,建議以xtrabackup_binlog_info爲準。
七、相關網址:
(1)官網:https://www.percona.com/software/mysql-database/percona-xtrabackup
(2)用戶手冊:https://www.percona.com/doc/percona-xtrabackup/2.4/manual.html
2、準備工做(兩個節點都須要執行以下操做):
一、演示環境:
IP |
操做系統 |
主機名 |
角色 |
數據庫版本 |
安裝方式 |
192.168.1.145 |
CentOS 7.6 x86_64 |
node1 |
primary |
5.7.26-log MySQL Community Server |
rpm |
192.168.1.146 |
CentOS 7.6 x86_64 |
node2 |
backup |
5.7.26-log MySQL Community Server |
rpm |
二、關閉SELinux和firewalld
三、配置epel源
四、配置節點時間同步
五、配置主機名
六、配置/etc/hosts文件:
# vim /etc/hosts
192.168.1.145 node1
192.168.1.146 node2
七、建立備份數據存放目錄:# mkdir -pv /data/mysqlbak
八、建立binlog存放目錄:# mkdir -pv /data/mysqlbinlog
九、下載MySQL 5.7軟件包,https://dev.mysql.com/downloads/mysql/5.7.html#downloads
十、安裝Percona XtraBackup 2.4:
# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# yum list | grep percona
# yum -y install percona-xtrabackup-24
# innobackupex -v
3、安裝配置MySQL(如未特殊說明,兩個節點都須要執行以下操做):
一、卸載CentOS 7.6自帶的MariaDB:
# rpm -qa | grep -i mariadb --> mariadb-libs-5.5.60-1.el7_5.x86_64
# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
二、若是以前安裝過MySQL,先卸載:# rpm -qa | grep -i mysql
三、若是存在/etc/my.cnf配置文件,先刪除:# rm -rf /etc/my.cnf
四、將軟件包上傳至兩個節點的/tmp目錄下:
mysql-community-client-5.7.26-1.el7.x86_64.rpm
mysql-community-libs-5.7.26-1.el7.x86_64.rpm
mysql-community-common-5.7.26-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm
mysql-community-devel-5.7.26-1.el7.x86_64.rpm
mysql-community-server-5.7.26-1.el7.x86_64.rpm
五、安裝MySQL軟件包:# yum -y localinstall *.rpm
六、初始化MySQL:# mysqld --initialize --user=mysql --datadir=/var/lib/mysql
備註:初始化以前確保/var/lib/mysql目錄爲空
七、修改/etc/my.cnf配置文件:
# mv /etc/my.cnf /etc/my.cnf.bak
# vim /etc/my.cnf
[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysqld.log
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=mysql-slow.log
symbolic-links=0
explicit_defaults_for_timestamp=1
server_id=1
sync_binlog=1
innodb_flush_log_at_trx_commit=1
log_bin=/data/mysqlbinlog/mysql-bin
log_bin_index=/data/mysqlbinlog/mysql-bin.index
binlog_format=mixed
備註:
(1)backup節點的server_id=2
(2)innodb_file_per_table=1:每表使用單獨的表空間,備份單個數據庫或表時該選項必需要啓用
(3)此處數據文件和binlog分開存放
八、修改/data/mysqlbinlog目錄的屬主和屬組:# chown -R mysql.mysql /data/mysqlbinlog
九、啓動MySQL服務:
# systemctl start mysqld.service
# systemctl status mysqld.service
# tail -100 /var/log/mysqld.log
# ss -tunlp | grep 3306
# systemctl enable mysqld.service
十、查看root@localhost用戶的初始密碼:# grep password /var/log/mysqld.log
十一、配置MySQL安全向導:# mysql_secure_installation
十二、primary節點建立測試數據:
# mysql -uroot -p
mysql> create database db1;
mysql> create table db1.tb1(id int unsigned auto_increment primary key not null,name varchar(20) not null);
mysql> desc db1.tb1;
mysql> insert into db1.tb1(name) values('zhangsan'),('lisi');
mysql> select * from db1.tb1;
mysql> create database db2;
mysql> create table db2.tb2(name varchar(20) not null,age int not null);
mysql> desc db2.tb2;
mysql> insert into db2.tb2 values('mary',25),('jack',30);
mysql> select * from db2.tb2;
1三、primary節點建立具備備份權限的用戶:
mysql> create user 'bkuser'@'192.168.1.%' identified by '123456';
mysql> revoke all on *.* from 'bkuser'@'192.168.1.%';
mysql> grant reload,lock tables,replication client,process on *.* to 'bkuser'@'192.168.1.%';
mysql> flush privileges;
備註:上述給出的權限爲備份的最小權限
4、primary節點innobackupex全量備份+binlog增量備份全部數據庫,並在backup節點恢復:
一、primary節點全量備份全部數據庫,壓縮後發送至backup節點:
# ssh-keygen -t rsa -P ""
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.146
# ssh root@192.168.1.146 'hostname'
# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --stream=tar /tmp | ssh root@192.168.1.146 "gzip - > /data/mysqlbak/`date +%F_%T`_full.tar.gz"
備註:
(1)經常使用選項說明:
a、--defaults-file:指定備份時使用的配置文件路徑,該選項必須緊跟innobackupex,不然會提示「xtrabackup: Error: --defaults-file must be specified first on the command line」錯誤信息
b、--no-timestamp:禁止innobackupex自動建立一個以時間命名的目錄
c、-H:指定MySQL服務器IP
d、-P:指定MySQL服務器端口
e、-u:指定備份時使用的用戶
f、-p:指定該用戶對應的密碼
g、--stream:流式化備份,備份時使用的數據流格式,有兩個可用值,tar或xbstream,此處將備份的數據經過STDOUT標準輸出傳輸給tar進行歸檔後再使用gzip進行壓縮,併發送至backup節點,而不是默認的直接保存至primary節點的某個備份目錄中,能夠將gzip換成其它經常使用的壓縮軟件進行壓縮,--stream選項後的路徑/tmp不可省,可是其路徑能夠爲任意路徑,與數據備份後所在的路徑沒有任何關係
h、查看更多選項,可以使用命令:# innobackupex --help
(2)將數據流備份至遠程目標主機有一個前提條件,就是遠程目標主機須要對當前主機SSH信任,即當前主機經過SSH鏈接到遠程目標主機時不須要輸入對應的密碼
(3)只有在備份結束後提示「completed OK!」,才說明全量備份成功
二、backup節點解壓備份數據,並查看primary節點全量備份時binlog事件位置:
# cd /data/mysqlbak
# mkdir -pv 2019-08-22_17:58:34_full
# tar -ixf 2019-08-22_17\:58\:34_full.tar.gz --force-local -C 2019-08-22_17:58:34_full
# cd 2019-08-22_17\:58\:34_full
# cat xtrabackup_binlog_info
三、primary節點在db1.tb1和db2.tb2中插入新數據:
mysql> insert into db1.tb1(name) values('wangwu'),('zhaoliu');
mysql> insert into db2.tb2 values('keyso',35),('marion',40);
mysql> flush logs;
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
備註:此處滾動二進制日誌是爲了以後演示使用mysqlbinlog經過多個二進制日誌進行時間點恢復
四、primary節點使用mysqlbinlog導出全量備份以後全部數據庫執行過的SQL語句:
# cd /data/mysqlbinlog
# mysqlbinlog -uroot -p -j 3251 mysql-bin.000001 mysql-bin.000002 > /data/mysqlbak/binlog.sql
備註:須要列出全部binlog
五、primary節點將binlog.sql發送至backup節點:
# scp /data/mysqlbak/binlog.sql root@192.168.1.146:/data/mysqlbak/
六、backup節點準備全量備份:
# innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB /data/mysqlbak/2019-08-22_17:58:34_full
備註:
(1)經常使用選項說明:
a、--apply-log:備份後的數據文件不能直接用於恢復操做,須要經過回滾未提交的事務及同步已提交的事務至數據文件,即應用位於同一目錄中的xtrabackup_logfile的事務日誌,並建立新的事務日誌
b、--use-memory:若是主機有必定的空閒內存,可讓XtraBackup使用指定大小的內存加速完成準備工做,默認狀況下會使用100MB的內存用以準備工做
(2)只有在準備工做結束後提示「completed OK!」,才說明準備工做完成
七、backup節點中止MySQL服務:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown
八、backup節點清空數據目錄:# mv /var/lib/mysql /tmp/mysql_bak # mkdir -pv /var/lib/mysql
九、backup節點將備份數據拷貝至數據目錄:
# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysqlbak/2019-08-22_17:58:34_full
備註:
(1)/var/lib/mysql數據目錄必須爲空
(2)在拷貝結束後提示「completed OK!」,才說明拷貝成功
十、backup節點修改數據目錄的屬主和屬組:# chown -R mysql.mysql /var/lib/mysql
十一、backup節點啓動MySQL服務:
# systemctl start mysqld.service # systemctl status mysqld.service # ss -tunlp | grep 3306
十二、backup節點查看db1.tb1和db2.tb2中的數據:
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
1三、backup節點進行時間點恢復:
mysql> show variables like 'sql_log_bin';
mysql> set sql_log_bin=0;
mysql> show variables like 'sql_log_bin';
mysql> show binary logs;
mysql> show master status;
mysql> source /data/mysqlbak/binlog.sql
備註:或使用命令# mysql -uroot -p < /data/mysqlbak/binlog.sql
mysql> show master status;
mysql> set @@session.sql_log_bin=1;
mysql> show variables like 'sql_log_bin';
1四、backup節點查看db1.tb1和db2.tb2中的數據:
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
5、primary節點innobackupex備份單個數據庫db2,並在本地恢復:
一、在db2.tb2中插入新數據:
mysql> insert into db2.tb2 values('tom',45),('mike',50);
mysql> select * from db2.tb2;
二、建立備份數據存放目錄:# mkdir -pv /data/mysqlbak/db2
三、備份單個數據庫db2:
# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --compress --compress-threads=4 --databases=db2 /data/mysqlbak/db2/`date +%F_%T`_db2
備註:
(1)經常使用選項說明:
a、--parallel:指定並行備份的線程數,用以加速備份,默認狀況下只開啓一個線程進行備份,當備份使用的數據流爲tar格式時,沒有任何做用
b、--compress:對備份數據進行壓縮,除了xtrabackup_checkpoints文件之外,其它全部備份數據都會被壓縮,包括事務日誌和元數據文件,使用的壓縮算法爲quicklz,壓縮出的文件的後綴名爲.qp
c、--compress-threads:指定壓縮線程的數量,加快壓縮速度
d、--databases:指定備份的數據庫名稱,若是須要備份多個數據庫,數據庫名稱之間以空格隔開,--databases="db1 db2"
(2)只有在備份結束後提示「completed OK!」,才說明備份成功
四、安裝qpress壓縮軟件:# yum -y install qpress
五、解壓備份數據:# innobackupex --parallel=4 --decompress /data/mysqlbak/db2/2019-08-22_18:43:46_db2
備註:只有在解壓結束後提示「completed OK!」,才說明解壓成功
六、準備備份:
# innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB --export /data/mysqlbak/db2/2019-08-22_18:43:46_db2
備註:
(1)--export:導出單獨的表以後再導入其它MySQL中
(2)上述命令執行過程當中,innobackupex命令會從InnoDB數據字典中移除缺失的表,同時也會爲備份文件中存在的表建立.exp文件的相關信息
(3)只有在準備工做結束後提示「completed OK!」,才說明準備工做完成
七、中止MySQL服務:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown
八、模擬db2數據庫故障:# mv /var/lib/mysql/db2 /tmp/db2_bak
九、將備份數據拷貝至數據目錄:# cp -r /data/mysqlbak/db2/2019-08-22_18\:43\:46_db2/* /var/lib/mysql/
十、修改數據目錄的屬主和屬組:# chown -R mysql.mysql /var/lib/mysql
十一、啓動MySQL服務:
# systemctl start mysqld.service # systemctl status mysqld.service # ss -tunlp | grep 3306
十二、查看db2.tb2中的數據:
mysql> select * from db2.tb2;
6、primary節點innobackupex全量備份+innobackupex增量備份+binlog增量備份全部數據庫,並在backup節點恢復:
一、primary節點全量備份全部數據庫:
# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 /data/mysqlbak/`date +%F_%T`_full
備註:
(1)只有在備份結束後提示「completed OK!」,才說明全量備份成功
(2)查看這次全量備份目錄下的xtrabackup_checkpoints文件,能夠看到備份類型爲full-backuped全量備份,起始LSN爲0,結束LSN爲2539919
二、primary節點在db1.tb1中插入新數據:
mysql> insert into db1.tb1(name) values('laozhang'),('laoli');
mysql> select * from db1.tb1;
三、primary節點第一次增量備份:
# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --incremental /data/mysqlbak/`date +%F_%T`_incr1 --incremental-basedir=/data/mysqlbak/2019-08-22_23:47:35_full
備註:
(1)經常使用選項說明:
a、--incremental:說明本次備份是一個增量備份,備份至2019-08-22_23:55:01_incr1目錄下
b、--incremental-basedir:指定該路徑爲全量備份的目錄,說明這次增量備份是在全量備份的基礎上實現的
(2)只有在備份結束後提示「completed OK!」,才說明增量備份成功
(3)查看這次增量備份目錄下的xtrabackup_checkpoints文件,能夠看到備份類型爲incremental增量備份,起始LSN爲2539919,結束LSN爲2543392,這次增量備份的起始LSN是以前全量備份結束時的LSN
四、primary節點在db2.tb2中插入新數據:
mysql> insert into db2.tb2 values('keyso',35),('marion',40);
mysql> select * from db2.tb2;
五、primary節點第二次增量備份:
# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --incremental /data/mysqlbak/`date +%F_%T`_incr2 --incremental-basedir=/data/mysqlbak/2019-08-22_23:55:01_incr1
備註:
(1)第二次增量備份是在第一次增量備份的基礎上實現的,--incremental-basedir選項指定的是第一次增量備份的目錄
(2)若是--incremental-basedir選項指定的是全量備份的目錄,說明這次備份是差別備份
(3)只有在備份結束後提示「completed OK!」,才說明增量備份成功
(4)查看這次增量備份目錄下的xtrabackup_checkpoints文件,能夠看到備份類型爲incremental增量備份,起始LSN爲2543392,結束LSN爲2547556,這次增量備份的起始LSN是上一次增量備份結束時的LSN
六、primary節點查看第二次增量備份時binlog事件的位置:
# cat /data/mysqlbak/2019-08-23_00\:03\:29_incr2/xtrabackup_binlog_info
七、primary節點在db1.tb1和db2.tb2中刪除數據:
mysql> delete from db1.tb1 where name='laozhang';
mysql> delete from db2.tb2 where name='mary';
mysql> flush logs;
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
備註:此處滾動二進制日誌是爲了以後演示使用mysqlbinlog經過多個二進制日誌進行時間點恢復
八、primary節點使用mysqlbinlog導出第二次增量備份以後全部數據庫執行過的SQL語句:
# cd /data/mysqlbinlog
# ls
# mysqlbinlog -uroot -p -j 3867 mysql-bin.000001 mysql-bin.000002 > /data/mysqlbak/binlog.sql
備註:須要列出全部binlog
九、primary節點將全部備份數據及binlog.sql發送至backup節點:
# cd /data/mysqlbak
# ls
# scp -r ./2019-08-22_23\:47\:35_full root@192.168.1.146:/data/mysqlbak/
# scp -r ./2019-08-22_23\:55\:01_incr1 root@192.168.1.146:/data/mysqlbak/
# scp -r ./2019-08-23_00\:03\:29_incr2 root@192.168.1.146:/data/mysqlbak/
# scp binlog.sql root@192.168.1.146:/data/mysqlbak/
備註:使用scp命令時,若是目錄名或文件名中帶有:冒號的,須要在目錄名或文件名以前加上./才能正常發送
十、backup節點準備全量備份:
# ls /data/mysqlbak
# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full
備註:
(1)--redo-only:在進行準備(應用日誌)工做時,只會重作已提交但未應用的事務,而不會回滾未提交的事務,把準備好的增量備份(但不包括最後一個)合併到對應的全量備份中
(2)只有在準備工做結束後提示「completed OK!」,才說明準備工做完成
(3)查看全量備份目錄下的xtrabackup_checkpoints文件,會發現全量備份的備份類型已變爲log-applied
十一、backup節點準備第一次增量備份:
# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full --incremental-dir=/data/mysqlbak/2019-08-22_23:55:01_incr1
備註:
(1)--incremental-dir:指定第一次增量備份的路徑爲/data/mysqlbak/2019-08-22_23:55:01_incr1
(2)只有在準備工做結束後提示「completed OK!」,才說明準備工做完成
(3)查看全量備份目錄下的xtrabackup_checkpoints文件,全量備份的備份類型爲log-applied,且結束LSN是第一次增量備份結束時的LSN,說明已將第一次增量備份文件合併至全量備份文件中
十二、backup節點準備第二次增量備份:
# innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full --incremental-dir=/data/mysqlbak/2019-08-23_00:03:29_incr2
備註:
(1)因爲這是最後一份增量備份數據,因此不用添加--redo-only選項,事務日誌須要應用,該提交的提交,該回滾的回滾
(2)只有在準備工做結束後提示「completed OK!」,才說明準備工做完成
(3)查看全量備份目錄下的xtrabackup_checkpoints文件,會發現全量備份的備份類型已變爲full-prepared,且結束LSN是第二次增量備份結束時的LSN,說明全部準備工做都已完成,全部增量備份文件都已合併至全量備份文件中
1三、backup節點中止MySQL服務:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown
1四、backup節點清空數據目錄:# mv /var/lib/mysql /tmp/mysql_bak # mkdir -pv /var/lib/mysql
1五、backup節點將備份數據拷貝至數據目錄:
# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysqlbak/2019-08-22_23:47:35_full
備註:
(1)/var/lib/mysql數據目錄必須爲空
(2)在拷貝結束後提示「completed OK!」,才說明拷貝成功
1六、backup節點修改數據目錄的屬主和屬組:# chown -R mysql.mysql /var/lib/mysql
1七、backup節點啓動MySQL服務:
# systemctl start mysqld.service # systemctl status mysqld.service # ss -tunlp | grep 3306
1八、backup節點查看db1.tb1和db2.tb2中的數據:
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
1九、backup節點進行時間點恢復:
mysql> show variables like 'sql_log_bin';
mysql> set sql_log_bin=0;
mysql> show variables like 'sql_log_bin';
mysql> show binary logs;
mysql> show master status;
mysql> source /data/mysqlbak/binlog.sql
備註:或使用命令# mysql -uroot -p < /data/mysqlbak/binlog.sql
mysql> show master status;
mysql> set @@session.sql_log_bin=1;
mysql> show variables like 'sql_log_bin';
20、backup節點查看db1.tb1和db2.tb2中的數據:
mysql> select * from db1.tb1;
mysql> select * from db2.tb2;
備註:上述三個備份恢復案例互不相關
特別注意:
Ø 備份時將配置文件/etc/my.cnf一塊兒備份
Ø 二進制日誌也應該週期性地進行備份
Ø 將數據和備份分開存放,建議不在同一設備、同一主機、同一機房、同一地域
Ø 每次災難恢復後都應該當即作一次全量備份
Ø 備份完成後的數據應該週期性地作恢復測試