第1章 物理備份 xtrabackup (xbp)
percona公司研發(fā)的MySQL物理備份工具 使用perl語言開發(fā)的
公司官網(wǎng): https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
優(yōu)點: 備份快 原生態(tài)支持增量備份 但是要注意版本 (8.0數(shù)據(jù)庫不支持 需要xbp8.0版本)
1.1 安裝
下載依賴包:
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
下載主體
yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
rpm包官網(wǎng)下載
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
數(shù)據(jù)包下載地址:
安裝后查看是否成功
innobackupex --version
innobackupex version 2.4.4 Linux (x86_64) (revision id: df58cf2)#版本信息
1.2 xbk備份原理
1. 自動判斷引擎類型
InnoDB
Non-InnoDB(不是innodb)
2. InnoDB表 實現(xiàn)熱備功能備份
開始備份innoDB時,自動允許進程ckpt,將當(dāng)前已經(jīng)提交的事務(wù)數(shù)據(jù),刷寫到磁盤,會生成一個CKPT的LSN號.(當(dāng)前臟頁錄入過redo的數(shù)據(jù) 刷寫到磁盤數(shù)據(jù)庫中)
拷貝innodb引擎數(shù)據(jù)庫相關(guān)文件 redo(只會拷貝備份期間產(chǎn)生的新的redo),拷貝完成后會產(chǎn)生一個LAST_LSN (備份時刻redo的記錄)
3. 非InnoDB 表
自動開啟 FTWRL (flush tables with read lock) 全局鎖
拷貝數(shù)據(jù)文件.完成后自動解鎖.
1.3 xbp也會鎖表
因為這個特性的原因 xbp在備份系統(tǒng)表的時候 (默認(rèn)系統(tǒng)表不是innodb引擎) 會短暫的鎖表
1.4 增量備份
會基于上一次備份的last_LSN 檢查數(shù)據(jù)頁的變化 然后備份走
1.5 innobackuoex 備份工具應(yīng)用
- 編寫mysql配置文件 添加一個[clinet] 加入sock文件
vim /etc/my.cnf
[clinet]
socket=/tmp/mysql.sock
因為默認(rèn)xbp會讀取MySQL的配置文件 但是不會識別指定sock文件選項 所以我們要手動指定一下
5.6 xbk 在innodb表備份恢復(fù)的流程
- xbk備份執(zhí)行的瞬間,立即觸發(fā)ckpt,已提交的數(shù)據(jù)臟頁,從內(nèi)存刷寫到磁盤,并記錄此時的LSN號
- 備份時响蕴,拷貝磁盤數(shù)據(jù)頁,并且記錄備份過程中產(chǎn)生的redo和undo一起拷貝走,也就是checkpoint LSN之后的日志
- 在恢復(fù)之前目木,模擬Innodb“自動故障恢復(fù)”的過程换途,將redo(前滾)與undo(回滾)進行應(yīng)用
- 恢復(fù)過程是cp 備份到原來數(shù)據(jù)目錄下
第2章 全備
XBP主要就是一個命令 實現(xiàn)了備份功能
innobackupex --user=root --password=123 /data/backup
#將所有數(shù)據(jù)備份到指定目錄
生產(chǎn)中備份姿勢
innobackupex --user=root --password=123 --no-timestamp /data/backup/full_
date +%F``
--no-timestamp
取消系統(tǒng)自定義備份名
2.1 全備后DBP添加文件介紹
xtrabackup_binlog_info
# 備份時刻binlog日志的節(jié)點
xtrabackup_checkpoints
# 記錄備份信息
xtrabackup_info
# 關(guān)于備份的其他信息
xtrabackup_logfile
# 備份期間產(chǎn)生的的redo信息
[root@db full_2019-11-20]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0 # 0代表所有變化都備份了
to_lsn = 166188857 # ckpt LSN (臟頁刷寫磁盤后編碼LSN號)
last_lsn = 166188866 # last LSN ( redo編碼 5.7開始 二者相差9)
compact = 0
recover_binlog_info = 0
2.2 增量備份
(1)增量備份的方式,是基于上一次備份進行增量军拟。
(2)增量備份無法單獨恢復(fù)。必須基于全備進行恢復(fù)誓禁。
(3)恢復(fù)時 需要所有增量必須要按順序合并到全備中。
推薦每周全備一次 每天增備
增量備份時會根據(jù)頭一天的xtrabackup_checkpoints文件中的last_lsn數(shù)值進行備份
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/full_2019-11-20 /data/backup/inc1
--no-timestamp
自定義備份文件名
--incremental
--incremental-basedir=
指定根據(jù)那個備份 進行增備
第3章 恢復(fù)數(shù)據(jù)
模擬項 模擬周三drop了個庫 進行數(shù)據(jù)恢復(fù)
(1)刪掉原來備份
略.
(2)全備(周日)
[root@db01 backup]# innobackupex --user=root --password --no-timestamp /backup/full >&/tmp/xbk_full.log
(3)模擬周一數(shù)據(jù)變化
db01 [(none)]>create database cs charset utf8;
db01 [(none)]>use cs
db01 [cs]>create table t1 (id int);
db01 [cs]>insert into t1 values(1),(2),(3);
db01 [cs]>commit;
(4)第一次增量備份(周一)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1 &>/tmp/inc1.log
(5)模擬周二數(shù)據(jù)
db01 [cs]>create table t2 (id int);
db01 [cs]>insert into t2 values(1),(2),(3);
db01 [cs]>commit;
(6)周二增量
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2 &>/tmp/inc2.log
(7)模擬周三數(shù)據(jù)變化
db01 [cs]>create table t3 (id int);
db01 [cs]>insert into t3 values(1),(2),(3);
db01 [cs]>commit;
db01 [cs]>drop database cs;
恢復(fù)思路:
掛出維護頁摹恰,停止當(dāng)天的自動備份腳本
檢查備份:周日full+周一inc1+周二inc2辫继,周三的完整二進制日志
3. 進行備份整理(細(xì)節(jié)),截取關(guān)鍵的二進制日志(從備份——誤刪除之前)
4. 測試庫進行備份恢復(fù)及日志恢復(fù)
5. 應(yīng)用進行測試無誤俗慈,開啟業(yè)務(wù)
6. 此次工作的總結(jié)
恢復(fù)流程
- 檢查備份
1afe8136-601d-11e9-9022-000c2928f5dd:7-9
GTID
- 備份整理(apply-log)+合并備份(full+inc1+inc2)
(1) 全備的整理
[root@db01 one]#innobackupex --apply-log --redo-only /data/backup/full
(2) 合并inc1到full中
[root@db01 one]#innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full
(3) 合并inc2到full中
[root@db01 one]# innobackupex --apply-log --incremental-dir=/data/backup/inc2 /data/backup/full
(4) 最后一次整理全備
[root@db01 backup]#innobackupex --apply-log /data/backup/full
- 截取周二 23:00 到drop 之前的 binlog
[root@db01 inc2]# mysqlbinlog --skip-gtids --include-gtids='1afe8136-601d-11e9-9022-000c2928f5dd:7-9' /data/binlog/mysql-bin.000009 >/data/backup/binlog.sql
- 進行恢復(fù)
[root@db01 backup]# mkdir /data/mysql/data2 -p
[root@db01 full]# cp -a * /data/mysql/data2
[root@db01 backup]#chown -R mysql. /data/*
[root@db01 backup]#systemctl stop mysqld
vim /etc/my.cnf
datadir=/data/mysql/data2
systemctl start mysqld
mysql中書寫
Master [(none)]>set sql_log_bin=0;
Master [(none)]>source /data/backup/binlog.sql
Master [(none)]>set sql_log_bin=1;