MySQL运维之--xtrabackup工具的原理和使用方法

Xtrabackup工具的介绍

xtrabackup是percona公司开发的一款*、免费、开源的一款备份工具,他的备份特点就是:支持热备、备份速度快。

xtrabackup包含两个重要的工具:innobackupex和xtrabackup,两者的区别是:

  xtrabackup只能备份innodb数据表。

  innobackupex支持同时备份innodb和myisam引擎的表,但在备份myisam时需要加一个全局的读锁。

下面我们介绍一下innobackupex备份过程的原理:

MySQL运维之--xtrabackup工具的原理和使用方法

原理如下:

innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;
xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。
xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);
innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。
当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);
xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);
innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。

上面的备份过程中:备份进程只在SQL命令时和数据库有交互,基本不影响数据库的运行。但是我们要明白,在备份非InnoDB时会有一段时间只读(如果没有myisam表,只读时间在几秒钟)。在备份InnoDB数据文件时,对数据库完全没有影响,是真正的热备。

那么xtrabackup备份InnoDB时是如何保证数据一致性的呢?

  InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件来做的,但是实现的方式不同,前者是以page为粒度做的(xtrabackup),后者是 cp 或者 tar 命令(innobackupex),xtrabackup 在读取每个page时会校验 checksum 值,保证数据块是一致的,而 innobackupex 在 cp MyISAM 文件时已经做了flush(FTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的。

增量备份的原理:

innobackupex增量备份主要是针对InnoDB引擎而言,对于myisam和其他的引擎,它仍然是一个全拷贝的过程。

  InnoDB 每个 page 有个 LSN 号,LSN 是全局递增的,page 被更改时会记录当前的 LSN 号,page中的 LSN 越大,说明当前page越新(最近被更新)。每次备份会记录当前备份到的LSN(xtrabackup_checkpoints 文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每个 ibd 文件最终备份出来的是增量 delta 文件。

  MyISAM 是没有增量的机制的,每次增量备份都是全部拷贝的。

  增量备份过程和全量备份一样,只是在 ibd 文件拷贝上有不同。

增量恢复的原理:

恢复的目的是把备份集中的数据恢复到一个一致性位点,所谓一致就是指原数据库某一时间点各引擎数据的状态,比如 MyISAM 中的数据对应的是 15:00 时间点的,InnoDB 中的数据对应的是 15:20 的,这种状态的数据就是不一致的。PXB 备份集对应的一致点,就是备份时FTWRL的时间点,恢复出来的数据,就对应原数据库FTWRL时的状态。

  因为备份时 FTWRL 后,数据库是处于只读的,非 InnoDB 数据是在持有全局读锁情况下拷贝的,所以非 InnoDB 数据本身就对应 FTWRL 时间点;InnoDB 的 ibd 文件拷贝是在 FTWRL 前做的,拷贝出来的不同 ibd 文件最后更新时间点是不一样的,这种状态的 ibd 文件是不能直接用的,但是 redo log 是从备份开始一直持续拷贝的,最后的 redo 日志点是在持有 FTWRL 后取得的,所以最终通过 redo 应用后的 ibd 数据时间点也是和 FTWRL 一致的。

  所以恢复过程只涉及 InnoDB 文件的恢复,非 InnoDB 数据是不动的。备份恢复完成后,就可以把数据文件拷贝到对应的目录,然后通过mysqld来启动了。
上面介绍完了xtrabackup的原理之后,我们可以学习一下如何使用他们:
如何使用呢?
讲全备的过程。
1、我们这里使用yum源来一键安装。
shell> yum install xtrabackup -y

注意:这里需要给大家讲一下:使用yum源安装的xtrabackup是2.6版本的,这个版本可能比较旧,对于我的mysql5.7.24版本来说xtrabackup可能有点旧,所以无法使用,直接报版本过低的错误。后来我又在官网上下载最新的xtrabackup来使用。这里是先把旧的xtrabackup2.6版本给卸载了,然后下载2.7版本使用rpm -i方式安装:https://www.percona.com/downloads/XtraBackup/  (需要解决依赖,建议是先使用yum安装2.6版本,然后卸载2.6版本,再通过官网下载rpm2.6版本的包来安装即可)

2、使用mysql
这里使用xtrabackup的时候需要你提供mysql的账号密码才行。一般练习是使用root用户可以,但是生产环境下我们大多数使用一般用户,因此这个用户需要有这几个权限:(同时/etc/my.cnf要有innodb_file_per_table等参数指示。)
mysql>CREATE USER 'backup'@'%' IDENTIFIED BY '';
mysql>GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,CREATE TABLESPACE,SUPER ON *.* TO 'backup'@'%';

3、接下来我们创建一个测试环境:(我这里使用root用户演示)

  1. 创建一个数据库“chen”,一个表“chaofeng”,然后插入一点数据
    MySQL [chen]> show tables;
    +----------------+
    | Tables_in_chen |
    +----------------+
    | chaofeng |
    +----------------+
    1 row in set (0.00 sec) MySQL [chen]> select * from chaofeng;
    +------+------+
    | id | name |
    +------+------+
    | 1 | chen |
    | 2 | chao |
    | 3 | feng |
    +------+------+
    3 rows in set (0.00 sec)
  2. 然后创建一个目录/data/mysql_bak,这个目录的作用是把xtrabackup的备份文件放在此处。因此这个目录要有mysql用户可以写入文件的权限。我这里把这个目录修改用户和组为mysql
    
    
    [root@:vg_adn_tidbCkhsTest /data]#mkdir /data/mysql_bak
    [root@:vg_adn_tidbCkhsTest /data]#chown mysql:mysql mysql_bak/
  3. 此时MySQL为运行状态。接着我们开始进行备份
    [root@:vg_adn_tidbCkhsTest /data]#innobackupex --user=root --password=1234567 -P 3306 -S /tmp/mysql.sock /data/mysql_bak
    181230 13:41:57 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully.
    At the end of a successful backup run innobackupex
    prints "completed OK!". Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
    181230 13:41:57 Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: /tmp/mysql.sock
    Using server version 5.7.24

    181230 13:41:59 [01] Copying ./performance_schema/session_variables.frm to /data/mysql_bak/2018-12-30_13-41-57/performance_schema/session_variables.frm
    181230 13:41:59 [01] ...done
    181230 13:41:59 [01] Copying ./chen/db.opt to /data/mysql_bak/2018-12-30_13-41-57/chen/db.opt
    181230 13:41:59 [01] ...done
    181230 13:41:59 [01] Copying ./chen/chaofeng.frm to /data/mysql_bak/2018-12-30_13-41-57/chen/chaofeng.frm
    181230 13:41:59 [01] ...done
    181230 13:41:59 Finished backing up non-InnoDB tables and files
    181230 13:41:59 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
    xtrabackup: The latest check point (for incremental): '2602112'
    xtrabackup: Stopping log copying thread.
    .181230 13:41:59 >> log scanned up to (2602121)

    181230 13:41:59 [00] ...done
    xtrabackup: Transaction log of lsn (2602112) to (2602121) was copied.
    181230 13:41:59 completed OK!

    当我们看到最后这一行内容的时候,表示备份成功。备份数据会在备份目录下创建一个以当前日期为名字的目录。如果不想要这样的以日期命名的目录。可以加上--no-timestamp参数。

  4. 我们来这个备份的目录看一下。
    [root@:vg_adn_tidbCkhsTest /data/mysql_bak]#ls
    2018-12-30_13-41-57/
    [root@:vg_adn_tidbCkhsTest /data/mysql_bak]#ls 2018-12-30_13-41-57/
    backup-my.cnf chen ib_buffer_pool ibdata1 mysql performance_schema sys xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
    我们对这几个配置文件解析一下:
    backup-my.cnf:备份命令用到的配置选项信息
    ibdata1:备份的表空间文件
    xtrabackup_info:备份用到的一些配置信息。
    xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态、LSN等
    xtrabackup_logfile:备份的重做日志文件

  5、准备(prepare)一个完全备份

    一般情况下,在备份完成后,备份的数据尚且还不能用于恢复操作,因为备份数据的过程中可能包含还没有提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时的数据文件仍处于不一致状态。“准备”的主要作用就是通过回滚未提交的事务及同步已经提交的事务至数据文件也是的数据文件处于一致性状态。

    参数是--apply-log

  • [root@:vg_adn_tidbCkhsTest /data]#innobackupex --apply-log --use-memory=10G /data/mysql_bak/2018-12-30_13-41-57/
    181230 14:07:30 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully.
    At the end of a successful apply-log run innobackupex
    prints "completed OK!".
    innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
    xtrabackup: cd to /data/mysql_bak/2018-12-30_13-41-57/
      InnoDB: FTS optimize thread exiting.
      InnoDB: Starting shutdown...
      InnoDB: Shutdown completed; log sequence number 2602536
      181230 14:07:38 completed OK!

  当看到最后一行的时候,表示备份成功了。

  6、再来看一下此目录下的文件

  • [root@:vg_adn_tidbCkhsTest:34.202.241.16:172.31.26.133 /data/mysql_bak/2018-12-30_13-41-57]#ls
    backup-my.cnf ib_buffer_pool ib_logfile0 ib_logfile2 mysql sys xtrabackup_info
    chen ibdata1 ib_logfile1 ibtmp1 performance_schema xtrabackup_checkpoints xtrabackup_logfile

    此时这个目录下面多了不少文件,并且体积也增大了。

  7、接下来我们就模拟一个数据库损坏来还原数据库。

   恢复备份到MySQL的数据文件目录,这一过程要关闭MySQL数据库,重命名原数据库文件目录,再创建一个新的数据文件目录,将备份数据复制到新的数据文件目录下,赋予权限,再启动MySQL数据库。

  • 接下来我们演示一下步骤
    [root@:vg_adn_tidbCkhsTest /data]#ls
    data_mysql data_mysql.csv data_tidb lost+found mysql_bak
    [root@:vg_adn_tidbCkhsTest /data]#mv data_mysql data_mysql_bak     #将原来的MySQL数据目录移动并重命名。
    [root@:vg_adn_tidbCkhsTest /data]#mkdir data_mysql                                      #重新创建MySQL的数据目录
    [root@:vg_adn_tidbCkhsTest /data]#innobackupex --copy-back --rsync /data/mysql_bak/2018-12-30_13-41-57/ #开始备份
    181230 14:55:35 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully.
    At the end of a successful copy-back run innobackupex
    prints "completed OK!". innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
    181230 14:55:35 [] Copying ib_logfile0 to /data/data_mysql/ib_logfile0
    181230 14:55:35 [] ...done
    181230 14:55:35 [] Copying ib_logfile1 to /data/data_mysql/ib_logfile1
    181230 14:55:36 [] ...done
    181230 14:55:37 [] Copying ib_logfile2 to /data/data_mysql/ib_logfile2
    181230 14:55:38 [] ...done
    181230 14:55:38 [] Copying ibdata1 to /data/data_mysql/ibdata1
    181230 14:55:38 [] ...done
    181230 14:55:38 [] Copying ./xtrabackup_info to /data/data_mysql/xtrabackup_info

    181230 14:55:39 [01] Copying ./chen/chaofeng.frm to /data/data_mysql/chen/chaofeng.frm
      181230 14:55:39 [01] ...done
      181230 14:55:39 completed OK!                                                                        #表示备份成功

    接下来我们授权data目录并重启MySQL

    [root@:vg_adn_tidbCkhsTest /data]#chown -R mysql:mysql ./data_mysql
    [root@:vg_adn_tidbCkhsTest /data]#service mysql start
    Starting MySQL. SUCCESS!
    [root@:vg_adn_tidbCkhsTest /data]#mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    Your MySQL connection id is 3
    MySQL [(none)]> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | chen |
    | mysql |
    | performance_schema |
    | sys |
    +--------------------+
    5 rows in set (0.00 sec) MySQL [(none)]> use chen
    Database changed
    MySQL [chen]> show tables;
    +----------------+
    | Tables_in_chen |
    +----------------+
    | chaofeng |
    +----------------+
    1 row in set (0.00 sec) MySQL [chen]> select * from chaofeng;
    +------+------+
    | id | name |
    +------+------+
    | 1 | chen |
    | 2 | chao |
    | 3 | feng |
    +------+------+
    3 rows in set (0.01 sec)

    授权这一步很重要,否则我们没有权限从而无法启动MySQL服务器。

   可以看出来我们已经恢复数据成功了。

讲只备份一个数据库的过程

  有时候我们只备份一个数据库,如果出现问题了,那我们也仅仅恢复这一个数据库  

  1、首先是我们备份一个数据库:

[root@:vg_adn_tidbCkhsTest /data]#mkdir haha
[root@:vg_adn_tidbCkhsTest /data]#innobackupex --user=root --password=1234567 -P 3306 --databases=chen /data/haha/
181230 15:11:07 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!". Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
181230 15:11:07 Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: not set
xtrabackup: Transaction log of lsn (2602555) to (2602564) was copied.
181230 15:11:09 completed OK!
[root@:vg_adn_tidbCkhsTest /data]#ls
data_mysql data_mysql_bak data_mysql.csv data_tidb haha lost+found mysql_bak
[root@:vg_adn_tidbCkhsTest /data]#du -sh haha
13M haha
[root@:vg_adn_tidbCkhsTest /data]#innobackupex --apply-log --use-memory=10G /data/haha
181230 15:13:00 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully.
At the end of a successful apply-log run innobackupex
prints "completed OK!".
InnoDB: Shutdown completed; log sequence number 2603048
181230 15:13:24 completed OK!
[root@:vg_adn_tidbCkhsTest /data]#du -sh haha
417M haha
[root@:vg_adn_tidbCkhsTest /data]#cd haha
[root@:vg_adn_tidbCkhsTest /data/haha]#ls
2018-12-30_15-11-07
[root@:vg_adn_tidbCkhsTest /data/haha]#cd 2018-12-30_15-11-07/
[root@:vg_adn_tidbCkhsTest /data/haha/2018-12-30_15-11-07]#ls
backup-my.cnf ib_buffer_pool ib_logfile0 ib_logfile2 xtrabackup_checkpoints xtrabackup_logfile
chen ibdata1 ib_logfile1 ibtmp1 xtrabackup_info

  2、接下来我们登陆MySQL把这个chen数据库删除了,这里不再演示删除操作。

  3、然后把mysql服务器停止了。开始进行恢复操作,这里需要注意的是恢复的目录是MySQL的数据目录,但是此时数据目录下有文件,不是空目录,因此不能进行恢复,所以我们选择一个新建的空目录进行恢复,恢复完成后,把要恢复的数据库移动到MySQL的data目录下,同时也要把恢复目录下的ibdata1 ,ib_logfile*的这几个文件替换掉data目录下的这几个文件,否则mysql无法识别,即使启动之后我们看到了已经恢复了的数据库和表,但是表里面仍然没有数据。原因就在这几个文件的重要性。

  4、这样子重启机器之后我们就看到了已经恢复的单个数据库了,但是这样的方法是有一定的问题的:比如数据库很多的情况下我们怎么样才能只备份innodb引擎的数据库呢?(因为全备意味着也要备份myisam引擎,此时会有几秒mysql处于lock状态,影响读写)

讲增量备份

  在MySQL进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份时基于上一次的增量备份。

  1、创建基础备份base。(注意,由于我进行备份的时候没有加上--no-timestamp参数,因此我在恢复备份数据的时候目录下要加上xtrabackup自动添加的目录才行,详细看下面)

[root@:vg_adn_tidbCkhsTest /data]#mkdir base
[root@:vg_adn_tidbCkhsTest /data]#mysql -u root -p1234567
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.24 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> use chen
Database changed
MySQL [chen]> select * from chaofeng;
+------+------+
| id | name |
+------+------+
| 1 | chen |
| 2 | chao |
| 3 | feng |
+------+------+
3 rows in set (0.00 sec) MySQL [chen]> exit
Bye
[root@:vg_adn_tidbCkhsTest /data]#innobackupex --defaults-file=/etc/my.cnf --user=root --password=1234567 -P 3306 /data/base/
181230 16:21:43 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully.
xtrabackup: Transaction log of lsn (2613322) to (2613331) was copied.
181230 16:21:46 completed OK!

  2、在数据库chen下再增加一些数据

MySQL [chen]> insert into chaofeng values (4,'xiaoming'),(5,'xiaohong');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 MySQL [chen]> select * from chaofeng;
+------+----------+
| id | name |
+------+----------+
| 1 | chen |
| 2 | chao |
| 3 | feng |
| 4 | xiaoming |
| 5 | xiaohong |
+------+----------+
5 rows in set (0.00 sec)

  3、创建增量备份incre_one

[root@:vg_adn_tidbCkhsTest /data]#mkdir incre_one
[root@:vg_adn_tidbCkhsTest /data]#innobackupex --defaults-file=/etc/my.cnf --user=root --password=1234567  -P 3306 --incremental /data/incre_one --incremental-basedir=/data/base/2018-12-30_16-21-43/
181230 16:26:54 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!". Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
181230 16:26:54 Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: not set

  4、在test库下再次添加一些数据

MySQL [chen]> insert into chaofeng values(6,'xiaozhag'),(7,'xiaowang'),(8,'laoli');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0 MySQL [chen]> select * from chaofeng;
+------+----------+
| id | name |
+------+----------+
| 1 | chen |
| 2 | chao |
| 3 | feng |
| 4 | xiaoming |
| 5 | xiaohong |
| 6 | xiaozhag |
| 7 | xiaowang |
| 8 | laoli |
+------+----------+
8 rows in set (0.00 sec)

  5、继续创建增量备份incre_two

[root@:vg_adn_tidbCkhsTest /data/incre_one]#mkdir incre_two
[root@:vg_adn_tidbCkhsTest /data/incre_one]#innobackupex --defaults-file=/etc/my.cnf --user=root --password=1234567 -P 3306 --incremental /data/incre_two --incremental-basedir=/data/incre_one/2018-12-30_16-48-27/
181230 16:52:01 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully.

  6、我们已经创建好增量备份了,然后我们开始进行恢复

  主要有三个步骤:

    1、恢复基础备份(全备)

    2、恢复增量备份到基础备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份去掉--redo-only参数)

    3、对整体的基础备份进行恢复,回滚哪些未提交的数据。

  7、恢复基础备份(一定要加上--redo-only参数,表示只应用xtrabackup日志中已经提交的事务数据,不回滚还未提交的数据)

[root@:vg_adn_tidbCkhsTest /data/base]#innobackupex  --apply-log --redo-only --use-memory=10G /data/base/2018-12-30_16-44-07/
181230 17:03:45 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully.

  8、将增量备份incre_one应用到基础备份base

[root@:vg_adn_tidbCkhsTest /data/base]#innobackupex  --apply-log --redo-only --use-memory=10G /data/base/2018-12-30_16-44-07/  --incremental-dir=/data/incre_one/2018-12-30_16-48-27/
181230 17:06:02 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully.

  9、将增量备份incre_two应用到基础备份base里面(注意这是最后一个增量备份,因此需要去掉--redo-only参数)

[root@:vg_adn_tidbCkhsTest /data/base]#innobackupex  --apply-log --use-memory=10G /data/base/2018-12-30_16-44-07/  --incremental-dir=/data/incre_two/2018-12-30_16-52-01/

  10、把所有合在一起的基础备份整体进行一次apply操作,回滚未提交的数据。

[root@:vg_adn_tidbCkhsTest /data/base]#innobackupex  --apply-log --use-memory=10G /data/base/2018-12-30_16-44-07/
181230 17:11:10 innobackupex: Starting the apply-log operation

  11、开始关闭MySQL服务器。然后把恢复完的数据移动到MySQL的data数据目录下,授权mysql用户和组,然后启动。

[root@:vg_adn_tidbCkhsTest /data/base]#service mysql stop
Shutting down MySQL.. SUCCESS!
[root@:vg_adn_tidbCkhsTest /data/base]#cd ..
[root@:vg_adn_tidbCkhsTest /data]#ls
base data_mysql data_mysql_bak data_mysql.csv data_tidb incre_one incre_two lost+found mysql_bak
[root@:vg_adn_tidbCkhsTest: /data]#mv data_mysql data_mysql_bak2
[root@:vg_adn_tidbCkhsTest /data]#mkdir data_mysql
[root@:vg_adn_tidbCkhsTest /data]#innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/base/2018-12-30_16-44-07/
181230 17:15:06 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully.
181230 17:15:10 [] ...done
181230 17:15:10 completed OK!
[root@:vg_adn_tidbCkhsTest /data]#du -sh base
430M base
[root@:vg_adn_tidbCkhsTest /data]#chown -R mysql:mysql ./data_mysql
[root@:vg_adn_tidbCkhsTest /data]#service mysql start
Starting MySQL. SUCCESS!
[root@:vg_adn_tidbCkhsTest/data]#mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g. MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| chen |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec) MySQL [chen]> select * from chen.chaofeng;
+------+-----------+
| id | name |
+------+-----------+
| 1 | chen |
| 2 | chao |
| 3 | feng |
| 4 | xiaoming |
| 5 | xiaohong |
| 6 | xiaozhang |
| 7 | xiaowang |
| 8 | laoli |
+------+-----------+
8 rows in set (0.01 sec)

至此,我们的增量备份就恢复成功了,我们已经看到数据已经完好的显示出来了。

关于原理大家也可以参考这个连接:https://www.cnblogs.com/yuyue2014/p/3705448.html

上一篇:JavaScript数组循环遍历之forEach


下一篇:JavaScript中数组中遍历的方法