基于xtrabackup实现mysql备份还原

人走茶凉 提交于 2019-12-06 05:39:56

简介

Xtrabackup2.2版之前包括4个可执行文件:

innobackupex: Perl 脚本
xtrabackup: C/C++ 编译的二进制
xbstream: 支持并发写的流文件格式
xbcrypt: 加解密

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQLServer 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一层封装实现的;mysqldump默认是不支持增量备份的(mysqldump实现增量备份靠的是二进制日志),xtrabackup支持增量备份

xtrabackup下载地址

https://www.percona.com/downloads/Percona-XtraBackup-2.4/
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/          #最新版本下载

xtrabackup备份过程

棕色线条是备份MyISAM存储引擎的表,绿色线条是备份InnoDB存储引擎的表;
innobackupex启动后先调用xtrabackup,xtrabackup启动两个线程,一个线程先备份redo(事务日志);
拷贝上事务日志之后,开启另一个线程备份ibd文件(ibd是存放数据库以及索引的文件),备份完ibd文件之后通知innobackupex;
备份完ibd文件后,innobackupex脚本会加全局读锁备份MyISAM相关的表;
MyISAM表备份完之后通知备份redo的线程,停止备份事务日志,线程收到通知后会停止备份并且告知innobackupex;
innobackupex进行解锁,通知xtrabackup停止备份,xtrabackup回复完之后备份结束;

新版本的xtrabackup中xtrabackup和innobackupex已经合二为一,innobackupex作为xtrabackup的软链接

xtrabackup选项用法

--user:该选项表示备份账号
--password:该选项表示备份的密码
--host:该选项表示备份数据库的地址
--databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指   
             定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:该选项表示还原时增量备份的目录
--include=name:指定表名,格式:databasename.tablename
--backup:备份
--prepare:预处理
--apply-log-only:阻止回滚未完成的事务
--target-dir:指定目标位置
--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因  
              此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G(快速还原)
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有 
             足够的磁盘空间同时保留数据文件和Backup副本
--force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果
                               --copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

还原注意事项:

1、datadir 目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,否则--copy-back选项不会覆盖
2、在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
3、.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户chown -R mysql:mysql /data/mysql
以上需要在用户调用innobackupex之前完成

xtrabackup还原过程

t0点做完全备份,t1、t2点都做增量备份(第一次增量备份前都需要一个完全备份);上图中,有可能会出现t1点做增量备份之前有一个事务正在执行,t1点做完增量备份之后事务还没完成,这样会造成事务跨备份点了,相当于t1点增量备份中有一半事务的备份,另一半的事务没有做备份;同理,t2点也会出现这种情况;

xtrabackup还原的两个步骤:
1、预处理:当需要还原数据库到t2点时,需要t0的完全备份和t1、2的增量备份;xtrabackup把备份复制到一个第三方目录中,用完全备份加上t1点的增量备份,再
          加上t2点的增量备份,但t2点的增量备份中有可能出现一半的事务备份,所以会把t2点的备份进行事务回滚(撤销不完整的事务);备份还原时,前面的 
          备份都不做事务回滚,只有需要还原的最后一次增量备份才做事务滚动
2、还原:把预处理完的备份文件复制到数据库所在目录

完全备份也会出现备份一半事务的情况,当数据库启动会发现不完整事务,系统会自动回滚

