一、使用Xtrabackup进行MySQL备



1、简介



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

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

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

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

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

(5)还原速度快;


2、安装



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

这个工具要安装在你需要备份的主机上或者远程操作也可以

percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm

[root@bixia ~]#yum install ./percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm 

[root@bixia ~]#rpm -ql percona-xtrabackup-24


二、备份的实现



备份前的环境的准备

两台主机:

172.18.77.7:  mysql主服务器

172.18.77.77: 用于恢复备份数据的主机

为了可以清楚我将每个主机的主机名设置不一样;这里备份我备份在了本机上,为了方便演示。(建议备份时放在其他的主机上)

在两台mysql服务器上都安装percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm 工具包


1、完全备份


[root@bixia ~]#mkdir /app/backups创建一个目录存放备份数据
[root@bixia ~]#innobackupex --user=root --password=centos --host=localhost /app/backups/  如果备份某一个库的话可以用--databases=
[root@bixia ~]cd /app/backups/2017-11-14_16-16-20/


在备份的同时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf —— 备份命令用到的配置选项信息;


2、数据恢复


注意:恢复不用启动MySQL

[root@bixia ~]#scp -r /app/backups/2017-11-14_16-16-20/ 172.18.77.77:

[root@huangshang ~]#systemctl stop mariadb

[root@huangshang ~]#rm -rf /var/lib/mysql/*


准备(prepare)一个完全备份

[root@bixia ~]#cd 2017-11-14_16-16-20/

    我们切换到这个目录下,给备份的数据进行一次prepare这个prepare是为了让提交的事务同步,未提交的事务回滚,回滚的事务完成回滚 ,这个操作利用innobakupex命令的--apply-log选项可用于实现上述功能


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

操作如下:

[root@bixia 2017-11-14_16-16-20]#innobackupex --apply-log /root/2017-11-14_16-16-20/
171114 16:49:02 completed OK! 最后一行出现completed OK!就说明已经同步回应用完成
[root@bixia 2017-11-14_16-16-20]#innobackupex --copy-back /root/2017-11-14_16-16-20/
171114 16:52:30 completed OK! 显示成功即可
[root@bixia 2017-11-14_16-16-20]#cd /var/lib/mysql/
[root@bixia mysql]#chown -R mysql.mysql ./*  将所属主和所属者都改为mysql
[root@bixia mysql]#systemctl start mariadb  启动服务
[root@bixia mysql]#mysql -uroot -pcentos   尝试连接,看数据是否恢复
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.52-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>

实验证明数据恢复完成!!!!


全量,增量,二进制日志实现时间点还原的备份



1、先做一次全量备份



[root@bixia ~]#innobackupex --user=root --password=centos --host=localhost /app/backups/

2、然后做增量备份,先连接数据库,插入一条记录


使用innobackupex进行增量备份

  每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

[root@bixia ~]#mysql -uroot -pcentos 
MariaDB [(none)]>use hidb;
MariaDB [hidb]> insert into students values (1001,'wangba',59,'F','fanren');
[root@bixia ~]#innobackupex --user=root --password=centos --host=localhost --incremental /app/backups/ --incremental-basedir=/app/backups/2017-11-14_17-18-40
xtrabackup: Transaction log of lsn (3776175) to (3776175) was copied.
171114 17:29:43 completed OK! 备份完成 ,这是第一次增量备份
[root@bixia backups]#cd /app/backups/2017-11-14_17-29-39/
[root@bixia 2017-11-14_17-29-39]#ls
backup-my.cnf  hidb           ibdata1.meta  performance_schema  xtrabackup_binlog_info  xtrabackup_info
ddvdb          ibdata1.delta  mysql         test                xtrabackup_checkpoints  xtrabackup_logfile
[root@bixia 2017-11-14_17-29-39]#cat xtrabackup_checkpoints
backup_type = incremental 备份类型是增量备份
from_lsn = 3775741
to_lsn = 3776175
last_lsn = 3776175
compact = 0
recover_binlog_info = 0


我们在第二次增量备份


MariaDB [hidb]> delete from students where age>90;
MariaDB [hidb]> select * from students;
[root@bixia ~]innobackupex --user=root --password=centos --host=localhost --incremental /app/backups/ --incremental-basedir=/app/backups/2017-11-14_17-29-39 
xtrabackup: Transaction log of lsn (3794804) to (3794804) was copied.
171114 17:40:01 completed OK!
[root@bixia backups]#cd 2017-11-14_17-39-58
[root@bixia 2017-11-14_17-39-58]#cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3776175
to_lsn = 3794804
last_lsn = 3794804
compact = 0
recover_binlog_info = 0

  其中/app/backups/指的是完全备份所在的目录,而--incremental-basedir=指的是第一次增量备份的目录,--incremental-basedir=(这时目录肯定不一样)指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;


在次对主mysql服务器上的数据进行某些操作,比如说在进行下述操作时服务器宕机了

MariaDB [hidb]> update students set major='shepi' where age=80;
MariaDB [hidb]> select * from students where age=80;

因此我们要查看上次最后一次备份时的备份目录下的xtrabackup_binlog_info文件,确定二进制日志处于什么事件的什么位置

