首页 > 技术文章 > xtrabackup数据库备份工具

struggle-1216 2019-11-25 15:12 原文

下来我来介绍一下更强大的备份工具:xtrabackup  

xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。xtrabackup的官方下载地址为https://www.percona.com/downloads/Percona-XtraBackup-2.4/

xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:

(1)xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;

(2)innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份

官网:www.percona.com
percona-server
InnoDB --> XtraDB

 Xtrabackup

percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具
手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

特点:

备份还原过程快速、可靠
备份过程不会打断正在执行的事务
能够基于压缩等功能节约磁盘空间和流量
自动实现备份检验
开源,免费

(1)Xtrabackup2.2版之前包括4个可执行文件:

innobackupex: Perl 脚本
xtrabackup: C/C++ 编译的二进制
xbcrypt: 加解密
xbstream: 支持并发写的流文件格式

(2)xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互

(3)innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上做了一层封装实现的

xtrabackup备份过程 

安装percona的xtrabackup安装包:

(1)首先在官网下载xtrabackup包,然后传到linux系统中,安装xtrabackup包,需要epel源仓库。

  下载地址:https://www.percona.com/downloads/Percona-XtraBackup-2.4/

[root@centos7-1~]#rz

(2)安装xtrabackup包,安装的2.4版本的包对应的是mysql和mariadb5.5x版本的包,对应的mysql8.x和mariadb10.x不支持。

[root@centos7-1~]#yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm  -y

xtrabackup用法

备份:innobackupex [option] BACKUP-ROOT-DIR
选项说明:https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html

--user:该选项表示备份账号
--password:该选项表示备份的密码
--host:该选项表示备份数据库的地址
--databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:该选项表示还原时增量备份的目录
--include=name:指定表名,格式:databasename.tablename

Prepare:innobackupex --apply-log [option] BACKUP-DIR
选项说明:

--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G ,最后一次还原需要加上--apply-log选项
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并,不是最后一次还原,需要加--redo-only选项

还原注意事项:

1.datadir 目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖
2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中,还原时不能启动mysql服务。
3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户
   chown -R mysql:mysql /data/mysql
 以上需要在用户调用innobackupex之前完成
 --force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

