一、环境描述
测试环境:Centos 7.4
MySQL版本:mariadb-server.x86_64 1:5.5.56-2.el7
XtraBackup是一个开源的免费的备份工具,支持热备份,对Innodb和MyISam存储引擎都支持备份,Innodb为热备、MyISam为温备份、且支持将备份结果进行压缩存放、支持部分备份(如只备份某个库或者某个库中的某个表)、支持即时点数据还原、支持完全备份、支持增量备份、支持并行备份、流式备份、并行备份压缩、支持将单个表数据从一个数据库中导出然后导入另一个数据库中、支持将表恢复到一个不同的数据库server上
事先通过rpm包安装xtrabackup程序。
[root@localhost ~]# yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm -y
二、xtrabackup实现数据库的完全备份、部分备份及增量备份
1、导入测试数据库
事先准备一测试数据库hellodb.sql(Innodb引擎),内容随意,用于导入到数据库中作测试用途。
[root@localhost ~]# mysql < hellodb.sql
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
7 rows in set (0.00 sec)
MariaDB [hellodb]> show table status\g;
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| classes | InnoDB | 10 | Compact | 8 | 2048 | 16384 | 0 | 0 | 9437184 | 9 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| coc | InnoDB | 10 | Compact | 14 | 1170 | 16384 | 0 | 0 | 9437184 | 15 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| courses | InnoDB | 10 | Compact | 7 | 2340 | 16384 | 0 | 0 | 9437184 | 8 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| scores | InnoDB | 10 | Compact | 15 | 1092 | 16384 | 0 | 0 | 9437184 | 16 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| students | InnoDB | 10 | Compact | 25 | 655 | 16384 | 0 | 0 | 9437184 | 26 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| teachers | InnoDB | 10 | Compact | 4 | 4096 | 16384 | 0 | 0 | 9437184 | 5 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
| toc | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 9437184 | 1 | 2018-06-26 22:48:58 | NULL | NULL | utf8_general_ci | NULL | | |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
7 rows in set (0.00 sec)
2、使用xtrabackup工具对数据库进行完全备份
在使用xtrabackup进行备份前,我们首先需要创建一个数据库备份账号,专门用于备份数据。
#因为备份账号的权限一般较高,所以建议对其访问来源加以严格限制
MariaDB [hellodb]> grant all on *.* to 'backup'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
MariaDB [hellodb]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
接着使用该账号来对当前数据库的数据进行完全备份。
[root@localhost ~]# mkdir -pv /data/xtrabackup/
[root@localhost ~]# innobackupex --user=backup --password=123456 --no-timestamp /data/xtrabackup/full_`date +%F`.sql
[root@localhost ~]# ll /data/xtrabackup/
total 0
drwxr-x---. 6 root root 217 Jun 26 22:57 full_2018-06-26.sql
[root@localhost ~]# ll /data/xtrabackup/full_2018-06-26.sql/
total 18460
-rw-r-----. 1 root root 431 Jun 26 22:57 backup-my.cnf
drwxr-x---. 2 root root 146 Jun 26 22:57 hellodb
-rw-r-----. 1 root root 18874368 Jun 26 22:57 ibdata1
drwxr-x---. 2 root root 4096 Jun 26 22:57 mysql
drwxr-x---. 2 root root 4096 Jun 26 22:57 performance_schema
drwxr-x---. 2 root root 20 Jun 26 22:57 test
-rw-r-----. 1 root root 21 Jun 26 22:57 xtrabackup_binlog_info
-rw-r-----. 1 root root 113 Jun 26 22:57 xtrabackup_checkpoints
-rw-r-----. 1 root root 515 Jun 26 22:57 xtrabackup_info
-rw-r-----. 1 root root 2560 Jun 26 22:57 xtrabackup_logfile
上述文件中backup-my.cnf中包含my.cnf中的设置信息,只包含了备份时需要的信息;
而ibdata1是一个innodb的共享表空间文件;xtrabackup_binlog_info此文件记录了备份后新的二进制日志文件名称的及开始位置(position);xtrabackup_checkpoints 此文件记录此次备份属于那种类型的备份等信息;xtrabackup_info此文件记录了备份的概要信息;xtrabackup_logfile 此文件记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用备份数据。
3、使用xtrabackup工具对数据库进行部分备份
xtrabackup也可以实现数据库的部分备份,只需要备份时使用--databases或者--include指定需要备份的database和table名即可,如:
#备份hellodb
[root@localhost ~]# innobackupex --user=backup --password=123456 --no-timestamp --databases hellodb /data/xtrabackup/hellodb-`date +%F`.sql
[root@localhost ~]# ll /data/xtrabackup/
total 0
drwxr-x---. 6 root root 217 Jun 26 22:57 full_2018-06-26.sql
drwxr-x---. 3 root root 166 Jun 26 23:11 hellodb-2018-06-26.sql
[root@localhost ~]# ll /data/xtrabackup/hellodb-2018-06-26.sql/
total 18452
-rw-r-----. 1 root root 431 Jun 26 23:11 backup-my.cnf
drwxr-x---. 2 root root 146 Jun 26 23:11 hellodb #生产了这个目录,说明备份hellodb成功
-rw-r-----. 1 root root 18874368 Jun 26 23:11 ibdata1
-rw-r-----. 1 root root 21 Jun 26 23:11 xtrabackup_binlog_info
-rw-r-----. 1 root root 113 Jun 26 23:11 xtrabackup_checkpoints
-rw-r-----. 1 root root 538 Jun 26 23:11 xtrabackup_info
-rw-r-----. 1 root root 2560 Jun 26 23:11 xtrabackup_logfile
#备份单表,备份hellodb的students表
[root@localhost ~]# innobackupex --user=backup --password=123456 --no-timestamp --include 'hellodb.students' /data/xtrabackup/hellodb.students-`date +%F`.sql
[root@localhost ~]# ll /data/xtrabackup/
full_2018-06-26.sql/ hellodb-2018-06-26.sql/ hellodb.students-2018-06-26.sql/
[root@localhost ~]# ll /data/xtrabackup/
total 0
drwxr-x---. 6 root root 217 Jun 26 22:57 full_2018-06-26.sql
drwxr-x---. 3 root root 166 Jun 26 23:11 hellodb-2018-06-26.sql
drwxr-x---. 4 root root 178 Jun 26 23:22 hellodb.students-2018-06-26.sql
[root@localhost ~]# ll /data/xtrabackup/hellodb.students-2018-06-26.sql/
total 18452
-rw-r-----. 1 root root 431 Jun 26 23:22 backup-my.cnf
drwxr-x---. 2 root root 26 Jun 26 23:22 hellodb
-rw-r-----. 1 root root 18874368 Jun 26 23:22 ibdata1
drwxr-x---. 2 root root 20 Jun 26 23:22 test
-rw-r-----. 1 root root 21 Jun 26 23:22 xtrabackup_binlog_info
-rw-r-----. 1 root root 113 Jun 26 23:22 xtrabackup_checkpoints
-rw-r-----. 1 root root 554 Jun 26 23:22 xtrabackup_info
-rw-r-----. 1 root root 2560 Jun 26 23:22 xtrabackup_logfile
[root@localhost ~]# ll /data/xtrabackup/hellodb.students-2018-06-26.sql/hellodb/
total 12
-rw-r-----. 1 root root 8736 Jun 26 23:22 students.frm
另外也可以使用--tables-file参数来指定需要备份的完整表名,然后程序通过读取指定的文件来获得完整表明,然后进行备份,如;
[root@localhost ~]# echo "hellodb.toc" > /tmp/tables.txt
[root@localhost ~]# innobackupex --user=backup --password=123456 --tables-file=/tmp/tables.txt --no-timestamp /data/xtrabackup/hellodb.toc.`date +%F`.sql
4、使用xtrabackup工具对数据库进行增量备份
首先我们需要对数据库进行修改变化:
MariaDB [(none)]> create database Web;
MariaDB [(none)]> use Web;
MariaDB [Web]> create table items (id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,name CHAR(30),location CHAR(30));
MariaDB [Web]> insert into items values (1,'jpg','sz'),(2,'txt','sz'),(3,'xml','bj');
MariaDB [Web]> select * from items;
+----+------+----------+
| id | name | location |
+----+------+----------+
| 1 | jpg | sz |
| 2 | txt | sz |
| 3 | xml | bj |
+----+------+----------+
3 rows in set (0.00 sec)
然后使用xtrabackup对数据库进行增量备份。
[root@localhost ~]# mkdir /data/xtrabackup/increment/
[root@localhost ~]# innobackupex -u backup -p 123456 --incremental /data/xtrabackup/increment/ --incremental-basedir=/data/xtrabackup/full_2018-06-27.sql
--incremental /PATH/TO/BACKUP:表示本次备份是一个增量备份(若针对的上次备份为一个全量备份,这里也可以认为是个差量备份)
--incremental-basedir=/PATH/TO/BACKUP/last-backup-file:指定本次增量备份针对的是那个备份(可以是上个增量,也可以是上个全量)
三、使用xtrabackup进行数据库恢复
1、使用xtrabackup进行全量备份+增量备份恢复
首先通过删除数据库文件来模拟数据库损坏进行数据库恢复。
[root@localhost ~]# rm -rf /var/lib/mysql/*
[root@localhost ~]# systemctl stop mariadb
此时此前的数据库内容经已完全丢失,接着我们来进行数据库恢复。
#恢复准备
#首先redo全量备份
[root@localhost ~]# innobackupex --apply-log --redo-only /data/xtrabackup/full_2018-06-26.sql/
#接着redo增量备份,将增量备份合并到全量备份上
[root@localhost ~]# innobackupex --apply-log --redo-only /data/xtrabackup/full_2018-06-26.sql/ --incremental-dir=/data/xtrabackup/increment/incre_add-2018-06-26/
#如果有多个增量备份文件,需要将重复执行上述命令多次。
#接着apply-log准备好的全量备份
[root@localhost ~]# innobackupex --apply-log /data/xtrabackup/full_2018-06-26.sql/
#此时查看全量备份的xtrabackup_checkpoint文件,其backup_type因从log-applied变更到full-prepared,其last_lsn也变更到增量备份的last_lsn,说明增量备份已合并到全量备份中。
[root@localhost ~]# cat /data/xtrabackup/full_2018-06-27.sql/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1633388
last_lsn = 1633388
compact = 0
recover_binlog_info = 0
#还原全量备份
#另外在还原之前,需确保数据库目录/var/lib/mysql/为空。
[root@localhost ~]# innobackupex --copy-back /data/xtrabackup/full_2018-06-26.sql/
#更改数据库目录下的还原的数据库文件的属组和属主为mysql
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql/*
--apply-log:回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
--redo-only:表示进行准备(应用日志)工作时,只进行redo操作,只会重做已提交但未应用的事务,不会回滚未提交的事务。原因是后面还有个增量备份,未提交的可能在后面增量备份时进行提交。
--incremental-dir:此选项对应的目录为增量备份文件的目录
完成上述恢复操作后,最后就可以启动mariadb数据库来检查还原的情况。
[root@localhost ~]# systemctl start mariadb
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Web |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
MariaDB [Web]> show tables;
+---------------+
| Tables_in_Web |
+---------------+
| items |
+---------------+
1 row in set (0.00 sec)
MariaDB [Web]> select * from items;
+----+------+----------+
| id | name | location |
+----+------+----------+
| 1 | jpg | sz |
| 2 | txt | sz |
| 3 | xml | bj |
+----+------+----------+
3 rows in set (0.00 sec)
网友评论