xtrabackup备份和恢复

2019年10月22日

备份方式

热备份:读写不受影响(mysqldump–>innodb)
温备份:仅可以执行读操作(mysqldump–>myisam)
冷备份:离线备份,读写都不可用
逻辑备份:将数据导出文本文件中(mysqldump)
物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
完整备份:备份所有数据
增量备份:仅备份上次完整备份或增量备份以来变化的数据
差异备份:仅备份上次完整备份以来变化的数据 创建备份用户

简介

Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,支持在线无锁表同步复制和可并行高效率的安全备份恢复机制相比mysqldump来说确实让人眼前一亮,与MySQL Enterprise Backup(InnoDB Hot Backup)的功能对比可以参考扩展阅读。当然我们在实际运维过程中都应针对不同的业务需求分析和选择合适的备份恢复方案,这篇文章就是针对MySQL多实例且一个实例对应多个database的情况,实现MySQL在线不停机不锁表的主从同步,日后再继续更新分享基于XtraBackup的其它实用技能。

XtraBackup备份原理

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

XtraBackup的优点

  • 可以快速可靠的完成数据备份(复制数据文件和追踪事务日志)
  • 数据备份过程中不会中断事务的处理(热备份)
  • 节约磁盘空间和网络带宽
  • 自动完成备份鉴定
  • 因更快的恢复时间而提高在线时间

授权最小权限备份

1
2
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO  backup@localhost identified by 'sunday';
mysql> FLUSH PRIVILEGES;

 

安装

#2.4 之前版本可能不支持 mysql5.7

1
2
3
https://www.percona.com/downloads/XtraBackup/LATEST/
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5  libev
rpm -ivh percona-xtrabackup-24-debuginfo-2.4.11-1.el7.x86_64.rpm

 

参数

  • –user= #指定数据库备份用户
  • –password= #指定数据库备份用户密码
  • –port= #指定数据库端口
  • –host= #指定备份主机
  • –socket= #指定socket文件路径
  • –databases= #备份指定数据库,多个空格隔开,如–databases=”dbname1 dbname2”,不加备份所有库
  • –defaults-file= #指定my.cnf配置文件
  • –apply-log #日志回滚
  • –incremental= #增量备份,后跟增量备份路径
  • –incremental-basedir= #增量备份,指上次增量备份路径
  • –redo-only #合并全备和增量备份数据文件
  • –copy-back #将备份数据复制到数据库,数据库目录要为空
  • –no-timestamp #生成备份文件不以时间戳为目录名
  • –stream= #指定流的格式做备份,–stream=tar,将备份文件归档
  • --remote-host=user@ip DST_DIR #备份到远程主机 完整备份与恢复
  • –parallel #并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
  • –use-memory=4G #加快还原的速度
  • –no-lock #拷贝非Innodb数据时不停止复制线程,但是条件是备份期间非事务型表上不能有DDL或者DML操作

全量备份

1
2
3
innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --no-lock --parallel=4 /data/backup/full
180509 23:43:27 [00] Writing /data/backup/full/2018-05-09_16-50-05/xtrabackup_info
180509 23:43:47 completed OK! 表示备份成功

注意:如果不指定--defaults-file,默认值为/etc/my.cnf。 备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/data/backup/full/2018-05-09_16-50-05),在该目录下存放备份文件。
备份文件说明:

  • backup-my.cnf:记录innobackup使用到mysql参数
  • xtrabackup_binary:备份中用到的可执行文件
  • xtrabackup_checkpoints:记录备份的类型、开始和结束的日志序列号
  • xtrabackup_logfile:备份中会开启一个log copy线程,用来监控innodb日志文件(ib_logfile),如果修改就会复制到这个文件 完整备份+增量备份与恢复:

全量恢复

1
2
3
4
5
/etc/init.d/mysql stop
mv /data/mysql /tmp
mkdir /data/mysql
innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --apply-log /data/backup/full/2018-05-09_16-34-22
innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --copy-back /data/backup/full/2018-05-09_16-34-22

增量备份

每周三、周六执行全备,其他时间增量备份

1
2
3
4
5
6
7
8
9
10
11
#全量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --no-lock --parallel=4 /data/backup/full
#180509 23:41:37 [00] Writing /data/backup/full/2018-05-09_23-41-21/xtrabackup_info

