MySQL备份与还原(二)

今天给大家带来了,如何使用xtrabackup针对mysql实现备份的三种方式。

 第一种:xtrabackup完全备份+binlog增量备份

 第二种:xtrabackup完全备份+xtrabackup增量备份

 第三种:innobackupex全库备份+innobackupex增量备份

   如果想知道,mysqldump的具体备份方法及binlog数据的恢复,可以点击下方链接进行查看:

mysqldump备份与binlog恢复:http://blog.csdn.net/kangshuo2471781030/article/details/79110423

一、使用xtrabackup进行MySQL数据库备份

简介:

之前在MySQL备份与还原(一)里面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那在使用mysqldump备份就不太合适了。

这时就需要一种好用又高效的的工具:xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。

xtrabackup实现是物理备份,而且是物理热备。

目前主流的的有两个工具可以实现物理热备:ibackupxtrabackup。

ibackup是商业软件,需要授权,非常昂贵。而xtrabackup功能比ibbackup还要强大,但却是开源的。

所以我们这里就来介绍xtrabackup的使用:

注:xtrabackup提供了两种命令行工具:

(1.)xtrabackup:专用于备份InnoDB和XtraDB引擎的数据。是用于热备份innodb,xtradb表中数据的工具,支持在线热备份,可以在不加锁的情况下备份innodb数据表,不过此工具不能操作MyISAM引擎表。

(2.)innobackupex:这是将xtrabackup进行封装的perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。能够同时处理innodb和myisam,但在处理Myisam时需要加一个读锁。

由于操作MyIsam时需要加读锁,这会堵塞线上服务的写操作,而Innodb没有这样的限制,所以数据库中Innodb表类型所占的比例越大,则越有利。

xtrabackup是由percona提供的mysql数据库备份工具,特点:

(1.)备份过程快速、可靠;

(2.)备份过程不会打断正在执行的事务;

(3.)能够基于压缩等功能节约磁盘空间和流量;

(4.)自动实现备份检验;

(5.)还原速度快

官网链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用YUM进行安装或者下载二进制源码包。

1.安装xtrabackup

   (1.)下载xtrabackup

wgethttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz


(2.)解压xtrabackup


(3.)进入到解压目录,复制bin下的所有程序到/usr/bin/里面去

[root@kang ~]# cd percona-xtrabackup-2.4.4-Linux-x86_64/
[root@kang percona-xtrabackup-2.4.4-Linux-x86_64]# ls
bin  man  percona-xtrabackup-2.4-test
[root@kang percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
[root@kang percona-xtrabackup-2.4.4-Linux-x86_64]# 
(4.)安装xtrabackup相关的插件

[root@kang ~]# yum -y  install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 


(5.)下载percona-toolkit并安装

 wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm


[root@kang ~]# rpm  -ivh percona-toolkit-2.2.19-1.noarch.rpm 

xtrabackup的版本号:

[root@kang ~]# xtrabackup -version
xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
通过上面图片说明,xtrabackup已经成功安装好了!!

那么,接下来就可以来演示基于xtrabackup工具实现三种备份方式:

方案一:xtrabackup完全备份+binlog增量备份

1. xtrabackup完全备份

(1.)创建备份目录:
[root@kang ~]# mkdir -p /opt/mysqlbackup/full
[root@kang ~]# mkdir -p /opt/mysqlbackup/inc
[root@kang ~]# ls /opt/mysqlbackup/
full  inc
[root@kang ~]# 
注: 
full:全备存放的目录; inc:增量备份存放的目录

(2.)开始完全备份
[root@kang ~]# innobackupex --user=root --password=pwd123 /opt/mysqlbackup/full/
注意:--defaults-file=/etc/my.cnf指定mysql的主配置文件,如果指定则必须是第一个参数

出现如下图所示,表示完全备份成功!!


备份后产生的文件:

在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件。

各文件说明:
xtrabackup_checkpoints :备份类型(如完全和增量)、备份状态(如是否已经为preprepared状态)和LSN(日志序列号)范围信息;
每个innodb页(通常为16k大小)都会包含一个日志系列号,即LSN。LSN是整个数据库系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
xtrabackup_binlog_info:mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_binlog_pos_innodb:二进制日志文件及用于innodb或XtraDB表的二进制日志文件的当前position
xtrabackup_binary:备份中用到的xtrabackup的可执行文件;
backup-my.cnf:备份命令用到的配置选项信息;

在使用innobackupex进行备份时,还可以使用 --no-timestamp选项来阻止命令自动创健一个以时间命名的目录;如此一来,innobackupex命令将会创建一个backup-dir目录来存储备份数据

注意:相关选项说明:
其中 --user:指定连接数据库的用户名。
       --password:指定连接数据库的密码。
       --defaults-file:指定数据库的配置文件。
      innobackupex:要从中获取datadir的信息;
       --database:指定要备份的数据库,这里指定的数据库只对MyIsam表有效,对于InnoDB数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样);  
     /opt/mysqlbackup/full:是备份文件的存放位置。   

