当前位置: > 数据库 > MySQL >

xtrabackup和innobackupex的用法实践

时间:2019-05-13 11:55来源:linux.it.net.cn 作者:IT

环境说明:

HostName IP Servers DB
linux-node1 192.168.20.200 zabbix-server 5.5.56-MariaDB
test 192.168.20.201   5.5.56-MariaDB

test为一台新建测试机,yum安装mysql用来测试恢复zabbix-server端备份的数据。需要做如下配置:

 
1
2
3
4
[root@test ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@test ~]# yum install -y mariadb mariadb-server    #安装mariadb
[root@test ~]# systemctl start mariadb       #启动服务

授权zabbix用户:zabbix web端连接展示用,需要修改zabbix.conf.php文件以对应授权用户

 
1
2
MariaDB [mysql]> grant all privileges on zabbix.* to zabbix@'192.168.20.200' identified by '123456';
Query OK, 0 rows affected (0.08 sec)

在zabbix-server端创建进行备份所需最低权限的备份用户:

 
1
MariaDB [(none)]> grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost' identified by '123456';

本篇重点介绍innobackupex命令的用法:

完全备份

1.在zabbix服务端对zabbix数据库进行完全备份:

 
1
[root@linux-node1 backup]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --databases=zabbix /data/backup/

执行完成后会在备份目录/data/backup下生成一个以时间戳命名的文件夹

 
1
2
3
4
5
6
7
8
9
[root@linux-node1 backup]# ll 2018-05-21_15-02-53/
total 895020
-rw-r----- 1 root root       431 May 21 15:03 backup-my.cnf
-rw-r----- 1 root root 916455424 May 21 15:03 ibdata1
-rw-r----- 1 root root        27 May 21 15:03 xtrabackup_binlog_info
-rw-r----- 1 root root       119 May 21 15:03 xtrabackup_checkpoints
-rw-r----- 1 root root       533 May 21 15:03 xtrabackup_info
-rw-r----- 1 root root     19456 May 21 15:03 xtrabackup_logfile
drwxr-x--- 2 root root      4096 May 21 15:03 zabbix

2.备份文件复制到测试端:

 
1
[root@linux-node1 backup]# scp -r 2018-05-21_15-02-53/ root@192.168.20.201:/data/backup/

3.测试端准备(prepare)一个完全备份:

1
[root@test backup]# innobackupex --apply-log /data/backup/2018-05-21_15-02-53/

4.恢复备份的数据:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#关闭数据库:
[root@test backup]# systemctl stop mariadb
#恢复数据:
[root@test backup]# innobackupex --copy-back /data/backup/2018-05-21_15-02-53/
Original data directory /var/lib/mysql is not empty!
#执行上面的命令需要保证数据库目录是空的,否则会失败,因为目录里有binlog日志,要么移走,要么就用手动复制需要的文件。所以说日志不要和数据放在一起!
 
#执行手动恢复:
[root@test 2018-05-21_15-02-53]# cp ibdata1 ib_logfile0 ib_logfile1 /var/lib/mysql/
[root@test 2018-05-21_15-02-53]# cp -av zabbix/ /var/lib/mysql/
#恢复后数据库的属性会发生变化需要修改:
[root@test mysql]# chown -R mysql.mysql /var/lib/mysql/*
#启动数据库:
[root@test mysql]# systemctl start mariadb

5.查看恢复数据
修改zabbix.conf.php文件中数据库的配置为测试机的授权用户:

 
1
2
3
4
5
6
$DB['TYPE']     = 'MYSQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER']     = 'zabbix';
$DB['PASSWORD'] = '123456';

这里写图片描述

这里写图片描述

可以看到完全备份的时间与页面展示的数据时间关系是对应的。

增量备份

增量备份需要在全备的基础上进行