#第一次增量备份, 指定上次完整备份目录
innobackupex --defaults-file=/etc/my.cnf --incremental /data/backup/inc1 --incremental-basedir=/data/backup/full/2018-05-09_23-41-21 --user=root --password='sunday' 
#180509 23:42:13 [00] Writing /data/backup/inc1/2018-05-09_23-42-05/xtrabackup_info

#第二次增量备份,指定上次增量备份目录
innobackupex --defaults-file=/etc/my.cnf --incremental /data/backup/inc1 --incremental-basedir=/data/backup/inc1/2018-05-09_23-42-05 --user=root --password='sunday'
#180509 23:43:27 [00] Writing /data/backup/inc1/2018-05-09_23-43-18/xtrabackup_info

 

增量恢复

备份恢复:将增量备份1、增量备份2…合并到完整备份,加到一起出来一个新的完整备份,将新的完整备份以拷贝的形式到数据库空目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#合并完整备份 xtrabackup把备份过程中可能有尚未提交的事务或已经提交但未同步数据文件的事务,写到xtrabackup_logfile文件,所以要先通过这个日志文件回滚,把未完成的事务同步到备份文件,保证数据文件处于一致性。
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2018-05-09_23-41-21 --use-memory=2G --user=root --password='sunday'

#合并第一个增量备份
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2018-05-09_23-41-21 --incremental-dir=/data/backup/inc1/2018-05-09_23-42-05 --use-memory=2G --user=root --password='sunday'

#合并第二个增量备份
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2018-05-09_23-41-21 --incremental-dir=/data/backup/inc1/2018-05-09_23-43-18 --use-memory=2G --user=root --password='sunday'

#停止数据库,移动数据库目录
/etc/init.d/mysql stop
mv /data/mysql /tmp
mkdir /data/mysql

#恢复完整备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --copy-back /data/backup/full/2018-05-09_23-41-21

#修复权限,启动
chown -R mysql:mysql /data/mysql/
/etc/init.d/mysql start

 

增量备份单个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
#停止数据库,移动数据库目录
/etc/init.d/mysql stop
mv /data/mysql /tmp
mkdir /data/mysql

#全量备份
innobackupex --user=root --password='sunday' --databases="xwx" --no-lock /data/backup/full
#180510 00:27:49 [00] Writing /data/backup/full/2018-05-10_00-27-41/xtrabackup_info
#180510 00:27:50 completed OK!

#完整备份目录上做第一次增量备份
innobackupex --user=root --password='sunday' --databases='xwx' --apply-log-only --incremental /data/backup/inc1 --incremental-basedir=/data/backup/full/2018-05-10_00-19-41/
#180510 00:31:04 [00] Writing /data/backup/inc1/2018-05-10_00-31-01/xtrabackup_info

增量恢复单个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
#合并完整备份 
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2018-05-10_00-27-41 --user=root --password='sunday'

#合并第一个增量备份
innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2018-05-10_00-27-41 --incremental-dir=/data/backup/inc1/2018-05-10_00-31-01 --user=root --password='sunday'

#恢复单个数据库备份
#innobackupex --defaults-file=/etc/my.cnf --user=root --password='sunday' --copy-back /data/backup/full/2018-05-10_00-27-41
cp /data/backup/full/2018-05-10_00-27-41/xwx /data/mysql/

#修复权限,启动
chown -R mysql:mysql /data/mysql/
/etc/init.d/mysql start

远程全量备份

1
innobackupex --defaults-file=/etc/my.cnf --user=root --host=192.168.1.41 --parallel=4 --throttle=200 /backup/mysql/data 2>/backup/mysql/data/backup.log 1>/data/backup/full/`data +%Y-%m-%d_%H-%M%S`

–parallel=4 –throttle=200 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
2>/backup/mysql/data/backup.log 备份日志,将备份过程中的输出信息重定向到bak.log

流及备份压缩

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用–stream选项即可。如:

1
innobackupex --stream=tar  /backup | gzip > /data/backup/full/`date +%F_%H-%M-%S`.tar.gz

 

甚至也可以使用类似如下命令将数据备份至其它服务器

1
innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar  /backup | ssh [email protected]  "cat -  > /backups/`date +%F_%H:%M:%S`.tar"

 

这可以使用–remote-host选项来实现,innobackupex备份的数据文件也可以存储至远程主机

1
innobackupex --remote-host=user@www.sundayhk.com  /data/backup/full

原文:https://www.sundayle.com/xtrabackup/

没有评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注