MySQL · 备份工具 · Percona XtraBackup

简介

Percona XtraBackupPercona 公司基于 C++ 开发的一个用于 MySQL 数据库 物理热备免费开源 的备份工具。

XtraBackup 优势

  • 支持 InnoDB 热备和增量备份
  • 支持流压缩传输到其它服务器
  • 备份速度快,比较容易地创建主从同步
  • 备份时不会增加服务器负载

安装

1、下载 Percona-XtraBackup

1
$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

2、rpm 方式安装

1
$ rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

报错信息

1
2
3
4
5
warning: percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
perl(Digest::MD5) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64

解决方法

1
2
3
4
$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/libev-4.15-1.el6.x86_64.rpm
$ yum -y install perl-DBD-MySQL
$ yum -y install perl-Digest-MD5
$ rpm -ivh libev-4.15-1.el6.x86_64.rpm
1
2
3
4
5
6
7
$ rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:percona-xtrabackup-24-2.4.12-1.el ################################# [100%]

$ xtrabackup --version
xtrabackup version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64)

报错信息

1
2
3
4
5
[root@hop02 src]# rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
​ libc.so.6(GLIBC_2.14)(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
​ libstdc++.so.6(GLIBCXX_3.4.15)(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64

解决方法

查看操作系统版本,CentOS 6 下载 el6 的安装包即可。

1
2
3
4
$ cat /etc/redhat-release
CentOS release 6.5 (Final)

$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm

Tips:不要轻易在真实生产环境中直接安装,因为升级的过程中比较容易出现系统出错。

原理

备份原理

innobackupex 在后台线程不断追踪 InnoDB 的日志文件,然后复制 InnoDB 的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用 InnoDB 崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。备份分为两个过程:

  • backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。
  • preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。

备份过程

PXB

1
2
3
4
5
6
7
8
9
10
1)复制已有的redo log,然后监听redo log变化并持续复制
2)复制事务引擎数据文件
3)等到数据文件复制完成
4)加锁:全局读锁
5)备份非事务引擎数据文件及其他文件
6)获取binlog点位信息等元数据
7)停止复制redo log
8)解锁:全局读锁
9)复制buffer pool dump
10)备份完成

XtraBackup 基于 InnoDBcrash recovery 机制,在备份还原时利用 redo log 得到完整的数据文件,并通过全局读锁,保证 InnoDB 数据与非 InnoDB 数据的一致性,最终完成备份还原的功能。

恢复过程

apply-log

  • 模拟 MySQL 进行 recover,将 redo log 回放到数据文件中。
  • 等到 recover 完成 。
  • 重建 redo log,为启动数据库做准备。

copy-back

  • 将数据文件复制回 MySQL 数据目录。
  • 还原完成。

InnoDB 数据会被恢复至备份结束时(全局读锁时)的状态,而非 InnoDB 数据本身即是在全局读锁时被复制出来,它们的数据一致。

实践

全量备份

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
# !/bin/bash

#############################################################################
# Full Backup Using XtraBackup For MySQL
#############################################################################

mode=$1
backupdir='/data/backup' # backup dir

backup() {
if [ ! -d $backupdir ]; then
mkdir -p $backupdir
fi

# 备份主库:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=Haier@123 --no-timestamp /$backupdir/full-`date +%Y%m%d%H%M`-bak
find $backupdir -mtime +2 -name 'full-*-bak' -exec rm -rf {} \;

# 传输到从库:
# scp -r /data/backup/* root@10.133.7.19:/data/backup
return 0
}

case "$mode" in
'full') backup ;;
*)

# usage
basename=`basename "$0"`
echo "Usage: $basename {full}"
exit 1
;;
esac
exit 0

# 每天中午12:00执行全量备份,保留前1天数据
crontab -e
0 12 * * 0 sh /data/backup.sh full

备份报错

1
2
3
4
5
6
7
8
190812 13:39:54 >> log scanned up to (491275222500)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 2 for mysql/plugin, old maximum was 0
InnoDB: Operating system error number 24 in a file operation.
InnoDB: Error number 24 means 'Too many open files'
InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html
InnoDB: File ./cosmo_im_1023/bns_io_sapsourcinglist.ibd: 'open' returned OS error 124. Cannot continue operation
InnoDB: Cannot continue operation.

解决方案

1
2
3
4
1)shell> ulimit -n 65535
2)修改 my.cnf 配置文件的参数
innodb_open_files = 10240
open_files_limit = 10240

总结

  • 优先使用高版本 XtraBackup
  • 尽量不要使用 XtraBackup 自带的增量 备份,因为后期使用或者恢复不太方便。
  • 备份结束时,请立即 apply-log ,这样能够知道备份集是否可用。