对于增量备份的Prepare阶段,有2个需要注意的地方,一个是提交的事务需要replayed,一个未提交的事务需要rollback。如果在Prepare阶段replay了已提交的事务以及回滚了未提交的事务,则后续的增量备份无法添加到当前全备。因此在Prepare阶段全备应使用–redo-only选项。对于存在多次增量的情形,仅仅只有最后一个增量不需要使用–redo-only 选项。如果使用了的话,rollback将由服务器启动的时候来完成。

1.创建增量备份

全备:

 
1
2
[root@linux-node1 backup]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --databases=zabbix /data/backup/
#这里可以直接使用刚才完全备份的数据,只需要重新往测试机上传一份即可

增量备份:

 
1
2
[root@linux-node1 ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --databases=zabbix --incremental /data/backup/increment_data/ --incremental-basedir=/data/backup/2018-05-21_15-02-53/
#其中,--incremental指明是增量备份,--incremental-basedir指定上次完整备份或者增量备份文件的位置。这里的增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。

继续增量:

 
1
2
[root@linux-node1 increment_data]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --databases=zabbix --incremental /data/backup/increment_data/ --incremental-basedir=/data/backup/increment_data/2018-05-21_15-21-11/
#要是在第2次做增量备份的时候 --incremental-basedir 指向全量备份,则第一次增量备份中的数据会被第2次包含,只需要还原一次就可以恢复,现在则需要还原2次增量备份。

lsn对应关系如下:

这里写图片描述

2.推送备份数据到测试机

?
1
2
3
[root@linux-node1 backup]# scp -r 2018-05-21_15-02-53/ root@192.168.20.201:/data/backup/
[root@linux-node1 backup]# scp -r /data/backup/increment_data/2018-05-21_15-21-11/ root@192.168.20.201:/data/backup/increment_data/
[root@linux-node1 backup]# scp -r /data/backup/increment_data/2018-05-21_15-30-13/ root@192.168.20.201:/data/backup/increment_data/

3.测试端准备(prepare)

需要注意和完全备份的区别--apply-log --redo-only

先prepare全备:

 
1
[root@test backup]# innobackupex --apply-log --redo-only /data/backup/2018-05-21_15-02-53/

再prepare第一个增量:

 
1
[root@test backup]# innobackupex --apply-log --redo-only  --user-memory=1G /data/backup/2018-05-21_15-02-53/ --incremental-dir=/data/backup/increment_data/2018-05-21_15-21-11/

然后prepare最后一个增量:

 
1
[root@test backup]# innobackupex --apply-log /data/backup/2018-05-21_15-02-53/ --incremental-dir=/data/backup/increment_data/2018-05-21_15-30-13/

可以发现在在准备的过程中backup_type的变化过程为full-backuped–>log-applied–>log-applied–>full-backuped。

此时查看lsn可以看到此时的to_lsn指向了第二次增量备份的to_lsn:

这里写图片描述

4.恢复备份

 
1
2
3
4
5
6
7
8
9
#关闭数据库:
[root@test backup]# systemctl stop mariadb
#执行手动恢复:
[root@test 2018-05-21_15-02-53]# cp ibdata1 ib_logfile0 ib_logfile1 /var/lib/mysql/
[root@test 2018-05-21_15-02-53]# cp -av zabbix/ /var/lib/mysql/
#恢复后数据库的属性会发生变化需要修改:
[root@test mysql]# chown -R mysql.mysql /var/lib/mysql/*
#启动数据库:
[root@test mysql]# systemctl start mariadb

5.查看恢复后的数据

这里写图片描述

总结

增量备份是基于增量或全备的基础之上完成的。 增量备份的基础是InnoDB引擎使用了LSN机制,非InnoDB引擎不存在增量备份的说法,每次都是全备。 对于增量备份的恢复期间需要对已提交的事务前滚,未提交的事务回滚。 增量备份的恢复应按照备份的顺利逐个逐个replay,需要使用--apply-log --redo-only选项。 仅仅最后一个增量备份不需要使用–redo-only选项。 如果要做完全恢复或时点恢复,需要结合binlog来实现

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容