Xtrabackup进行MySQL备份与恢复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xtrabackup进行MySQL备份与恢复相关的知识,希望对你有一定的参考价值。


一、使用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

[[email protected] ~]#yum install ./percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm 

[[email protected] ~]#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、完全备份


[[email protected] ~]#mkdir /app/backups创建一个目录存放备份数据
[[email protected] ~]#innobackupex --user=root --password=centos --host=localhost /app/backups/  如果备份某一个库的话可以用--databases=
[[email protected] ~]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

[[email protected] ~]#scp -r /app/backups/2017-11-14_16-16-20/ 172.18.77.77:

[[email protected] ~]#systemctl stop mariadb

[[email protected] ~]#rm -rf /var/lib/mysql/*


准备(prepare)一个完全备份

[[email protected] ~]#cd 2017-11-14_16-16-20/

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


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

操作如下:

[[email protected] 2017-11-14_16-16-20]#innobackupex --apply-log /root/2017-11-14_16-16-20/
171114 16:49:02 completed OK! 最后一行出现completed OK!就说明已经同步回应用完成
[[email protected] 2017-11-14_16-16-20]#innobackupex --copy-back /root/2017-11-14_16-16-20/
171114 16:52:30 completed OK! 显示成功即可
[[email protected] 2017-11-14_16-16-20]#cd /var/lib/mysql/
[[email protected] mysql]#chown -R mysql.mysql ./*  将所属主和所属者都改为mysql
[[email protected] mysql]#systemctl start mariadb  启动服务
[[email protected] 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、先做一次全量备份



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

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



[[email protected] ~]#mysql -uroot -pcentos 
MariaDB [(none)]>use hidb;
MariaDB [hidb]> insert into students values (1001,‘wangba‘,59,‘F‘,‘fanren‘);
[[email protected] ~]#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! 备份完成 ,这是第一次增量备份
[[email protected] backups]#cd /app/backups/2017-11-14_17-29-39/
[[email protected] 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
[[email protected] 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;
[[email protected] ~]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!
[[email protected] backups]#cd 2017-11-14_17-39-58
[[email protected] 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


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

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

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

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


3、数据恢复


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

[[email protected] 2017-11-14_17-39-58]#cd /app/backups/
[[email protected] backups]#ls
2017-11-14_17-18-40  2017-11-14_17-29-39  2017-11-14_17-39-58
[[email protected] ~]#cd /app/backups/2017-11-14_17-18-40/ 
[[email protected] 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! 成功
[[email protected] 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!
[[email protected] 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!

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

[[email protected] backups]#scp -r 2017-11-14_17-18-40 172.18.77.77: 将合并完后的全量目录拷贝到用于数据恢复的服务器上
[[email protected] mysql]#systemctl stop mariadb
[[email protected] mysql]#rm -rf /var/lib/mysql/*
[[email protected] ~]#cd 2017-11-14_17-18-40  
[[email protected] 2017-11-14_17-18-40]#innobackupex --copy-back /root/2017-11-14_17-18-40/ 
[[email protected] 2017-11-14_17-18-40]#cd /var/lib/mysql/
[[email protected] mysql]#chown -R mysql.mysql ./*
[[email protected] ~]#cp mybinlog.sql /tmp/
[[email protected] ~]#systemctl start mariadb
[[email protected] ~]#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;


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


以上是关于Xtrabackup进行MySQL备份与恢复的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 备份恢复与 xtrabackup备份

数据备份与恢复 XtraBackup备份工具

MySQL入门篇之Xtrabackup备份与恢复

MySQL备份与恢复-3

Mysql不锁表备份之Xtrabackup的备份与恢复

MySQL数据库物理备份