Percona

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;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFv7Hvbp-1648824406298)(E:/Typort/image-20211216232703312.png)]

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;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGGAhr9v-1648824406300)(E:/Typort/image-20211216233755230.png)]

开始备份
innobackupex  --user root --password 123456 /allbak --no-timestamp
#把数据备份到 /allbak 这个目录
ls /allbak   #查看备份数据
开始恢复

这次的恢复使用的是另一台test服务器(192.168.4.100),当然也可以在本机删除恢复

因为恢复也会用到innobackupex 这个命令,所以test主机也需要安装percona这软件

恢复数据的步骤如下:

  1. 停止数据库服务
  2. 清空数据库目录
  3. 准备恢复数据
  4. 拷贝数据
  5. 修改数据库目录所有者和所有组用户为mysql
  6. 启动服务
  7. 使用数据库管理员查看是否恢复成功
#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 #备份完成一个表后,后来又向表内写的数据

准备恢复的过程:把备份完成之后又写入的数据和以备份完成的数据进行一个合并

没有执行过恢复数据的备份文件,和执行过恢复数据的备份文件的差别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGeD9jW7-1648824406301)(E:/Typort/image-20211217003707681.png)]
在这里插入图片描述

其中两个的backup_type有所不同,full-backup没有执行过备份操作

full-prepared 执行过准备恢复数据的操作,把ibdata1和xtrabackup_logfile合并之后,backup_type的类型由full-backup,变为full-prepared

拷贝开始之后,就自动把备份数据的目录拷贝到数据库目录之下

备份的过程中也不会对库表进行加锁

恢复单张表

在完全备份文件中恢复单张表

恢复单张表具体操作如下

  1. 删除表空间

    alter table 库名.表名 discard tablespace;

  2. 导出表信息

    innobackupex --apply-log --export /完全备份目录

  3. 拷贝表信息文件到数据库目录下

  4. 修改表信息文件的所有者及组用户为mysql

  5. 导入表空间

    alter tables 库名.表名 import tablespace;

  6. 删除数据库目录下的表信息文件

  7. 查看表记录

数据库中的表以文件形式在数据库文件下存放

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}   #删除数据库目录下的表信息文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qa2P2iKA-1648824406303)(E:/Typort/image-20211217122405346.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlLJViiF-1648824406304)(E:/Typort/image-20211217122725395.png)]

增量备份

定义:备份上次备份后,所有新产生的数据

命令格式:

增量备份:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2dV24rwk-1648824406305)(E:/Typort/image-20211217123252271.png)]

开始向表里插入新数据,为增量备份做准备

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

增量备份的过程,每次备份时,都会和上次的备份数据进行一个比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rgnE7WUN-1648824406306)(E:/Typort/image-20211217125248473.png)]

首先 在这个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 ,他的类型就会变化为日志追加,这时候就开始日志合并

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8XBhFA0-1648824406307)(E:/Typort/image-20211217130514646.png)]

第一次合并完成,再查看日志的范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9k02vq4-1648824406308)(E:/Typort/image-20211217131106953.png)]

allbak的日志范围已经包括了new1dir所以第二次合并,源目录依旧指向allbak

查看是否恢复成功
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值