一、安装Percona
1.1. 安装依赖包
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1.2. Percona官网下载软件并安装
二、Percona介绍
Percona是物理备份工具,拷贝数据文件,比mysqldump快很多;原生态支持全备和增量。
2.1 InooDB表:
热备份:业务正常发生的时候可以进行备份,影响比较小的备份方式;
1. checkpoint:将已提交数据页刷新到磁盘,会记录一个LSN号;
2. 拷贝InnoDB表相关的文件(ibdata,frm,ibd);
3. 如果备份期间产生的新的数据变化,redo也会备份走。
2.2 非InnoDB表:
温备份:锁表备份(全局锁)。
1. FTWRL,触发全局锁;
2. 拷贝非InnoDB的数据;
3. 解锁;
2.3 统计LSN号码,写入到专用文件,记录二进制日志位置进行保存。
2.4 所有的备份文件统一存放在一个目录下
三、 XBK应用-全备和恢复
3.1 前提
1. 数据库必须启动;
2. 能连上数据库;
配置文件my.cnf中指定socket,需要在配置文件中加入,
[client]
socket=/tmp/mysql.sock
3. 默认会读取[mysqld]----> datadir= xxxxxxx
4. 服务器端工具,不能远程备份;
3.2 使用-全备
innobackupex --user=root --password=123 /data/xbk
innobackupex --user=root --password=123 --no-timestamp /data/xbk/full_'date +%F' ##控制输出文件夹名字
3.3 备份结果查看
需要着重关注:
xtrabackup_binlog_info(记录备份后binlog为位置信息,方便做binglog截取位置点),
- xtrabackup_checkpoints(备份过程中的LSN记录,方便做增量备份)
3.4 全备恢复演练
1. 破坏
pkill mysqld
rm -rf /data/3306/* #破坏
2. 备份处理:
prepare(在恢复之前都要进行prepare, 原理:redo前滚,undo后滚,模仿CSR(自动故障恢复)过程,)
innobakupex --apply-log /data/xbk/full_2021-03-31/
3. 数据恢复:
cp -a /data/xbk/full_2021-03-31/* /data/3306/
4. 授权:
chown -R mysql.mysql /data/*
5. 启动数据库
/etc/init.d/mysqld start
四、 xbk的增量备份
4.1 说明:
备份时:
1. 增量必须依赖全备;
2. 每次增量都要参照上次备份的LSN号码,在此基础上变化的数据页,备份走;并且,会将备份过程中产生新的变化的redo一并备份走。
恢复时:
需要将所有需要的INC备份(增量备份)按顺序合并到全备中,并且需要将每个备份进行prepare
4.2 增量备份演练
1. 创建环境
create database xbk charset unf8mb4;
use xbk;
create table t1(id int);
insert into t1 values(1),(2),(3);
commit;
4.2 模拟周日全备
innobackupex --user=root -password=123 --no-timestamp /data/backup/full
4.3 模拟周一的数据变化
use xbk;
create table t2(id int);
insert into t2 values(1),(2),(3);
commit;
4.4 模拟周一晚上增量备份inc1
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/full /data/back/inc1
参数:
--incremental: 增量备份开关;
--incremental-basedir: 增量备份基目录,上次备份的路径;
4.5 模拟周二的数据变化
use xbk;
create table t3(id, int);
insert into t3 values(1),(2),(3);
commit;
4.6 模拟周二晚上增量备份inc2
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/inc1 /data/back/inc2
4.7 模拟周三数据变化
use xbk;
create table t4(id, int);
insert into t4 values(1),(2),(3);
commit;
4.8 周三10点搞破坏
pkill mysqld
rm -rf /data/3306/*
4.9 确认备份完整性
检查checkpoint,增量备份的from_lsn= 基文件的last_lsn- 9(内置原因);则说明是完整的。
4.10 xbk full+ inc+ binlog备份恢复
a. 恢复思路
1.合并整理(prepare)所有inc备份到全备,
2.恢复数据,启动数据库,
3.截取而二进制日志,
4.恢复日志;
b. 恢复过程
1. 合并,prepare所有inc备份到全备
innobackupex --apply-log --redo-only /data/backup/full #基础全备的整理,
2. 合并,prepare inc2到full
innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full
3. 合并,prepare inc2到full,检查checkpoint是否对的上
innobackupex --apply-log --incremental-dir=/data/backup/inc2 /data/backup/full
4. 整体再整理一次(prepare)
innobackupex --apply-log /data/backup/full
5. 恢复1:修改mysql 数据路径 -修复数据至周二晚上
chown -R mysql.mysql /data/backup/full #
更改配置文件my.cnf中data路径 datadir=/data/backup/full
重启数据库
6. 截取日志恢复
起点:/data/backup/inc2/xtrabackup_binlog_info
终点:文件末尾
mysqlbinlog --skip-gtids --start-position=1629 /data/binlog/mysql-bin.000020 /data/binlog/mysql-bin.000021> tmp/bin.sql
- 恢复截取文件
mysql -uroot -p
set sql_log_bin=0;
source tmp/bin.sql;
set sql_log_bin=1;