备份生成的相关文件

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
(2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
(3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
(4)backup-my.cnf:备份命令用到的配置选项信息
(5)xtrabackup_logfile:备份生成的日志文件

实验:xtrabackup备份与还原详细过程:

1、数据库进行备份

修改mysql数据库,将数据库的数据和二进制日志数据分开存放。

[root@centos7 mysql]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql   # 数据库数据存放路径
port            = 3306
socket          = /var/lib/mysql/mysql.sock
log_bin=/data/logbin/mysql-bin # 二进制日志存放路径

(1)在数据库主机上先创建一个备份数据库目录

[root@centos7-1~]#cd /data/
[root@centos7-1data]#ls
logbin
[root@centos7-1data]#mkdir backups

(2)在数据库主机上开始用xtrabackup工具备份数据库,并指定备份的目录路径

[root@centos7-1data]#xtrabackup    --backup  --target-dir=/data/backups/

2、模拟删除数据库的数据

(1)注意:在数据库主机上将mysql数据库文件删除,必须将数据库目录为空,并停止mysql服务

[root@centos7data]#rm -rf /var/lib/mysql/*
[root@centos7data]#systemctl stop mariadb

(2)将备份的数据库进行上预准备:提交完成的事务,回滚未完成的事务

[root@centos7data]#xtrabackup  --prepare  --target-dir=/data/backups # 对备份的目录数据进行与准备

3、开始还原数据库数据

(1)在数据库上复制到数据库目录 。 注意:数据库目录必须为空,MySQL服务不能启动

[root@centos7data]#xtrabackup --copy-back --target-dir=/data/backups/  复制到/data/backup目录下
[root@centos7data]#ll /var/lib/mysql  此时查看所属组和所有者有问题,可修改所有者和所属组
total 40976
drwxr-x--- 2 root root      303 Nov 25 14:21 hellodb
-rw-r----- 1 root root 18874368 Nov 25 14:21 ibdata1
-rw-r----- 1 root root  5242880 Nov 25 14:21 ib_logfile0
-rw-r----- 1 root root  5242880 Nov 25 14:21 ib_logfile1
-rw-r----- 1 root root 12582912 Nov 25 14:21 ibtmp1
drwxr-x--- 2 root root     4096 Nov 25 14:21 mysql
-rw-r----- 1 root root       38 Nov 25 14:21 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      469 Nov 25 14:21 xtrabackup_info
-rw-r----- 1 root root        1 Nov 25 14:21 xtrabackup_master_key_id

[root@centos7data]#chown -R mysql. /var/lib/mysql/   # 修改权限

(2)启动mysql服务,二进制日志文件最好和数据库文件分开存放,此时就可以看到数据库的数据和二进制日志数据。

[root@centos7 mysql]# ll /data/mysql
total 40976
-rw-r----- 1 root root 18874368 Mar 25 00:00 ibdata1
-rw-r----- 1 root root  5242880 Mar 25 00:00 ib_logfile0
-rw-r----- 1 root root  5242880 Mar 25 00:00 ib_logfile1
-rw-r----- 1 root root 12582912 Mar 25 00:00 ibtmp1
drwxr-x--- 2 root root     4096 Mar 25 00:00 mysql
drwxr-x--- 2 root root     4096 Mar 25 00:00 performance_schema
drwxr-x--- 2 root root       20 Mar 25 00:00 test
-rw-r----- 1 root root      469 Mar 25 00:00 xtrabackup_info
-rw-r----- 1 root root        1 Mar 25 00:00 xtrabackup_master_key_id

(3)二进制日志数据

[root@centos7 mysql]# ll /data/logbin/
total 8960
-rw-rw---- 1 mysql mysql     351 Mar 24 20:34 mysql-bin.000001
-rw-rw---- 1 mysql mysql     351 Mar 24 20:38 mysql-bin.000002
-rw-rw---- 1 mysql mysql     351 Mar 24 20:43 mysql-bin.000003
-rw-rw---- 1 mysql mysql    1242 Mar 24 21:01 mysql-bin.000004
-rw-rw---- 1 mysql mysql     432 Mar 24 21:01 mysql-bin.000005
-rw-rw---- 1 mysql mysql     432 Mar 24 21:01 mysql-bin.000006
-rw-rw---- 1 mysql mysql    1224 Mar 24 21:03 mysql-bin.000007
-rw-rw---- 1 mysql mysql    1344 Mar 24 21:14 mysql-bin.000008
-rw-rw---- 1 mysql mysql     365 Mar 24 21:04 mysql-bin.000009
-rw-rw---- 1 mysql mysql     365 Mar 24 21:12 mysql-bin.000010
-rw-rw---- 1 mysql mysql 8021033 Mar 24 21:21 mysql-bin.000011
-rw-rw---- 1 mysql mysql     365 Mar 24 21:14 mysql-bin.000012
-rw-rw---- 1 mysql mysql     841 Mar 24 21:22 mysql-bin.000013
-rw-rw---- 1 mysql mysql     365 Mar 24 23:38 mysql-bin.000014
-rw-rw---- 1 mysql mysql   30337 Mar 24 23:49 mysql-bin.000015
-rw-rw---- 1 mysql mysql 1038814 Mar 24 23:49 mysql-bin.000016
-rw-rw---- 1 mysql mysql     264 Mar 24 23:51 mysql-bin.000017
-rw-rw---- 1 mysql mysql     264 Mar 24 23:53 mysql-bin.000018
-rw-rw---- 1 mysql mysql     264 Mar 24 23:57 mysql-bin.000019
-rw-rw---- 1 mysql mysql     245 Mar 25 00:01 mysql-bin.000020
-rw-rw---- 1 mysql mysql     600 Mar 25 00:01 mysql-bin.index
-rw-rw---- 1 mysql mysql       8 Mar 24 23:38 mysql-bin.state

实验:新版xtrabackup完全,增量备份及还原

对数据库进行完全、增量备份

(1)在A主机新建三个文件,创建的base目录为完全备份的目录,inc1是第一次增量备份的目录,inc2是第二次增量备份的目录。

mkdir /backup/{base,inc1,inc2} -pv

(2)在A主机开始完全备份,备份到base目录下,使用用户和密码就需要加上--user=root ,password=密码选项即可。

[root@centos7-1~]#xtrabackup --backup --target-dir=/backup/base

(3)在A主机新打开窗口,在数据库中插入一条数据

MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | a             |   0 | NULL   |
|   6 | b             |   0 | NULL   |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)

MariaDB [hellodb]> insert teachers(name) values('c');  插入一个c数据

(4)在A主机进行第一次的增量备份,在base目录下完全备份的基础上,进行第一次增量备份到inc1目录下。

[root@centos7-1~]#xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

(5)然后在A主机继续在数据库中添加数据

MariaDB [hellodb]> insert teachers(name)values('yyy');

(6)在A主机进行第二次增量备份,基于inc1备份的基础上进行第二次备份到inc2目录下。

[root@centos7-1~]#xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

此时完全备份的数据,以及第一次增量、第二次增量的数据在/backup/base目录下,或者将三次备份的数据复制到另外一台主机上

[root@centos7-1~]#scp -r /backup/  192.168.34.101:/data/

合并三次的备份数据库

(1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务

[root@centos7data]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base

(2)合并第1次增量备份到完全备份,在base备份的基础上,将第一次的增量备份到完全备份的目录中。

[root@centos7data]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1

(3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only

[root@centos7data]#xtrabackup --prepare --target-dir=/data/backup/base --incremental-dir=/backup/inc2

删除与还原数据库

(1)还原数据库数据库目录,注意数据库目录必须为空,MySQL服务不能启动

[root@centos7data]#rm -rf /var/lib/mysql/*
[root@centos7data]#systemctl stop mariadb
[root@centos7data]#xtrabackup --copy-back --target-dir=/data/backup/base  复制数据量目录

(2)修改数据库权限并启动mysql服务

[root@centos7data]#chown -R mysql.mysql /var/lib/mysql
[root@centos7data]#systemctl start mariadb

(3)此时,我们在数据库主机上可以看到之前插入的表信息都已经恢复

MariaDB [hellodb]> select * from teachers;  查看到之前插入的c和yyy数据已恢复
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | a             |   0 | NULL   |
|   6 | b             |   0 | NULL   |
|   7 | c             |   0 | NULL   |
|   8 | yyy           |   0 | NULL   |
+-----+---------------+-----+--------+

  

 

  

  

 

 

  

 

  

  

 

  

  

  

  

 

 

  

 

  

 

推荐阅读