专栏首页Laoqi's Linux运维专列innobackupex备份恢复+增量备份与恢复

innobackupex备份恢复+增量备份与恢复

xtrabackup :

这个备份工具是挺好的,但是有缺陷,只可以备份innodb;但是我们也需要备份myisam,然后就出来了一个工具:innobackupex,也就是我们今天所用的!

一、innobackupex 备份:

1.1 查看数据目录:

[[email protected]03 ~]# ls /data/mysql/
auto.cnf  db1  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql2  performance_schema  test  zhdy01  zhdy02  zhdy03  zhdy-03.err  zhdy-03.pid

其实我们完全可以使用mysqldump去备份myisam和innodb,但是速度有点慢,如果遇到大的数据库很浪费时间!

下面我们就对如上的一些数据进行备份:

1.2 安装percona-xtrabackup工具:

[[email protected]03 ~]# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

[[email protected]03 ~]# yum list | grep percona

[[email protected]03 ~]# yum install percona-xtrabackup -y

1.3 创建一个备份的用户:

先使用root账户登录;

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bakuser'@'localhost' identified by 'zhangduanya';
Query OK, 0 rows affected (0.00 sec)

创建一个bakuser,且授予RELOAD,LOCK TABLES,REPLICATION CLIENT权限。

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

刷新一下权限;

1.4 备份:

首先创建一个备份的目录;
[root@zhdy-03 ~]# mkdir -p /data/backup/

