RPM安装

下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 

yum安装

yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only tools release
yum -y install percona-xtrabackup-80

备份:
innobackupex --user=DBUSER --password=DBUSERPASS --defaults-file=/etc/my.cnf /path/to/BACKUP-DIR/

恢复:
innobackupex --apply-log /backups/2018-07-30_11-04-55/
innobackupex --copy-back --defaults-file=/etc/my.cnf /backups/2018-07-30_11-04-55/

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

实战练习

(1)全量备份
[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/  #在master上进行全库备份#语法解释说明:
#--user=root 指定备份用户
#--password=123456  指定备份用户密码
#--host  指定主机
#/backups  指定备份目录
[root@master backups]# ll 2018-07-30_11-01-37/  #查看备份数据
(2)恢复
[root@slave ~]# /etc/init.d/mysqld stop  #停止slave上的mysql
[root@slave tools]# yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm   #安装xtrabackup
[root@master backups]# scp -r 2018-07-30_11-01-37/ root@192.168.56.12:/backups/   #从master上拷贝备份数据
[root@slave tools]# innobackupex --apply-log /backups/2018-07-30_11-01-37/      #合并数据,使数据文件处于一致性的状态
[root@slave ~]# rm -rf /usr/local/mysql/data/  #在slave上删除原有的数据
[root@slave ~]# vim /etc/my.cnf  #配置my.cnf的数据目录路径,否则会报错,要和master一致
datadir=/usr/local/mysql/data
[root@slave ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/  #在slave上数据恢复
[root@slave ~]# ll /usr/local/mysql/data/  
#slave上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息
[root@slave ~]# chown -R mysql.mysql /usr/local/mysql/data/  #修改属主属组
[root@slave ~]# /etc/init.d/mysqld start  #启动mysql
Starting MySQL. SUCCESS! 
[root@slave ~]# mysql -uroot -p -e "show databases;"  #查看数据,是否恢复

总结全库备份与恢复三步曲:

a. innobackupex全量备份,并指定备份目录路径;
b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;
c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

  • 3、xtrabackup增量备份与恢复

  使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。

要实现第一次增量备份,可以使用下面的命令进行:

基于全量备份的增量备份与恢复
做一次增量备份(基于当前最新的全量备份)
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37
1. 准备基于全量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37
2. 准备基于增量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37 --incremental-dir=/backups/2018-07-30_13-51-47/
3. 恢复
innobackupex --copy-back --defaults-file=/etc/my.cnf /opt/2017-01-05_11-04-55/ 解释: 1. 2018-07-30_11-01-37指的是完全备份所在的目录。
2. 2018-07-30_13-51-47指定是第一次基于2018-07-30_11-01-37增量备份的目录,其他类似以此类推,即如果有多次增量备份。每一次都要执行如上操作。

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

"准备"(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
①需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。"重放"之后,所有的备份数据将合并到完全备份上。
②基于所有的备份将未提交的事务进行"回滚"

(1)增量备份演示

[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/   #全备数据
[root@master ~]# mysql -uroot -p  #在master上创建student库并创建testtb表插入若干数据
mysql> create database student;
mysql> use student;
mysql> create table testtb(id int);
mysql> insert into testtb values(1),(10),(99);
mysql> select * from testtb;

使用innobackupex进行增量备份

[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37/
[root@master backups]# ll  #查看备份数据
drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37  #全量备份数据目录
drwxr-x--- 8 root root 273 Jul 30 13:51 2018-07-30_13-51-47  #增量备份数据目录
[root@master 2018-07-30_11-01-37]# cat xtrabackup_checkpoints #查看全量备份的xtrabackup_checkpoints
backup_type = full-backuped  #备份类型为全量备份
from_lsn = 0  #lsn从0开始
to_lsn = 3127097  #lsn到3127097结束
last_lsn = 3127097
compact = 0
recover_binlog_info = 0

[root@master 2018-07-30_13-51-47]# cat xtrabackup_checkpoints   #查看增量备份的xtrabackup_checkpoints
backup_type = incremental  #备份类型为增量备份
from_lsn = 3127097  #lsn从3127097开始
to_lsn = 3158741    #lsn到啊3158741结束
last_lsn = 3158741  
compact = 0
recover_binlog_info = 0

(2)增量备份后数据恢复演示

(1)模拟mysql故障,删除数据目录所有数据
[root@master ~]# /etc/init.d/mysqld stop  #模拟mysql故障,停止mysql
Shutting down MySQL.. SUCCESS! 
[root@master ~]# rm -rf /usr/local/mysql/data/*  #删除数据目录中的所有数据

(2)合并全备数据目录,确保数据的一致性
[root@master ~]# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/

(3)将增量备份数据合并到全备数据目录当中
[root@master ~]# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/ --incremental-dir=/backups/2018-07-30_13-51-47/

[root@master ~]# cat /backups/2018-07-30_11-01-37/xtrabackup_checkpoints 
backup_type = log-applied  #查看到数据备份类型是增加
from_lsn = 0  #lsn从0开始
to_lsn = 3158741  #lsn结束号为最新的lsn
last_lsn = 3158741
compact = 0
recover_binlog_info = 0

(4)恢复数据
[root@master ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/

[root@master ~]# ll /usr/local/mysql/data/

[root@master ~]# chown -R mysql.mysql /usr/local/mysql/data  #更改数据的属主属组
[root@master ~]# /etc/init.d/mysqld start  #启动mysql
Starting MySQL.Logging to '/usr/local/mysql/data/master.err'.
.. SUCCESS! 
[root@master ~]# mysql -uroot -p -e "show databases;"  #查看数据是否恢复

总结:

(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;

(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

#1.  --user=root 指定备份的用户

#2.  --password=root指定备份用户的密码

#3.  --defaults-file=/etc/my.cnf 指定的备份数据的配置文件

标签: xtrabackup, 数据库备份

添加新评论