数据备份工具xtrabackup使用介绍

1.使用Xtrabackup进行MySQL备份

1.1简介

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:

(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;

2、安装

其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于RHEL7的系统,因此,直接下载相应版本的rpm包安装即可,这里不再演示其过程。

#安装依赖
[root@mysql-db01 ~]# yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SS
#安装Percona Yum存储库的最简单的方法是安装一个 配置yum并安装Percona GPG密钥的RPM。
[root@mysql-db01 ~]# yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm #测试存储库 [root@mysql-db01 ~]# yum list | grep percona #安装软件包 [root@mysql-db01 ~]# yum -y install percona-xtrabackup-24

3 警告

1.将二进制日志备份出来一份,生产环境中二进制日志切记不要和数据文件放在一起,最好不要在同一分区甚至同一物理磁盘, 以免一旦玉石俱焚,悔之晚矣

2.多实例恢复,xtarbackup需要指定对应的my.cnf

3.可以加一个–no-timestamp参数不生产这个目录,直接备份到 /data/xtrabackup/下

4 基本概念

  1. 热备份:读写不受影响(mysqldump–>innodb)
  2. 温备份:仅可以执行读操作(mysqldump–>myisam)
  3. 冷备份:离线备份,读写都不可用
  4. 逻辑备份:将数据导出文本文件中(mysqldump)
  5. 物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
  6. 完整备份:备份所有数据
  7. 增量备份:仅备份上次完整备份或增量备份以来变化的数据
  8. 差异备份:仅备份上次完整备份以来变化的数据

1.2 使用说明

innobackupex:这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。但在处理Myisam时需要加一个读锁。

xtrabackup:一个由C编译而来的二进制文件,只能备份InnoDB和XtraDB数据。

xbcrypt:用来加密或解密备份的数据。

xbstream:用来解压或压缩xbstream格式的压缩文件。

1.3命令innobackupex 参数介绍

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

--defaults-file:
指定my.cnf参数文件的位置[此配置文件里必须指定datadir]
--apply-log:
同xtrabackup的--prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
--copy-back:
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--remote-host=HOSTNAME: 
通过ssh将备份数据存储到远程服务器上
--stream=[tar]:
备份文件输出格式, 该文件可在XtarBackup binary文件中获得. 在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话,xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题.
--tmpdir=DIRECTORY:
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log:
强制备份日志时只redo,跳过rollback,这在做增量备份时非常必要
--use-memory=*:
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存
--databases=LIST:
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份
--slave-info:
备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET:
指定mysql.sock所在位置,以便备份远程登录mysql.

1.4备份的实现

1.2.1完全备份及还原

  1. mysql的配置文件路径/etc/my.cnf
  2. 全量备份后的数据存放目录是/backup/mysql/data
[root@mysql-db01 ~]# mkdir -p /backup/mysql/data/
#全量备份命令
[root@mysql-db01 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/
#出现下面的信息,表示备份已经ok
180511 10:44:44 Executing UNLOCK TABLES
180511 10:44:44 All tables unlocked
180511 10:44:44 Backup created in directory '/backup/mysql/data/2018-05-11_10-44-38/'
MySQL binlog position: filename 'mysql-bin.000003', position '120'
180511 10:44:44 [00] Writing /backup/mysql/data/2018-05-11_10-44-38/backup-my.cnf
180511 10:44:44 [00] ...done
180511 10:44:44 [00] Writing /backup/mysql/data/2018-05-11_10-44-38/xtrabackup_info
180511 10:44:44 [00] ...done
xtrabackup: Transaction log of lsn (1626164) to (1626164) was copied.
180511 10:44:44 completed OK!

上面执行的备份语句会将mysql数据文件(即由my.cnf里的变量datadir指定)拷贝至备份目录下(/backup/mysql/data)

注意:如果不指定--defaults-file,默认值为/etc/my.cnf。

备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data/2018-05-11_10-44-38/),在该目录下存放备份文件。

[root@mysql-db01 ~]# ll /backup/mysql/data/2018-05-11_10-44-38/
total 12316
-rw-r----- 1 root root 480 May 11 10:44 backup-my.cnf
-rw-r----- 1 root root 12582912 May 11 10:44 ibdata1
drwxr-x--- 2 root root 4096 May 11 10:44 mysql
drwxr-x--- 2 root root 4096 May 11 10:44 performance_schema
drwxr-x--- 2 root root 19 May 11 10:44 test
-rw-r----- 1 root root 21 May 11 10:44 xtrabackup_binlog_info
-rw-r----- 1 root root 113 May 11 10:44 xtrabackup_checkpoints
-rw-r----- 1 root root 490 May 11 10:44 xtrabackup_info
-rw-r----- 1 root root 2560 May 11 10:44 xtrabackup_logfile

 

还可以在远程进行全量备份,命令如下:

innobackupex --defaults-file=/etc/my.cnf --user=root  --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data >/backup/mysql/data/bak.log  2>&1
命令说明: --user=root 备份操作用户名,一般都是root用户 --host=127.0.0.1 主机ip,本地可以不加(适用于远程备份)。注意要提前在mysql中授予连接的权限,最好备份前先测试用命令中的用户名、密码和host能否正常连接mysql。 --parallel=2 --throttle=200 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。 /backup/mysql/data 备份存放的目录 >/backup/mysql/data/bak.log 2>&1 备份日志,将备份过程中的输出信息重定向到bak.log

查看备份的目录

[root@xtarbackup data]# ll /backup/mysql/data/
total 32
drwxr-x---. 4 root root 4096 Sep 11 22:49 2017-09-11_22-48-59
-rw-r--r--. 1 root root 26094 Sep 11 22:49 bak.log //备份信息都记录在这个日志里,如果备份失败,可以到这里日志里查询

创建测试数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)