备份生成的相关文件

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:
(1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置;数 
                    据库的数据存放在一个个16K的数据块中,每当修改一个数据块的数据,则这个数据块的事务id号就会更改;当做备份时,假如备份完成后最
                    大的事务id为1000,则1000id之前的都做过备份,1000之后的id则都未做备份,LSN即事务id
(2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个
                           日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
(3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
(4)backup-my.cnf:备份命令用到的配置选项信息
(5)xtrabackup_logfile:备份生成的日志文件

xtrabackup完全备份还原

备份

准备两台机器

[root@centos7 ~]# yum install percona-*.rpm     #安装xtrabackup
[root@centos7 ~]# rpm -ql percona-xtrabackup-24    #查看包都包含了哪些文件
[root@centos7 ~]# mkdir /backup     #创建备份目录
[root@centos7 ~]# mysql -e 'show databases;'    #提前准备好数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
+--------------------+
[root@centos7 ~]# xtrabackup --backup --target-dir=/backup/     #做完全备份到指定目录
[root@centos7 ~]# scr -r /backup/ 192.168.38.37:/       #把备份目录拷贝到远程主机的根下;备份尽量不要放在本机上

还原

[root@localhost ~]# yum install percona*.rpm
[root@localhost ~]# systemctl stop mariadb      #还原数据库期间需要停止用户访问
[root@localhost ~]# rm -rf /var/lib/mysql/*     #还原时要清除数据库目录下的所有文件
[root@localhost ~]# mkdir /restore              #准备一个预处理用的第三方目录
[root@localhost ~]# cp -ra /backup/* /restore/  #把备份的数据拷贝到预处理用的目录下
[root@localhost ~]# xtrabackup --prepare --target-dir=/restore/     #指定目录进行预处理;完全备份还原,不需要阻止日志回滚,系统会自动回滚日志
[root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/    #把处理过的备份还原(拷贝)到数据库目录;xtrabackup会自动检查mysql的配置文件,从而找到数据库的目录
[root@localhost ~]# ll /var/lib/mysql/   #会发现文件的所有者和所属组都是当前系统默认用户
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/    #更改数据库目录的所有文件的所有者和所属组为Mysql
[root@localhost ~]# systemctl start mariadb     #恢复服务
[root@localhost ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| mysql              |
| performance_schema |
+--------------------+

xtrabackup增量备份还原

备份

[root@centos7 ~]# yum install mariadb-server percon*.rpm      #需要开启epel源,有的包依赖于epel源
[root@centos7 ~]# systemctl start mariadb
[root@centos7 ~]# mkdir /backup   #创建备份目录
[root@centos7 ~]# mysql
MariaDB [(none)]> create database db1;
MariaDB [(none)]> use db1;
MariaDB [(none)]> create table t1(id int);    #创建个空表
MariaDB [db1]> quit
[root@centos7 ~]# xtrabackup --backup --target-dir=/backup/base      #创建完全备份,base目录自动生成
[root@centos7 ~]# mysql db1
MariaDB [db1]> insert t1 value(1),(2);
MariaDB [db1]> quit
[root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base    #创建基于base完全备份的增量备份inc1
[root@centos7 ~]# mysql db1;
MariaDB [db1]> insert t1 value(3),(4);
MariaDB [db1]> select * from t1;
>+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
MariaDB [db1]> quit
[root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1   #创建基于inc1备份的增量备份inc2
[root@centos7 ~]# scp -r /backup/ 192.168.38.37:/      #把所有备份拷贝到远程主机

还原

[root@localhost ~]# yum install percona*.rpm -y
[root@localhost ~]# systemctl stop mariadb     #还原过程需要先暂停服务,停止用户访问
[root@localhost ~]# mkdir /restore      #创建预处理备份的第三方目录
[root@localhost ~]# cp -r /backup/* /restore/   #把备份拷贝到预处理目录
[root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base    #预处理完全备份,禁止事务回滚
[root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base --incremental-dir=/restore/inc1   #把增量备份inc1预处理,并且和完全备份合并
[root@localhost ~]# xtrabackup --prepare --target-dir=/restore/base --incremental-dir=/restore/inc2  #预处理增量备份inc2,inc2是最后一个增量备份,所以需要进行事务回滚,并且与完全备份合并
[root@localhost ~]# rm -rf  /var/lib/mysql/*     #还原前,删除数据库目录下的所有文件目录
[root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/base   #把预处理的备份还原(拷贝)到数据库的目录下
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/     #修改数据库的所有文件的所有者所属组为Mysql;如果不修改,默认数据库文件的所有者所属组是备份时的当前用户,启动mysql服务时会造成数据库服务无法启动
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# mysql db1
MariaDB [db1]> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!