XtraBackup介绍

是percona提供的一款开源能够对innodb和xtradb数据库进行热备份的工具。
优点:

1
2
3
4
5
备份过程快速、可靠
备份过程不会打断正在执行的事务
能够支持压缩等功能,解压磁盘空间和流量
自动失效备份检验
还原速度快

限制:

1
2
xtrabackup的高级功能使用,对innodb引擎要求开启独立表空间功能。
xtrabackup对于myisam引擎只能温备份,并且不支持增量备份。

注:独立表空间功能开启方式my.cf配置文件中添加一行:innodb-file-per-table=1
检验是否开启独立表空间功能:mysql> show variables like “%per_table%”;

XtraBackup安装

安装相关依赖包:
[root@Mysql-31 ~]# yum install perl-Digest perl-Digest-MD5 rsync
需要到官网下载以下rpm包:

1
2
libev4-4.24-alt1.x86_64.rpm
percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

下载完成后进入存放这两个rpm包的文件目录,进行安装:
[root@Mysql-31 ~]# rpm -ivh libev4-4.24-alt1.x86_64.rpm
[root@Mysql-31 ~]# yum install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
查看xtrabackup包的内容可以发现内容并不多,主要以备份命令为主:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Mysql-31 ~]# rpm -ql percona-xtrabackup-24 
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-24-2.4.9
/usr/share/doc/percona-xtrabackup-24-2.4.9/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

XtraBackup使用

数据备份过程

使用方案:完全备份+增量/差异备份+二进制日志
二进制日志作用:

1
2
恢复未来得及备份到数据库奔溃的那部分数据
误删除一部分数据,导致数据不完整时,恢复二进制日志的部分事务

创建两个目录,用于存放完全备份数据和增量备份数据:
[root@Mysql-31 /]# mkdir /xtra-full /xtra-incement
进行一次完全备份:[root@Mysql-31 /xtra-full]# innobackupex -uroot /xtra-full/
数据备份的目录除去数据库文件外,会多出4个文件:

1
2
3
4
5
6
7
##记录备份完成时数据库使用的二进制日志及其记录位置
-rw-r----- 1 root root 22 9月 21 18:48 xtrabackup_binlog_info
##记录备份类型,备份状态,LSN(日志序列号)
-rw-r----- 1 root root 115 9月 21 18:48 xtrabackup_checkpoints
-rw-r----- 1 root root 449 9月 21 18:48 xtrabackup_info
## redo日志的备份镜像,记录备份是数据变动,恢复时先对备份数据应用该日志的信息
-rw-r----- 1 root root 2560 9月 21 18:48 xtrabackup_logfile

插入一些数据后,执行一次增量备份:
[root@Mysql-31 ~]# innobackupex –incremental /xtra-increment –incremental-basedir /xtra-full/2019-09-21_18-48-18/

数据恢复过程

情景:在第二次增量备份后,数据库继续运行,期间依然有数据的插入。然后数据库崩溃,进行数据恢复:
关闭数据库,删除全部数据:[root@Mysql-31 /data/mysql]# rm -rf *
恢复流程方案:

1
2
3
4
5
6
7
8
1、 先应用最后一次完全备份 的 日志 (仅执行 提交动作 redo-only)
2、 将增量合并到完全备份 (仅执行 提交)
5、 完全备份 copy back
6、 修改恢复后的所有文件的 所有者 所属组
7、 建立防火墙,阻止前端写入
8、 启动数据库服务,先检查第一轮数据
9、 恢复未备份部分的数据
10、 恢复二进制日志记录,清空防火墙。

1.应用完全备份日志:
[root@Mysql-31 ~]# innobackupex –apply-log –redo-only /xtra-full/2019-09-21_18-48-18/
执行完成后xtrabackup_checkpoints文件会发生变化:

1
backup_type = full-backuped---**变为**--backup_type = log-applied

2.合并增量备份数据(有多少个增量备份就执行多少次,注意–incremental-dir参数为增量备份的目录):
[root@Mysql-31 ~]# innobackupex –apply-log –redo-only /xtra-full/2019-09-21_18-48-18/ –incremental-dir=/xtra-increment/2019-09-21_19-02-58/

3.让数据拷贝到原来存放数据库数据的位置:
[root@Mysql-31 ~]# innobackupex –copy-back /xtra-full/2019-09-21_18-48-18/
4.修改文件权限,限制访问数据库:
[root@Mysql-31 /data/mysql]# chown -R mysql:mysql *
[root@Mysql-31 /data/mysql]# iptables -t filter -A INPUT -p tcp –dport 3306 -j REJECT
此时启动数据库,可以发现备份的数据已经完全恢复
5.恢复未备份部分的数据

1
2
3
4
5
6
7
##检查最后增量备份到的位置:
[root@Mysql-31 /xtra-increment/2019-09-21_19-02-58]# cat xtrabackup_binlog_info
mysql-bin.000033 10382

##导出二进制日志,并且恢复:
[root@Mysql-31 /xtra-increment]# mysqlbinlog --start-position=10382 /log-bin/mysql-bin.000033 > /root/33.sql
mysql> select * from class.students;

6.在次检查数据,发现数据已经完全恢复
7.打开防火墙,恢复访问数据库的权限:[root@Mysql-31 /xtra-increment]# iptables -F

注:XtraBackup工具备份数据并不复杂,实际上只要几条命令即可。重要的是能够更加自己的业务需求,做出相应的备份方案。在恢复数据过程中,应先做出一个方案,再进行恢复。

自动化备份

需求:
如果是星期天进行完全备份
如果是周一执行第一次增量,参考 完全
如果是周二到周六执行第1+N次增量,参考上一次 增量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
i_full="/xtra-full"
i_incre="/xtra-increment"
i_week=`date +%u`
err_log="/root/mysql-bak.log"
tmpfile="/root/xtra.tmp"

mkdir -p $i_full
mkdir -p $i_incre

result(){
res=`tail -1 $tmpfile | grep "completed OK" | wc -l`
if [ $res -eq 0 ]
then
echo "**** 备份出错 **** 请查看日志!" >> $err_log
else
echo "Complete OK!" >> $err_log
fi
}

case $i_week in
7)
echo "[完全备份开始] `date` ===================" >> $err_log
innobackupex -uroot $i_full 2> $tmpfile
result
cp /etc/my.cnf $i_full/my-`date +%F-%H-%M-%S`.cnf
;;
1)
basebak=`ls -ltr $i_full | grep "^d.*20[1-9][1-9].*[0-9]$" | tail -1 | awk '{print $NF}'`
echo "[增量备份开始] `date` ===================" >> $err_log
innobackupex --incremental $i_incre --incremental-basedir $i_full/$basebak 2> $tmpfile
result
;;
*)
basebak=`ls -ltr $i_incre | grep "^d.*20[1-9][1-9].*[0-9]$" | tail -1 | awk '{print $NF}'`
echo "[增量备份开始] `date` ===================" >> $err_log
innobackupex --incremental $i_incre --incremental-basedir $i_incre/$basebak 2> $tmpfile
result
esac

最后更新: 2019年10月05日 10:07

原始链接: https://LiYuanSh.github.io/2019/09/21/运维实战-XtraBackup备份/

× 请我吃糖~
打赏二维码