mysql> create database xtra_test;
Query OK, 1 row affected (0.00 sec)

mysql> use xtra_test;
Database changed

mysql> CREATE TABLE person (
    -> number INT(11),
    -> name VARCHAR(255),
    -> birthday DATE
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> CREATE TABLE xtrabackup (number INT(11),name VARCHAR(255),birthday DATE);
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| person              |
| xtrabackup          |
+---------------------+
2 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+
4 rows in set (0.00 sec)

1.5 全量备份后的恢复操作

查看当前数据库状态

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+
4 rows in set (0.00 sec)

mysql> use xtra_test;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| person              |
| xtrabackup          |
+---------------------+
2 rows in set (0.00 sec)

来一次全备

innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/

删除数据库

mysql> drop database xtra_test;
Query OK, 2 rows affected (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

注意:恢复之前

1)要先关闭数据库

2)要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)

查看MySQLd进程

[root@mysql-db01 ~]# ps -ef|grep mysqld
root 9155 1 0 10:08 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --datadir=/application/mysql/data --pid-file=/application/mysql/data/mysql-db01.pid mysql 9863 9155 0 10:08 pts/0 00:00:03 /application/mysql-5.6.35/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/application/mysql/data/mysql-db01.err --open-files-limit=1024 --pid-file=/application/mysql/data/mysql-db01.pid --socket=/tmp/mysql.sock --port=3306 root 24562 24540 0 10:55 pts/4 00:00:00 grep --color=auto mysqld

由上面可以看出mysql的数据和日志存放目录是/application/mysql/data

关闭数据库

[root@xtarbackup mysql]# systemctl stop mysqld
[root@xtarbackup mysql]# pwd
/application/mysql/data
[root@xtarbackup mysql]# ls
auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.sock  performance_schema
#要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)
[root@xtarbackup mysql]# mv /application/mysql/data/* /tmp/
[root@xtarbackup mysql]# ls /application/mysql/data

恢复数据

innobackupex --defaults-file=/etc/my.cnf --user=root --use-memory=1G --apply-log /backup/mysql/data/2017-09-11_23-37-21/
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-09-11_23-37-21/
chown -R mysql.mysql /application/mysql/data

从上面的恢复操作可以看出,执行恢复分为两个步骤:

1)第一步恢复步骤是应用日志(apply-log),为了加快速度,一般建议设置–use-memory(如果系统内存充足,可以使用加大内存进行备份 ),这个步骤完成之后,目录/backup/mysql/data/2017-09-11_23-37-21/下的备份文件已经准备就绪。