注意:备份数据库的用户需要具有相应的权限,如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
mysql> create user 'bkpuser'@'localhost' identified by '123456';
mysql> revoke all privileges,grant option from 'bkpuser'@'localhost';
mysql> grant reload,lock tables,replication client, process on *.* to 'bkpuser'@'localhost';
mysql> flush privileges;
(3.)向完全备份后的mysql数据库插入几条数据进行更改,然后进行二进制日志增量备份

查看完全备份时binlog日志位置(position):

[root@kang ~]# cat /opt/mysqlbackup/full/2018-01-21_03-15-24/xtrabackup_binlog_info 

mysql-bin.000002        1178
    模拟数据库修改:


2.binlog二进制文件增量备份

[root@kang ~]# mysqlbinlog  --start-position=1178  /usr/local/mysql/data/mysql-bin.000002 > /opt/mysqlbackup/inc/`date  +%F`.sql
[root@kang ~]# 
 
注意:上面1178这个位置数字是根据查看完全备份binlog二进制日志文件得来的!!!


xtrabacku p完全备份+binlog增量备份已经做完。接下来模拟数据的损坏我们来进行数据的还原。

我们这里直接使用删除数据目录文件来模拟损坏


[root@kang ~]# rm  -rf  /usr/local/mysql/data/*
    首先我们来还原完全备份:

(1.)准备(prepare)一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。
“准备(prepare)“的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
在准备(prepare)过程结束后,innodb表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始的点。 

innobackupex命令的--apply-log选项可用于实现上述功能。

--apply-log:指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中;  

[root@kang ~]# innobackupex --apply-log /opt/mysqlbackup/full/2018-01-21_03-15-24/
注:/opt/mysqlbackup/full/2018-01-21_03-15-24/:备份文件的路径及名称
出现如下图信息所示,说明执行成功!
在实现准备(prepare)的过程中,innobackupex通常还可以使用--user-memory选项来指定其可以使用的内存的大小,
默认通常为 100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至服务器datadir目录中
来执行恢复过程。innobackupex通过backup-my.cnf来获取datadir目录的相关信息。

(2.)还原数据库语法及恢复数据:

[root@kang ~]# innobackupex --copy-back /opt/mysqlbackup/full/2018-01-21_03-15-24/
注:这里的--copy-back指明是进行数据恢复。 
      数据恢复完成之后,需要修改相关文件的权限mysql数据库才能正常启动!!!!
如果出现如下图所示,说明执行成功!!!
请确保如上的信息的最后一行出现”Completed OK!“

修改还原后的数据目录文件权限:

当数据恢复至datadir目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld
之前还需要事先修改数据文件的属主和属组。

[root@kang ~]# chown  -R mysql:mysql /usr/local/mysql/
重新启动mysql数据库:
[root@kang ~]# systemctl  restart mysqld
 登录mysql数据库验证还原后的数据:
[root@kang ~]# mysql -uroot -p -e "select * from t370.test";
Enter password: 
   
(3.)还原增量备份:

为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原:

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
[root@kang ~]# mysql -uroot -p -e "source /opt/mysqlbackup/inc/2018-01-21.sql";
Enter password: 
[root@kang ~]# 
    重新启动二进制日志并验证还原数据:
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

mysql> 

 验证数据是否恢复回来:


方案二、xtrabackup完全备份+xtrabackup增量备份


前面我们进行 增量备份时,使用的还是老方法:备份二进制日志。其实xtrabackup还支持进行增量备份。

先介绍下xtrabackup的备份原理:

在innoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件(transaction log,事务日志)。
事务日志会存储每一个innoDB表数据的记录修改。当innoDB启动时,InnoDB会检查数据文件和 事务日志,并执行两个步骤:它应用已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

