xtraBackup简介
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。
xtraBackup备份流程如下
(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(5)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
xtraBackup工具
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
安装xtraBackup
1、选择对应版本
安装mysql对应版本的xtrabackup,不同服务器安装不同的版本
mysql 5.1 – xtrabackup2.0
mysql5.6 --xtrabackup 2.2
mysql5.7 --xtrabackup2.4
mysql8 --xtrabackup-80
2、下载xtrabackup包
官网下载:安装包 https://www.percona.com
官网下载:percona-release
3、需要的依赖包
rpm -ivh libev-4.04-2.el6.x86_64.rpm
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install rsync perl l perl-Digest-MD5
4、安装xtrabackup
方法一、使用软件包安装rpm
方法二、软件仓库安装 percona-release
在官网下载好percona-release后,安装即可,使用yum安装xtrabackup
yum install percona-xtrabackup //对应xtrabackup版本,可以先用yum list |grep xtrabackup 查看
创建最小权限backup用户
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,SUPER ON *.* TO 'bkpuser'@'localhost'; #授权刷新、锁定表、用户查看服务器状态
mysql> grant create,insert,select on percona_schema.* to 'bkpuser'@'localhost' ;
mysql> FLUSH PRIVILEGES; #刷新授权表
xtrabackup全量备份与恢复
进行全库备份
innobackupex --user=bkpuser --password=123456 --host=127.0.0.1 /mysql-backup/
注:语法解释说明
--user=root 指定备份用户
--password=123456 指定备份用户密码
--host 指定主机
/mysql-backup 指定备份目录
查看备份信息,及各备份文件的含义
1、backup-my.cnf 备份用到的被指文件信息
2、ibdata1 数据文件
3、xtrabackup_binlog_info mysql服务器当前正在使用的二进制日志文件和此时二进制日志文件的位置信息文件
4、xtrabackup_checkpoints 备份的类型、状态和LSN状态信息文件
5、xtrabackup_logfile 备份的日志文件
进行数据的恢复
1、停止mysql服务
system stop mysqld ----CentOS7/RedHat7
service mysqld stop ----CentOS6/RedHat6
2、准备恢复阶段:合并数据,使数据文件处于一致性的状态
innobackupex --apply-log /mysql-backup/2020-07-13_22-09-18/
3、删除mysql数据目录下数据,否则会报错。
vim /etc/my.cnf 查看my.cnf配置文件获取datadir目录路径
rm -rf /var/lib/mysql
4、恢复mysql数据库
innobackupex --copy-back /mysql-backup/2020-07-13_22-09-18/
5、查看mysql数据目录信息
ll /var/lib/mysql
6、修改属主属组
chown -R mysql:mysql /var/lib/mysql/*
7、启动mysql服务并查看数据是否已经恢复
8、全量恢复总结
xtrabackup增量备份及恢复
使用innobackupx进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
增量备份
1、若没有全量备份的过请先全量备份一次
innobackupex --user=bkpuser --password=123456 --host=127.0.0.1 /mysql-backup/
2、基于前一次的全量备份,插入一些数据,然后增量备份
innobackupex --user=bkpuser --password=123456 --host=127.0.0.1 --incremental /mysql-backup --incremental-basedir=/mysql-backup/2020-07-13_22-38-17
3、准备恢复阶段
准备基于全量
innobackupex --user=bkpuser --password=123456 --apply-log --redo-only /mysql-backup/2020-07-13_22-38-17
准备基于增量,其实就是将增量备份的数据加入到全量备份当中
innobackupex --user=bkpuser --password=123456 --apply-log --redo-only /mysql-backup/2020-07-13_22-38-17 --incremental-dir=/mysql-backup/2020-07-13_22-47-41
4、删除mysql数据目录下数据,否则会报错。
vim /etc/my.cnf 查看my.cnf配置文件获取datadir目录路径
rm -rf /var/lib/mysql
5、恢复数据库
innobackupex --copy-back /mysql-backup/2020-07-13_22-38-17/
6、查看mysql数据目录信息
ll /var/lib/mysql
7、修改属主属组
chown -R mysql:mysql /var/lib/mysql/*