Percona Xtrabackup
安装
安装依赖包:
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
下载软件并安装
centos7:
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
centos7:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
yum-y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
介绍:支持全量备份和增量备份
物理备份工具,拷贝数据文件。200M/s
InnoDB表:
热备份:业务正常发生的时候,可以进行备份,影响较小的备份。
1.checkpoint,将已提交的数据页刷新到磁盘。记录一个LSN页。
3.infomation_schema.xxx
4.拷贝InnoDB表相关的文件(ibdata1,frm,ibd...)
5.BInlog只读,FTWRL(gobal read lock)
6.备份期间产生新的数据变化的redo也会被备份走
非InnoDB表:
温备份:锁表备份
1.FTWRL,触发全局锁
2.拷贝非InnoDB的数据
3.解锁
再次统计LSN
记录二进制日志位置记录下来。
将所有的备份文件统一存放在一个目录下。
XBK应用
innobackupex ------>xtrabackup 软链接
前提:
1)数据库启动
2)能连上数据库
用户授权:
[client]
socket=/tmp/mysql.sock
3)默认会读取[mysqld] --->datadir=xxxx
4)服务器端工具
全备
命令:innobackupex --user=root --password=luobiao123 --no-timestamp /data/xbk/full_`date +%F`
--user 用户名
--password 密码
--no-timestamp 不自动产生文件名,自己指定
备份目录:
xtrabackup_binlog_info 记录备份后binlog的position号,GTID号,做恢复使用
xtrabackup_checkpoints 记录过程中的LSN号等,增量备份使用
xtrabackup_info 前面所有的信息
xtrabackup_logfile redo日志
全备的恢复演练
pkill mysqld 杀服务端进程
rm -rf /data/3306/* 把数据文件删除完
备份处理:prepare
redo前滚,undo回滚,模仿csr过程.
innobackupex --apply-log /data/xbk/full_2020-03-29/
进行恢复:
1)进行拷贝:[root@later03 ~]# cp -a /data/xbk/full_2020-03-29/* /data/3306/
2)将用户以及用户组改为mysql :[root@later03 3306]# chown -R mysql.mysql /data/*
3) 启动mysql:[root@later03 3306]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
xbk的增量备份恢复
说明:
备份时:
1.前提:增量必须依赖与全备。
每次增量都是参照上次备份的LSN号码
(xtrabackup_checkpoints), 在此基础变化的数据页,
备份走,会讲备份过程中产生的新的变化redo一并备份走。
恢复时:
需要将所有需要的inc备份,按顺序合并到全备中。
进行prepare.
进行恢复操作。
增量备份实践:
1)基础环境模拟
2)模拟周日全备
命令:innobackupex --user=root --password=luobiao123 --no-timestamp /data/xbk/full_`date +%F`
3)模拟周一数据变化
4)模拟周一晚上增量备份inc1
[root@later03 xbk]# innobackupex --user=root --password=luobiao123 --no-timestamp --incremental --incremental-basedir=/data/xbk/full_2020-03-30 /data/xbk/inc1_`date +%F`
说明:
--incremental 增量备份的开关
--incremental-basedir=/data/xbk/full_2020-03-30 增量备份的基目录
5)模拟周二数据变化
6)模拟周二晚上的增量备份
innobackupex --user=root --password=luobiao123 --no-timestamp --incremental --incremental-basedir=/data/xbk/inc1_2020-03-30/ /data/xbk/inc2_`date +%F`
7)模拟周三的数据变化
8)周三晚上10点发生故障:
pkill mysqld
rm -rf /data/3306/*
9)确认备份完整性
1.查看日志是否comple
2.检查具体的数据目录文件
to_lsn = 609053615
last_lsn = 609053624
to 和 last差9个lsn说明备份期间没有数据变化.
5.7中不论备份期间数据是否发生变化,当前备份的from_lsn号
和上一次备份的last_lsn号总是相差9个,如果不是,那么备份就会
出现问题。
实战演练 :
xbk 全备 + inc 增倍 + binlog 备份
1)恢复思路
1.合并,prepare,所有的inc到全备
2.恢复数据启动数据库。
3.截取二进制日志,binlog
4.恢复日志
2)恢复
#1.合并,prepare,所有的inc到全备
#基础全备整理
1.进行第一次增量的合并
这里我出了点问题,把命令写错了。所以发现增量日志的第一个被损坏了,不能操作了,
所以这里提示,操作的时候,应该给所有的日志在此备份,防止在操作的
过程中,发生损坏,那就gg了。
这里我先进行全备恢复,然后在模拟操作,在进行.
这里有犯了一个错误 rm -rf /data/3306/ 直接把3306也删除了,卧槽,所以我们需要
这样写rm -rf /data/3306/ * 或者把稳的时候,进行 cd /data/3306/ rm -rf * ,最好备份
1)进行周一的备份和全备合并以及prepare
innobackupex --apply-log --redo-only --incremental-dir=/data/xbk/inc1_2020-03-30 /data/xbk/full_2020-03-30
--redo-only 只进行redo前滚,不进行回滚。
2) 进行周二的备份和合并后的全备进行合并以及prepare
说明:这里周二的是最后一次增倍,所以不需要加redo-only
innobackupex --apply-log --incremental-dir=/data/xbk/inc2_2020-03-30 /data/xbk/full_2020-03-30
3) 查看合并后的文件的check_point和最后一个checkpoint
4)在次进行增倍后的全备份文件的prepare
innobackupex --apply-log /data/xbk/full_2020-03-30
5)进行恢复
1)如果数据量较大,不想拷贝,可以直接将备份目录作为数据的datadir
vi /etc/my.cnf
datadir=/data/xbk/full_2020-03-30
chown -R mysql.mysql /data/xbk/full_2020-03-30
2)进行拷贝 这里我还是进行拷贝
cp -a /data/xbk/full_2020-03-30/* /data/3306
chown -R mysql.mysql /data/*
3)启动
/etc/init.d/mysqld start
6)进行gtid日志恢复
1)起点
寻找起点:
[root@later03 inc2_2020-03-30]# cat /data/xbk/inc2_2020-03-30/xtrabackup_binlog_info
mysql-bin.000020 1078 03901c2b-723d-11ea-b0de-00163e0477d5:1-4,
7acb1b1a-6660-11ea-b89b-00163e0477d5:1-19,
b02ac1f3-7228-11ea-9b66-00163e0477d5:1-11
position 号为1078 ,通过查看,只有mysql-bin.000020 这一个文件需要截取.
2)终点 :终点为文件末尾,可以省略。
截取binlog文件:
[root@later03 inc2_2020-03-30]# mysqlbinlog --skip-gtids --start-position=1078 /data/binlog/mysql-bin.000020> /tmp/bin20.sql
进行恢复:
mysql> set sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /tmp/bin21.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.01 sec)
查看数据恢复情况:
mysql> show tables;
+---------------+
| Tables_in_xbk |
+---------------+
| t1 |
| t2 |
| t3 |
| t4 |
| t5 |
+---------------+
5 rows in set (0.00 sec)
mysql> select * from t5;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
mysql> select * from t4;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
mysql> select * from t3;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
恢复成功!!!!