2)第二步恢复步骤是拷贝文件(copy-back),即把备份文件拷贝至原数据目录下。

最后,启动mysql,查看数据是否恢复回来了

systemctl start mysqld

查看已恢复的数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+

2.0 增量备份和恢复

特别注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备

2.1 增量备份操作

增量备份需要基于全量备份

先假设我们已经有了一个全量备份(如上面的/backup/mysql/data/2017-09-11_23-37-21/),我们需要在该全量备份的基础上做第一次增量备份。

innobackupex --defaults-file=/etc/my.cnf --user=root  --incremental-basedir=/backup/mysql/data/2017-09-11_23-37-21/ --incremental /backup/mysql/data/

其中:

--incremental-basedir 指向全量备份目录

--incremental 指向增量备份的目录

[root@xtarbackup ~]# ll /backup/mysql/data/
总用量 8
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21  //全量备份目录
drwxr-x---. 5 root root 4096 9  11 23:59 2017-09-11_23-59-49  //增量备份目录

上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2017-09-11_23-59-49),在该目录下存放着增量备份的所有文件。

在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,其中可以查出

1)全量备份的信息如下:


[root@xtarbackup ~]# cd /backup/mysql/data/2017-09-11_23-37-21

[root@xtarbackup 2017-09-11_23-37-21]# cat xtrabackup_checkpoints 
backup_type = full-prepared
from_lsn = 0
to_lsn = 1630141
last_lsn = 1630141
compact = 0
recover_binlog_info = 0

2)基于以上全量备份的增量备份的信息如下:

[root@xtarbackup 2017-09-11_23-59-49]# cd /backup/mysql/data/2017-09-11_23-59-49

[root@xtarbackup 2017-09-11_23-59-49]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1630141
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。

那么,我们是否可以在增量备份的基础上再做增量备份呢?

答案是肯定的,只要把–incremental-basedir指向上一次增量备份的目录即可,如下所示:

