Percona软件
常用的MySQL备份工具
物理备份缺点
- 跨平台性差
- 备份时间长、冗余备份、浪费存储空间
mysqldump备份缺点
- 效率较低、备份还还原速度慢、锁表
- 备份过程中,数据插入和更新操作被阻塞
percona软件介绍
XtraBackup工具
-
一款强大的在线热备份工具
-
备份过程中不锁库表,适合生产环境
-
由专业组织Percona提供(改进MySQL分支)
-
-
主要含两个组件
-
xtrabackup:C程序,支持InnoDB/XrtaDB
-
innobackupex: 以Perl脚本封装xtrabackup,还支持MyISAM
-
安装软件
yum安装rpm包,解决依赖关系,rpm包可以去官网下载:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
也可以点击这里下载:percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
也可使用存储库安装
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-24 -y
查看安装
rpm -ql percona-xtrabackup-24
命令格式
innobackupex <选项>
命令常用选项
常用选项 | 含义 |
---|---|
–host | 主机名 |
–user | 用户名 |
–port | 端口号 |
–password | 密码 |
–databases | 数据库名 |
–databases=“库名” | 一个库 |
–databases=“库1 库2” | 多个库 |
–databases=“库1.表名” | 一张表 |
–no-timestamp | 不用日期命名备份文件存储的子目录名 |
–redo-only | 日志合并 |
–apply-log | 准备恢复数据 |
–copy-back | 拷贝数据 |
–incremental 目录名 | 增量备份 |
–incremental-basedir 目录名 | 增量备份时,指定上一次备份数据存储的目录名 |
–incremental-dir=目录名 | 准备恢复数据时,指定增量备份数据存储的目录名 |
–export | 导出表信息 |
import | 导入表空间 |
innobackupex只能对表结构为innodb的表进行增量备份,mysql5.7之后默认表结构为innodb
查看默认表结构
mysql>show engines;
default 默认
完全备份/恢复命令格式
完全备份:
innobackupex --user 用户名 --password 密码 备份目录名 --no-timestamp
–no-timestamp 不使用日期命名备份文件
完全恢复
innobackupex --apply-log 目录名 #准备恢复数据
innobackupex --copy-back 目录名 #恢复数据
例:进行一次完全备份
#为了验证实验,我们建立练习库
mysql -uroot -p123456
show databases;
create database db5;
create table db5.a(id int);
create table db5.b(name char(10));
insert into db5.a values(1);
insert into db5.b values("tom");
select count(*) from db5.a;
select count(*) from db5.b;
开始备份
innobackupex --user root --password 123456 /allbak --no-timestamp
#把数据备份到 /allbak 这个目录
ls /allbak #查看备份数据
开始恢复
这次的恢复使用的是另一台test服务器(192.168.4.100),当然也可以在本机删除恢复
因为恢复也会用到innobackupex 这个命令,所以test主机也需要安装percona这软件
恢复数据的步骤如下:
- 停止数据库服务
- 清空数据库目录
- 准备恢复数据
- 拷贝数据
- 修改数据库目录所有者和所有组用户为mysql
- 启动服务
- 使用数据库管理员查看是否恢复成功
#192.168.4.3(数据库服务器)
scp -r /allbak root@192.168.4.100:/root
#192.168.4.100
ls /root #查看是否传输成功
systemctl stop mysqld #停止数据库服务
rm -rf /var/lib/mysql/* #清空数据库目录
innobackupex --apply-log /root/allbak #准备恢复数据
innobackupex --copy-back /root/allbak #拷贝数据
chown -R mysql:mysql /var/lib/mysql #修改数据库目录所有者和所有组用户为mysql
systemctl start mysqld #启动服务
ss -nultp | grep 3306 #查看启动情况
mysql -uroot -p123456
mysql> select * from db5.a; #查看是否恢复成功
select * from db5.b;
以上在拷贝数据时,数据库目录必须为空
在备份目录中
- xtrabackup_logfile #这个是备份的日志信息
- ibdata1 #备份完成一个表后,后来又向表内写的数据
准备恢复的过程:把备份完成之后又写入的数据和以备份完成的数据进行一个合并
没有执行过恢复数据的备份文件,和执行过恢复数据的备份文件的差别
其中两个的backup_type有所不同,full-backup没有执行过备份操作
full-prepared 执行过准备恢复数据的操作,把ibdata1和xtrabackup_logfile合并之后,backup_type的类型由full-backup,变为full-prepared
拷贝开始之后,就自动把备份数据的目录拷贝到数据库目录之下
备份的过程中也不会对库表进行加锁
恢复单张表
在完全备份文件中恢复单张表
恢复单张表具体操作如下
-
删除表空间
alter table 库名.表名 discard tablespace;
-
导出表信息
innobackupex --apply-log --export /完全备份目录
-
拷贝表信息文件到数据库目录下
-
修改表信息文件的所有者及组用户为mysql
-
导入表空间
alter tables 库名.表名 import tablespace;
-
删除数据库目录下的表信息文件
-
查看表记录
数据库中的表以文件形式在数据库文件下存放
ls /var/lib/mysql/db5/
a.frm a.ibd b.frm b.ibd db.opt
表名.frm 存放的是表结构,表名.ibd存放的是表数据,也叫表空间文件
恢复单张表需要有一个完全备份,在完全备份的情况下,进行恢复单张表操作
#test主机模拟数据丢失
mysql -uroot -p123456
use db5;
show tables;
select * from a; #查看数据
delete from a; #清空数据
select * from a;
alter table db5.a discard tablespace; #表空间只能使用sql语句去删除
\q
innobackupex --apply-log --export /root/allbak/
ls /root/allbak/db5
#这里面会多出两个特殊文件 表名.cfg 、 表名.exp,这两个为备份信息文件
cp /root/allbak/db5/a.{cfg,exp,ibd} /var/lib/mysql/db5/ #拷贝表信息文件到数据库目录下
chown mysql:mysql /var/lib/mysql/db5/a.* #修改表信息文件的所有者及组用户为mysql
mysql -uroot -p123456
alter table db5.a import tablespace;
select * from db5.a;
\q
rm -rf /var/lib/mysql/db5/a.{cfg,exp} #删除数据库目录下的表信息文件
增量备份
定义:备份上次备份后,所有新产生的数据
命令格式:
增量备份:
innobackupex --user 用户名 --password 密码 --incremental 增量目录 --incremental-basedir=目录名 --no-timestamp
增量恢复
innobackupex --apply-log --redo-only 目录名 --incremental-dir=目录名 #准备恢复数据
innobackupex --copy-back 目录名 #恢复数据
在开始做增量备份时,需要首次备份,一般首次备份都是完全备份,后续的备份一般都为增量备份
#在mysql服务器上做首次备份,在上面已经做过完全备份所以查看我们做的完全备份
ls /allbak/
cat /allbak/xtrabackup_checkpoints #查看backup_type是否为full-backuped
开始向表里插入新数据,为增量备份做准备
mysql -uroot -p123456
insert into db5.a values(2);
insert into db5.a values(3);
insert into db5.a values(4);
insert into db5.b values("jarry");
insert into db5.b values("lucy");
开始增量备份
innobackupex --user root --password 123456 --incremental /new1dir --incremental-basedir=/allbak --no-timestamp
#--incremental /new1di 新备份的数据存放在/new1di
#--incremental-basedir=/allbak 在上次备份的数据上进行更新,上次备份文件存放目录/allbak
ls /new1dir
再插入数据,进行第二次增量备份
mysql -uroot -p123456
insert into db5.a values(5);
insert into db5.b values("lisi");
开始第二次增量备份
innobackupex --user root --password 123456 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
ls /new2dir
增量备份的过程,每次备份时,都会和上次的备份数据进行一个比较
首先 在这个xtrabackup_checkpoints文件中
backup_type 这个类型值为 full-backuped时为完全备份,为incremental时为增量备份
from_lsn: 备份文件的开始
to_lsn:备份文件的结束
增量备份的开始,就是上次备份的结束,如new1dir的开始就是allbak的结束,这三个表和一块,就是当前数据库的所有数据
开始恢复
#我们这次的恢复是在test主机上进行的,所以把备份的文件拷贝到test主机上
#192.168.4.3(数据库服务器)
scp -r /new1dir root@192.168.4.100:/opt
scp -r /new2dir root@192.168.4.100:/opt
scp -r /allbak root@192.168.4.100:/opt
#192.168.4.100(test主机)
ls /opt #查看是否传输成功
systemctl stop mysqld #停止数据库服务
rm -rf /var/lib/mysql/* #清空数据库目录
innobackupex --apply-log --redo-only /opt/allbak #准备恢复数据,修改bacpup_type
innobackupex --apply-log --redo-only /opt/allbak --incremental-dir=/opt/new1dir #开始第一次合并
innobackupex --apply-log --redo-only /opt/allbak --incremental-dir=/opt/new2dir #开始第二次合并
rm -rf /opt/new* #数据合并完成,可以删除备份文件,也可以不删
innobackupex --copy-back /opt/allbak #拷贝数据
chown -R mysql:mysql /var/lib/mysql #修改数据库目录所有者和所有组用户为mysql
systemctl start mysqld #启动服务
ss -nultp | grep 3306 #查看启动情况
mysql -uroot -p123456
mysql> select * from db5.a; #查看是否恢复成功
select * from db5.b;
增量备份中准备恢复数据就是:合并日志
当执行玩innobackupex --apply-log --redo-only /opt/allbak ,他的类型就会变化为日志追加,这时候就开始日志合并
第一次合并完成,再查看日志的范围
allbak的日志范围已经包括了new1dir所以第二次合并,源目录依旧指向allbak
查看是否恢复成功