xtrabackup在启动时会记住log sequence number (LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。这就是xtrabackup的备份过程

所以每个innoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面是的LSN就会自动增长。这正是innoDB的crash-recovery功能。它会复制innoDB的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用 crash-recovery,使得数据恢复一致。当innodb启动的时候,它会先去检查data file和transaction log,并且会做两步操作:

1.It appliescommitted transaction logentries to the data files

2.it performsan undo operation on anytransactions that modified data but did not commit.

所以在prepare(准备)过程中,xtrabackup使用复制到的transaction log对备份出来的innodb data file 进行crash-recovery。

测试环境准备:
创建一个测试数据库,并创建一张表输入几行数据。

1.xtrabackup完全备份

(1.)执行完全备份
[root@kang ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password="pwd123" --port=3306 --backup --target-dir=/opt/mysqlbackup/full/full_incre_$(date  +%Y%m%d_%H%M%S)
   如果出现如下图所示信息,说明执行成功!!!
其中,--defaults-file指定数据库的配置文件,如果使用该参数必须做为第一个参数;
          --user:指定连接数据库的用户名;
         --password:指定连接数据库的密码;
         --port:指定连接数据库的端口号;
        --backup:实施备份到target-dir;
        --target-dir=name:备份文件的存放目录路径;
        innobackupex:要从其中获取datadir等信息;
        --database:指定要备份的数据库,这里指定的数据库只对Myisam表和InnoDB表的表结构有效,对于Innodb数据来说都是全备(所有数据库中的Innodb数据都进行了备份,不是只备份指定的数据库,恢复时也一样);
  /opt/mysqlbackup/full/:是备份文件的存放位置

(2.)查看完全备份文件:
[root@kang ~]# ls -l /opt/mysqlbackup/full/
total 8
drwxr-x---. 6 root root 4096 Jan 21 03:54 2018-01-21_03-15-24
drwxr-x---. 7 root root 4096 Jan 21 05:12 full_incre_20180121_051204
[root@kang ~]# 
2.xtrabackup增量备份
   
(1.)先录入些数据,实现第一次增量数据:

(2.)再进行增量备份
[root@kang ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password='pwd123' --port=3306 
--backup --target-dir=/opt/mysqlbackup/inc/incre_$(date  +%Y%m%d%_%H%M%S) 
--incrementalbasedir=/opt/mysqlbackup/full/full_incre_20180121_051204
  如果出现如下图所示,说明执行成功!!!
其中,--incremental-basedir指定上次完整备份或者增量备份文件的位                 置 (即如果是第一次增量备份则指向完全备份所在目录,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir
应该指向上一次的增量备份所在的目录)。

查看第一次增量备份文件:
[root@kang ~]# ls  -l /opt/mysqlbackup/inc/
total 8
-rw-r--r--. 1 root root 2843 Jan 21 03:30 2018-01-21.sql
drwxr-x---. 7 root root 4096 Jan 21 05:41 incre_20180121%H4106

注意:这里的增量备份其实只针对的是innoDB,对于MyIsam来说,还是完整备份。

(3.)向表中再插入几行数据,继续  第二次增量备份。

(4.)进行第二次增量备份
[root@kang ~]#  xtrabackup --defaults-file=/etc/my.cnf --user=root --password="pwd123" --port=3306 --backup
 --target-dir=/opt/mysqlbackup/inc/incre_$(date  +%Y%m%d_%H%M%S)
 --incremental-basedir=/opt/mysqlbackup/inc/incre_20180121%H4106

如果出现下图信息,说明执行成功!!!!

注:第二次增量备份--incremental-basedir指向上一次增量备份文件的位置。
查看第二次增量备份的文件:


3.xtrabackup进行增量恢复

为了模拟故障,先删除增量之前的表里面的数据。


(1.)完整备份恢复:
在进行恢复前,如果完整备份在远程主机上,首先将完整备份复制到本地主机上,如果是tar包,则需要先解包,解包命令
为:tar -izxf xxxx.tar.gz ,这里必须使用-i参数(忽略存档中的0字节块(通常意味着文件结束))。

开始全备恢复:
[root@kang ~]#  xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123456" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_20180121_051204/

如果出现如下图所示信息,证明执行成功!!!

(2.)恢复到第一次增量的时刻
增量备份恢复的步骤和完整备份恢复的步骤基本一致,只是应用日志的过程稍有不同。
增量备份恢复时,是先将所有的增量备份挨个应用到完整备份的数据文件中,然后再将完整备份中的数据恢复到数据库中 。
[root@kang ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="pwd123" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_20180121_051204/ --incremental-dir=/opt/mysqlbackup/inc/incre_20180121%H4106/
出现如下图所示,证明执行成功了!!!!


(3.)恢复到第二次增量备份前面
[root@kang ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="pwd123" 
 --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_20180121_051204/ 
 --incremental-dir=/opt/mysqlbackup/inc/incre_20180121_063727/
出现下图信息,证明执行成功了!!!

4.恢复整个数据库(即全库备份恢复)
[root@kang ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=root --password="123456" 
--target-dir=/opt/mysqlbackup/full/full_incre_20180121_051204/
如果出现如下图所示信息,说明执行成功!!!


(1.)然后停止mysql数据库
[root@kang ~]# systemctl  stop mysqld
(2)开始rsync数据文件:
[root@kang ~]# cd  /opt/mysqlbackup/full/full_incre_20180121_051204/
[root@kang full_incre_20180121_051204]# rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /usr/local/mysql/data/
当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysql之前还需要事先修改数据文件的属主和属组。

(3.)授权mysql访问权限

[root@kang ~]# chown -R mysql:mysql /usr/local/mysql/
(4.)启动mysql服务
[root@kang ~]# systemctl  start mysqld
验证:
登录mysql数据库,查看到以前做完完整备份之后删除的数据,已经通过两次增量备份恢复过来了

如下所示:
通过上图所示,xtrabackup完整备份+xtrabackup增量备份已经成功演示完了!!!!


方案三:innobackupex全库备份+innobackupex增量备份

相对前两种方案一样,都是事先准备好测试环境,
创建一个测试数据库,并创建一张表输入几行数据

1.innobackupex全库备份

[root@kang ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="pwd123" /opt/backup/full/full_incre_$(date  +%Y%m%d_%H%M%S) --no-timestamp
 出现如下图所示信息,说明执行成功了!!!
(1.)查看全库备份文件信息


2.innobackupex增量备份

(1.)做第一次增量备份

   先录入增量数据:

再进行增量备份:
 innobackupex --incremental /opt/backup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/backup/full/full_incre_20180121_084345/ --user=root --password="pwd123" --no-timestamp
如果出现下图所示信息,说明执行成功!!!
(2.)查看增量备份文件

(3.)基于全备和第一次增量备份来做第二次增量备份

 同样先录入点增量数据:

开始进行第二次增量备份:

[root@kang ~]# innobackupex --incremental /opt/backup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/backup/inc/incre_20180121_085151/ --user=root --password="pwd123" --no-timestamp
如果出现如下图所示,证明执行成功!!!



(4.)查看第二次增量备份的文件

3.innobackupex增量恢复

先模拟数据误删除或者数据损坏丢失,用来做恢复验证


(1.)开始做恢复,恢复全库备份
[root@kang ~]# innobackupex --apply-log --redo-only /opt/backup/full/full_incre_20180121_084345/
如果出现下图所示信息,证明执行成功!!!
--redo-only用于准备增量备份内容把数据合并到全备份目录,配合incremental-dir增量备份目录使用

(2.)基于全备份进行一次增量备份的恢复
[root@kang ~]# innobackupex --apply-log --redo-only /opt/backup/full/full_incre_20180121_084345/ --incremental-dir=/opt/backup/inc/incre_20180121_085151/
如果出现如下图所示信息,证明执行成功!!!
(3.)基于全库备份和第一次增量备份,恢复第二次增量备份
[root@kang ~]# innobackupex --apply-log --redo-only /opt/backup/full/full_incre_20180121_084345/ --incremental-dir=/opt/backup/inc/incre_20180121_090016/

如果出现如下图所示信息,证明执行成功!!!

4.恢复整个数据库(即全库恢复)

(1.)停止数据库
[root@kang ~]# systemctl  stop mysqld
        (2.)清空数据目录下所有文件,模拟数据库故障
(3.)开始进行全库恢复, 将恢复好的数据按照配置文件的需求拷贝到相应目录
[root@kang ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="pwd123" --copy-back /opt/backup/full/full_incre_20180121_084345/
rug
如果出现如下图所示信息,证明执行成功!!

当数据恢复至datadir目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。
(4.)赋予mysql账号权限
[root@kang ~]# chown  -R mysql:mysql /usr/local/mysql/
  (5.)启动mysql服务
[root@kang ~]# systemctl  start mysqld
(6.)登录mysql数据库查看数据是否已经恢复


附:Xtrabackup的“流”及“备份压缩”功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:

[root@kang ~]# innobackupex --user=root --password="pwd123" --stream=tar /opt/backup/full/ | gzip >/opt/backup/full/full_`date +%F_%H%M%S`.tar.gz

如果出现如下图所示信息,证明执行成功!!!


到这里,可以说基于xtrabackup三种备份方式算是真正的完事了!!

希望对你有所帮助!!@

如有不懂的,多看几遍即可!!!! 再见 再见 再见











































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值