[root@bixia 2017-11-14_17-39-58]#cd /app/backups/
[root@bixia backups]#ls
2017-11-14_17-18-40  2017-11-14_17-29-39  2017-11-14_17-39-58
[root@bixia backups]#cd 2017-11-14_17-39-58/
[root@bixia 2017-11-14_17-39-58]#cat xtrabackup_binlog_info
master-log.0000061290
[root@bixia ~]# mysqlbinlog -j 1290 /mydata/logs/master-log.000006 > /root/mybinlog.sql
[root@bixia ~]#scp /root/mybinlog.sql 172.18.77.77:   将这部分数据拷贝到用于备份的那台服务器上


3、数据恢复


首先把第一个增量备份合并上来,在把第二个增量合并上来,然后拿一个目录去恢复

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

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

(2)基于所有的备份将未提交的事务进行“回滚”。

[root@bixia 2017-11-14_17-39-58]#cd /app/backups/
[root@bixia backups]#ls
2017-11-14_17-18-40  2017-11-14_17-29-39  2017-11-14_17-39-58
[root@bixia ~]#cd /app/backups/2017-11-14_17-18-40/ 
[root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only /app/backups/2017-11-14_17-18-40/ 合并全量
171114 19:53:22 completed OK! 成功
[root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only  ./ --incremental-dir=/app/backups/2017-11-14_17-29-39
合并第一个增量
171114 20:00:32 completed OK!
[root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only /app/backups/2017-11-14_17-18-40/ --incremental-dir=/app/backups/2017-11-14_17-39-58
合并第二个增量
171114 20:03:24 completed OK!

上述合并的增量务必在全量备份的目录下去合并

[root@bixia backups]#scp -r 2017-11-14_17-18-40 172.18.77.77: 将合并完后的全量目录拷贝到用于数据恢复的服务器上
[root@bixia mysql]#systemctl stop mariadb
[root@bixia mysql]#rm -rf /var/lib/mysql/*
[root@bixia ~]#cd 2017-11-14_17-18-40  
[root@bixia 2017-11-14_17-18-40]#innobackupex --copy-back /root/2017-11-14_17-18-40/ 
[root@bixia 2017-11-14_17-18-40]#cd /var/lib/mysql/
[root@bixia mysql]#chown -R mysql.mysql ./*
[root@bixia ~]#cp mybinlog.sql /tmp/
[root@bixia ~]#systemctl start mariadb
[root@bixia ~]#mysql -uroot -pcentos
MariaDB [(none)]> use hidb;
MariaDB [hidb]> select * from students where age=80;
+------+---------+------+--------+--------------+
| id   | name    | age  | gender | major   |
+------+---------+------+--------+--------------+
|   65 | stu65   |   80 | M      | NULL  |
|   83 | stu83   |   80 | M      | NULL  |
|  104 | stu104  |   80 | F      | NULL  |
|  113 | stu113  |   80 | M      | NULL  |
|  192 | stu192  |   80 | F      | NULL  |
|  207 | stu207  |   80 | F      | NULL  |
|  222 | stu222  |   80 | F      | NULL  |
|  298 | stu298  |   80 | M      | NULL  |
|  409 | stu409  |   80 | F      | NULL  |
|  415 | stu415  |   80 | F      | NULL  |
|  448 | stu448  |   80 | F      | NULL  |
|  513 | stu513  |   80 | F      | NULL  |
|  545 | stu545  |   80 | M      | NULL  |
|  590 | stu590  |   80 | F      | NULL  |
|  676 | stu676  |   80 | M      | NULL  |
|  696 | stu696  |   80 | F      | NULL  |
|  824 | stu824  |   80 | F      | NULL  |
|  894 | stu894  |   80 | F      | NULL  |
|  930 | stu930  |   80 | M      | NULL  |
| 1000 | stu1000  |   80 | M      | NULL  |
+------+---------+------+--------+--------------+
MariaDB [hidb]> set @@session.sql_log_bin=off; 
MariaDB [(none)]> \. /tmp/mybinlog.sql
MariaDB [hidb]> select * from students where age=80;
+------+---------+------+--------+-------------+
| id   | name    | age  | gender | major  |
+------+---------+------+--------+-------------+
|   65 | stu65   |   80 | M      | shepi |
|   83 | stu83   |   80 | M      | shepi |
|  104 | stu104  |   80 | F      | shepi |
|  113 | stu113  |   80 | M      | shepi |
|  192 | stu192  |   80 | F      | shepi |
|  207 | stu207  |   80 | F      | shepi |
|  222 | stu222  |   80 | F      | shepi |
|  298 | stu298  |   80 | M      | shepi |
|  409 | stu409  |   80 | F      | shepi |
|  415 | stu415  |   80 | F      | shepi |
|  448 | stu448  |   80 | F      | shepi |
|  513 | stu513  |   80 | F      | shepi |
|  545 | stu545  |   80 | M      | shepi |
|  590 | stu590  |   80 | F      | shepi |
|  676 | stu676  |   80 | M      | shepi |
|  696 | stu696  |   80 | F      | shepi |
|  824 | stu824  |   80 | F      | shepi |
|  894 | stu894  |   80 | F      | shepi |
|  930 | stu930  |   80 | M      | shepi |
| 1000 | stu1000  |   80 | M      | shepi |
+------+---------+------+--------+-------------+
MariaDB [hidb]> set @@session.sql_log_bin=on;


实验证明数据已经恢复,但是切记这时在做一次全量备份!!!!!!!!!!