[root@zhdy-03 ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock  /data/backup

[root@zhdy-03 backup]# du -sh *
92M	2017-08-23_21-23-46

如果在备份的时候有任何的错误,它会自动的停止,并输出错误的信息!

1.5 备份对比:

[[email protected]03 backup]# ls /data/mysql/
auto.cnf  db1  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql2  performance_schema  test  zhdy01  zhdy02  zhdy03  zhdy-03.err  zhdy-03.pid

[[email protected]03 backup]# ls /data/backup/2017-08-23_21-23-46/
backup-my.cnf  ibdata1  mysql2              test                    xtrabackup_info     zhdy01  zhdy03
db1            mysql    performance_schema  xtrabackup_checkpoints  xtrabackup_logfile  zhdy02

其实备份的文件+目录几乎是一样的,但是是不可以直接恢复使用的!


二、innobackupex 恢复:

2.1 模拟数据库被删除:

先停掉数据库;
[[email protected] backup]# /etc/init.d/mysqld stop 
Shutting down MySQL.. SUCCESS! 

[[email protected]03 backup]# mv /data/mysql /data/mysql.bak
[[email protected]03 backup]# ls /data/
backup  mysql.bak  wwwroot
[[email protected]03 backup]# mkdir -p /data/mysql
[[email protected]03 backup]# chown -R mysql.mysql /data/mysql

2.2 恢复数据:

[[email protected]03 backup]# innobackupex --use-memory=512M --apply-log 2017-08-23_21-23-46/

-use-memory=512M:意思是恢复数据指定使用的内存为512M;(因为这是虚拟机,所以只是测试,要是线上的服务器64G我们可以使用32G来恢复数据,这样速度会更快些)
--apply-log:指定需要恢复的日志文件

如上我们只是初始化了一下;

2.3 现在进行恢复:

[[email protected]03 backup]# innobackupex --defaults-file=/etc/my.cnf --copy-back ./2017-08-23_21-23-46/

即可恢复咱们的备份到mysql目录。

再次检查:

[[email protected]03 data]# du -sh *
190M	backup
188M	mysql
188M	mysql.bak
132M	wwwroot

三、innobackupex增量备份

3.1 先全量

innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=zhangduanya /data/backup

xtrabackup: Transaction log of lsn (3037472) to (3037472) was copied.
170824 22:57:58 completed OK!

-----------
等待出现如上消息,意味着我们已经对全量备份完毕。

查看全量备份:

[[email protected]03 ~]# ls /data/backup/
2017-08-24_22-57-43

[[email protected]03 ~]# du -sh /data/backup/
92M	/data/backup/

3.2 创建增量备份

再开始之前,我们先模拟增加一个库,这个就是我们所谓的增加的数据!

[[email protected]03 ~]# mysql -uroot -pzhangduanya -e "create database db123"      //创建一个db123库

[[email protected]03 ~]# mysql -uroot -pzhangduanya db123 < /tmp/mysqlbak.sql   //把之前备份的数据恢复得到db123库

第一次增量备份:

[[email protected] ~]# innobackupex --user=bakuser --password='zhangduanya' --incremental /data/backup --incremental-basedir /data/backup/2017-08-24_22-57-43

[[email protected] backup]# du -sh *
92M	2017-08-24_22-57-43
16M	2017-08-24_23-10-21

---------------------------
第一次增量备份的数据只有16M;

3.3 模拟执行第二次增量备份

[[email protected] backup]# mysql -uroot -pzhangduanya -e "create database lalala"

[[email protected]03 backup]# mysql -uroot -pzhangduanya lalala < /tmp/mysqlbak.sql 

[[email protected]03 backup]# ls /data/mysql/
auto.cnf  db123    ib_logfile0  lalala  mysql2              test    zhdy02  zhdy-03.err
db1       ibdata1  ib_logfile1  mysql   performance_schema  zhdy01  zhdy03  zhdy-03.pid

找到我们创建的两个db123,和lalala

[[email protected]03 backup]# innobackupex --user=bakuser --password='zhangduanya' --incremental /data/backup --incremental-basedir /data/backup/2017-08-24_23-10-21

[[email protected]03 backup]# du -sh *
92M	2017-08-24_22-57-43
16M	2017-08-24_23-10-21
17M	2017-08-24_23-41-33

-----------------------------
这里有个注意点,也是困扰很多人的一个关键操作,我们再次做增量备份的时候要基于刚刚已经做了的基础上面再次增量,也就是2017-08-24_23-10-21。也即是说这样这次的增量里面才会有刚刚咱们添加的db123库的信息。

四、增量备份的恢复

4.1 为了还原真实性,我模拟删除数据库,并且停掉mysql,利用咱们已经备份的数据去恢复它。

[[email protected] backup]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 

[[email protected]03 data]# ls
backup  mysql  wwwroot

[[email protected]03 data]# mv /data/mysql/ /data/mysqlbak

[[email protected]03 data]# ls /data/
backup  mysqlbak  wwwroot

[[email protected]03 data]# mkdir /data/mysql

[[email protected]03 data]# ls 
backup  mysql  mysqlbak  wwwroot

为了不容易混淆,我先把backup目录中的这些备份展示出来:

[[email protected]03 backup]# ls
2017-08-24_22-57-43  2017-08-24_23-10-21  2017-08-24_23-41-33

4.2 先初始化全量备份:

[[email protected]03 data]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43

----
/data/backup/2017-08-24_22-57-43:此为咱们第一次全量备份的数据。

4.3 初始化整合第一次的增量:

[[email protected]03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43 --incremental-dir=/data/backup/2017-08-24_23-10-21

4.4 初始化整合第二次的增量:

[[email protected]03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43 --incremental-dir=/data/backup/2017-08-24_23-41-33

4.5 再次把整合好的增量再次初始化一下:

[[email protected]03 backup]# innobackupex --apply-log  /data/backup/2017-08-24_22-57-43

4.6 最后一步恢复:

但是在最后一步出错了:

[[email protected]03 backup]# innobackupex --copy-back  /data/backup/2017-08-24_22-57-43/
170825 00:12:44 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.3.6 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
Error: datadir must be specified.

其原因是,我没有定义/etc/my.cnf中的datadir

[mysqld]

datadir = /data/mysql

这样就可以了!

4.7 然后开始恢复!

[[email protected]03 ~]# innobackupex --copy-back  /data/backup/2017-08-24_22-57-43/

再次检查数据:

[root@zhdy-03 ~]# ls /data/mysql
db1  db123  ibdata1  ib_logfile0  ib_logfile1  lalala  mysql  mysql2  performance_schema  test  xtrabackup_info  zhdy01  zhdy02  zhdy03

刚刚创建的db123和lalala也已经全部恢复!

4.8 启动mysql报错:

[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/zhdy-03.err'.
. ERROR! The server quit without updating PID file (/data/mysql/zhdy-03.pid).

还记得刚刚咱们模拟删除库,自己创建的/data/mysqlm吗?

[[email protected]03 ~]# ls -ld /data/mysql
drwxr-xr-x. 2 root root 6 Aug 24 23:50 /data/mysql
[[email protected]03 ~]# chown -R mysql.mysql /data/mysql

-----
所属者和所属组都属于root,修改为mysql即可。

再次启动:

[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LAMP安装mysql 时遇到的问题汇总

    1: 缺少 libaio 包, libaio是Linux下的一个异步非阻塞方式读写文件的接口。 1 2 3 [[email protect...

    老七Linux
  • mysql架构由小变大的演变过程

    老七Linux
  • 使用mysql-proxy配置mysql读写分离

    老七Linux
  • Spark源码编译

    前置条件: CentOS6.7 JDK1.7+ Maven 3.3.9 Spark2.1.0 1.到spark官网上下载spark2.1.0的源码 ? spar...

    sparkle123
  • Python并发处理

    创建一个线程实例后,需要调用start()让其运行。线程是以系统级别线程的方式执行,由操作系统管理。一旦执行,各个线程独立运行,直到目标函数返回结果,可以使用i...

    py3study
  • UNRAID系统初体验

    Unraid is an operating system for personal and small business use that brings en...

    yuanfan2012
  • 《Zuul篇:001入门篇》

    1.创建SpringBoot工程 2.导入依赖:spring-cloud-starter-netflix-client,spring-cloud-star...

  • IDEA项目上传到github

    达达前端
  • Win7系统把exe文件注册成为系统服务的方法

    在博客IntelliJ IDEA 16 本地LicenseServer激活(破解)中有提到直接把license EXE程序注册为服务,感觉还是把EXE注册为服务...

    用户2146693
  • 让你30分钟快速掌握vue 3

    经过了漫长的迭代,Vue 3.0终于在上2020-09-18发布了,带了翻天覆地的变化,使用了Typescript 进行了大规模的重构,带来了Compositi...

    前端开发博客

扫码关注云+社区

领取腾讯云代金券