[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全备目录
drwxr-x---. 5 root root 4096 9  11 23:59 2017-09-11_23-59-49      //增备目录

//在增备目录的基础上再增量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-09-11_23-59-49/ --incremental /backup/mysql/data/

查看增备之后的目录

[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全备目录
drwxr-x---. 5 root root 4096 9  11 23:59 2017-09-11_23-59-49      //增备目录1
drwxr-x---. 5 root root 4096 9  12 00:28 2017-09-12_00-28-51      //增备目录2

增量备份目录2的from_lsn正好等于增量备份目录1的to_lsn

//全量备份目录
[root@xtarbackup 2017-09-11_23-37-21]# cat xtrabackup_checkpoints 
backup_type = full-prepared
from_lsn = 0
to_lsn = 1630141
last_lsn = 1630141
compact = 0
recover_binlog_info = 0

//增量备份目录1
[root@xtarbackup 2017-09-11_23-59-49]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1630141
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0

//增量备份目录2
[root@xtarbackup 2017-09-12_00-28-51]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1630258
to_lsn = 1630258
last_lsn = 1630258
compact = 0
recover_binlog_info = 0

可以看到,第二次增量备份的from_lsn是从上一次增量备份的to_lsn开始的

2.2 增量备份后的恢复操作

增量备份的恢复要比全量备份复杂很多,增量备份与全量备份有着一些不同,尤其要注意的是:

1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

2)基于所有的备份将未提交的事务进行“回滚”。于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交

第一步是在所有备份目录下重做已提交的日志==(注意备份目录路径要跟全路径)==

其中:

一定要全路径

BASE-DIR 是指全量备份的目录

INCREMENTAL-DIR-1 是指第一次增量备份的目录

INCREMENTAL-DIR-2 是指第二次增量备份的目录,以此类推。

这里要注意的是:

  1.  最后一步的增量备份并没有–redo-only选项!回滚进行崩溃恢复过程
  2. 可以使用–use_memory提高性能。
  3. 以上语句执行成功之后,最终数据在BASE-DIR(即全量目录)下,其实增量备份就是把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原。
  4. 第一步完成之后,我们开始下面关键的第二步,即拷贝文件,进行全部还原!注意:必须先停止mysql数据库,然后清空数据库目录(这里是指/var/lib/mysql)下的文件。
  5. innobackupex –copy-back BASE-DIR
  6. 同样地,拷贝结束之后,记得检查下数据目录(这里指/var/lib/mysql/的权限是否正确(修改成mysql:mysql),然后再重启mysql。

2.3 增量恢复案例说明

假设我们已经有了一个全量备份 2017-09-11_23-37-21 删除在上面测试创建的两个增量备份

[root@xtarbackup data]# pwd
/backup/mysql/data

[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21
drwxr-x---. 5 root root 4096 9  11 23:59 2017-09-11_23-59-49
drwxr-x---. 5 root root 4096 9  12 00:28 2017-09-12_00-28-51

[root@xtarbackup data]# mv 2017-09-11_23-59-49 /tmp/

[root@xtarbackup data]# mv 2017-09-12_00-28-51 /tmp/

[root@xtarbackup data]# ll
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21

假设在全量备份后,mysql数据库中又有新数据写入

[root@xtarbackup data]# mysql

mysql> create database bao;

mysql> use bao;

mysql> create table jia(
    id int3,
    name varchar(20)
    );

mysql> insert into jia values(1,"chen");

mysql> select * from jia;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
+------+------+

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bao                |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+

然后进行一次增量备份:


[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全量备份目录

innobackupex --defaults-file=/etc/my.cnf --incremental-basedir=/backup/mysql/data/2017-09-11_23-37-21/ --incremental /backup/mysql/data/

[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全量备份目录
drwxr-x---. 6 root root 4096 9  12 00:49 2017-09-12_00-49-09      //增量备份目录

接着再在mysql数据库中写入新数据

mysql> use bao;

mysql> insert into jia values(2,"b01");
Query OK, 1 row affected (0.01 sec)

mysql> insert into jia values(3,"j02");
Query OK, 1 row affected (0.02 sec)

mysql> insert into jia values(4,"unix");
Query OK, 1 row affected (0.02 sec)

mysql> select * from jia;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
|    2 | b01  |
|    3 | j02  |
|    4 | unix |
+------+------+

接着在增量的基础上再进行一次增量备份

–incremental-basedir 要写上次最后增量备份的目录

[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全量备份
drwxr-x---. 6 root root 4096 9  12 00:49 2017-09-12_00-49-09
[root@xtarbackup ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-09-12_00-49-09/ --incremental /backup/mysql/data/
[root@xtarbackup ~]# ll /backup/mysql/data/
drwxr-x---. 5 root root 4096 9  11 23:39 2017-09-11_23-37-21      //全量备份
drwxr-x---. 6 root root 4096 9  12 00:49 2017-09-12_00-49-09      //增量备份1
drwxr-x---. 6 root root 4096 9  12 01:10 2017-09-12_01-10-41      //增量备份2

现在 drop 数据库bao 、 xtra_test

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bao                |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+
5 rows in set (0.01 sec)

mysql> drop database bao;
Query OK, 1 row affected (0.03 sec)

mysql> drop database xtra_test;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

接下来就开始进行数据恢复操作:

先恢复应用日志(注意最后一个不需要加–redo-only参数)

# /backup/mysql/data/2017-09-11_23-37-21 是全备目录
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-09-11_23-37-21
 
# /backup/mysql/data/2017-09-11_23-37-21 全备目录 + /backup/mysql/data/2017-09-12_00-49-09 增备目录1
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-09-11_23-37-21 --incremental-dir=/backup/mysql/data/2017-09-12_00-49-09

# /backup/mysql/data/2017-09-11_23-37-21 全备目录 + /backup/mysql/data/2017-09-12_01-10-41 增备目录2
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/mysql/data/2017-09-11_23-37-21 --incremental-dir=/backup/mysql/data/2017-09-12_01-10-41

到此,恢复数据工作还没有结束!还有最重要的一个环节,就是把增量目录下的数据整合到全量备份目录下,然后再进行一次全量还原。

停止mysql数据库,并清空数据目录

stop MySQL service or drop /var/lib/mysql/*

[root@xtarbackup ~]# systemctl stop mysqld

[root@xtarbackup ~]# ll /var/lib/mysql/
-rw-rw----. 1 mysql mysql       56 9  11 23:40 auto.cnf
-rw-r-----. 1 mysql mysql 12582912 9  12 01:55 ibdata1
-rw-r-----. 1 mysql mysql 50331648 9  12 01:55 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 9  11 23:39 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 9  11 23:39 ibtmp1
drwxr-x---. 2 mysql mysql     4096 9  11 23:39 mysql
drwxr-x---. 2 mysql mysql     4096 9  11 23:39 performance_schema
-rw-r-----. 1 mysql mysql      441 9  11 23:39 xtrabackup_info

[root@xtarbackup ~]# rm -fr /var/lib/mysql/*

最后拷贝文件,并给数据目录的mysql.mysql权限

//这里的目录是全备的目录
[root@xtarbackup ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-09-11_23-37-21

查看当前的权限

[root@xtarbackup ~]# ll /var/lib/mysql/
总用量 122892
drwxr-x---. 2 root root       47 9  12 02:28 bao
-rw-r-----. 1 root root 12582912 9  12 02:28 ibdata1
-rw-r-----. 1 root root 50331648 9  12 02:28 ib_logfile0
-rw-r-----. 1 root root 50331648 9  12 02:28 ib_logfile1
-rw-r-----. 1 root root 12582912 9  12 02:28 ibtmp1
drwxr-x---. 2 root root     4096 9  12 02:28 mysql
drwxr-x---. 2 root root     4096 9  12 02:28 performance_schema
-rw-r-----. 1 root root      523 9  12 02:28 xtrabackup_info
drwxr-x---. 2 root root       61 9  12 02:28 xtra_test

更改用户组和用户为mysql.mysql

[root@xtarbackup ~]# chown -R mysql.mysql /var/lib/mysql/*

[root@xtarbackup ~]# ll /var/lib/mysql/
总用量 122892
drwxr-x---. 2 mysql mysql       47 9  12 02:28 bao
-rw-r-----. 1 mysql mysql 12582912 9  12 02:28 ibdata1
-rw-r-----. 1 mysql mysql 50331648 9  12 02:28 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 9  12 02:28 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 9  12 02:28 ibtmp1
drwxr-x---. 2 mysql mysql     4096 9  12 02:28 mysql
drwxr-x---. 2 mysql mysql     4096 9  12 02:28 performance_schema
-rw-r-----. 1 mysql mysql      523 9  12 02:28 xtrabackup_info
drwxr-x---. 2 mysql mysql       61 9  12 02:28 xtra_test

启动数据库

[root@xtarbackup ~]# systemctl start mysqld

登录 mysql 查看结果

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bao                |
| mysql              |
| performance_schema |
| xtra_test          |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from bao.jia;
+------+------+
| id   | name |
+------+------+
|    1 | chen |
|    2 | b01  |
|    3 | j02  |
|    4 | unix |
+------+------+
4 rows in set (0.00 sec)

另外注意:

上面在做备份的时候,将备份目录和增量目录都放在了同一个目录路径下,其实推荐放在不同的路径下,方便管理!

比如:

/backup/mysql/data/full 存放全量备份目录

/backup/mysql/data/daily1 存放第一次增量备份目录

/backup/mysql/data/daily2 存放第二次增量目录

以此类推

在恢复的时候,注意命令中的路径要跟对!

3.0 innobackupex 参数小结

xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。用innobackupex命令,此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。

innobackupex 常用参数说明 --defaults-file 同xtrabackup的--defaults-file参数

--apply-log 
对xtrabackup的--prepare参数的封装

--copy-back 
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;

--remote-host=HOSTNAME 
通过ssh将备份数据存储到进程服务器上;

--stream=[tar] 
备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--tmpdir=DIRECTORY 
当有指定--remote-host or --stream时, 事务日志临时存储的目录,默认采用MySQL配置文件中所指定的临时目录tmpdir

--redo-only --apply-log
组, 强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。

--use-memory= #
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量

--throttle=IOS 
同xtrabackup的--throttle参数

--sleep=
是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;

--compress[=LEVEL] 
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

--include=REGEXP 
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。

--databases=LIST 
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;

--uncompress 
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

--slave-info, 
备份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET 
指定mysql.sock所在位置,以便备份进程登录mysql.

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到