环境说明:
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) |