记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据

\背景起因

数据库因为某种情况被删掉了一列数据,需要恢复数据。

但是使用的是阿里云的MySQL,阿里云的数据库都是有备份的,但是可能是一天一次,数据还是会有影响的。

\备份机制

简单讲一下备份的机制和原理,有助于后面备份还原

原理其实很简单,阿里云也是使用的已有的开源备份软件

使用的是哪个开源软件呢?
开源软件Percona Xtrabackup可以用于对数据库进行备份恢复

所以你自己发数据库需要定时备份的话,也可以用这个软件每天定时跑一下脚本备份一下,阿里云本身就提供了这个备份
本来期待可以单表恢复,结果还是给了全库让自己去恢复数据(0.0)

所以你需要安装Xtrabackup的软件来恢复

\恢复数据

动手开始恢复

首先肯定是官方的教程,这里面也给你讲了,你可以下载几种格式的文件来恢复数据。

https://help.aliyun.com/knowledge_detail/41817.html?spm=a2c4g.11186623.6.751.793f4bd6WWNg0y

目前物理备份集文件有几种格式:
tar 压缩包 (.tar.gz 后缀)
xbstream 压缩包 (.xb.gz 后缀)
xbstream 文件包(_qp.xb 后缀)
xbstream qpress压缩包(_xb.qp后缀)

我拿到的是这个文件

xxx129_qp.xb

就跟着教程走就查不多,讲一下中间的坑。

1\ 准备linux系统,centos最好

我建议使用linux服务器,因为安装软件比较方便,自己使用的是mac,本来打算在自己机器上装mysql然后恢复成表就好了,但是mac下权限很复杂,

就安装qpressPercona XtraBackup就有问题,比如没法把sh移动到/usr/bin/下面去,最后直接用centos7服务器安装这些软件都是很顺利的,基本跟着教程都能一遍过

2\ 装必要的恢复软件

安装qpress就按照官方给的命令执行

wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar"
tar xvf qpress-11-linux-x64.tar
chmod 775 qpress
cp qpress /usr/bin

获取xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

安装

 yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

获取mysql

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

安装

yum -y install mysql57-community-release-el7-10.noarch.rpm

装MySQL服务,这个其实装好之后不用启动,因为后面我们要指定配置启动。

yum -y install mysql-community-server

3\实施恢复

还是跟着教程走

对于xbstream 文件包(_qp.xb 后缀)

cat <数据备份文件名> | xbstream -x -v -C /home/mysql/data

这里的/home/mysql/data我们没有这个文件夹,最好就直接先新建一下,这样后面很多的命令就不用改很多代码,如果你实在受不了新建这样一个文件夹,你可以做完之后删除掉就好了。

你可以cd到你的qp.xb文件的路径下,或者指定路径执行,这样执行完就会在/home/mysql/data下面有解压出的文件夹。然后再执行解压

## MySQL 5.6/5.7解压
innobackupex --decompress --remove-original /home/mysql/data

这个解压出来的文件还是不能用,后缀还不是frmibd,继续解压

## MySQL 5.6/5.7
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

这个执行完成,应该就是你的数据库真实的文件了,下面需要把用户和权限组设置给mysql,这样启动起来mysql才有读写的权限。

chown -R mysql:mysql /home/mysql/data

4\ 恢复到数据库

其实我们已经拿到了mysql的数据库文件,如果你去看下本地的数据库启动起来的话,也就是这些文件,所以备份机制就是全表文件备份(就是把你mysql相关的文件打包压缩),然后你恢复的时候再替换成备份文件而已。

下面是关键的语句

mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

这句话理解起来其实很简单,就是指定配置的启动MySQL。指定了MySQL的数据库文件存储文件夹,这样就能读取到你的备份文件了。

但是这里有几个坑需要注意,❎不要试图把你的备份文件直接拷贝到mysql的本身的数据库存储文件夹/var/lib/mysql/,直接替换是不行的。

因为我尝试了一下,按照生产环境创建了数据库和表,,看到生成了frmibd文件,然后李代桃僵,替换文件,还更换权限人和权限组,(cp这个动作会让所有人和权限组又变成root,你还需要改成mysql 结果证明没用-.-.)

拷贝进去确实你可以使用show databases; show tables;但是无法select查询
为啥都识别出数据库和表了,却不能select?
说明show databases; show tables;命令是直接读取目录下文件的,而且是明文的,而具体的表的数据是需要读取文件,并且需要解密(解码)的。

结果肯定是不行,替换mysql文件就能读取数据库数据的话明显就是漏洞了,数据就没有安全性可言,mysql设置的东西确实不可能这样让你就把数据替换了,哈哈哈哈哈

5\关键点

其实照着教程基本没问题,但是教程不会告诉你为什么这样可以那样不行,
首先这段代码我们不能全抄。

mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

我们理解一下前面是指定配置,主要是怕不兼容,但是我版本一致,而且我照着教程配置,怎么都启动不了,就拿第一个说添加参数,这个参数添加再哪里?开头还是末尾?注释掉不支持的参数?不支持的有哪些?
记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据_第1张图片
直接说怎么解决问题,把指定这个配置文件去掉就好了,我们并不需要额外指定配置

mysqld  --user=mysql --datadir=/home/mysql/data &

启动成功,连接MySQL。。

密码错误❌
我不是设过密码了么?
难道指定配置就又创建了密码?

grep "password" /var/log/mysqld.log

还是之前的这个日志啊,试试

密码错误❌

我突然意识到问题所在了,找到项目里面的账号密码,输入

成功进入✅,查询数据也正常。

\数据恢复与安全问题讨论总结

数据恢复说到底还是文件恢复,就像拷贝一份文件一样,就像linux其实就是一切都是文件,哪怕你的进程也是一个个文件来表示的。

数据恢复比较简单,但是第一次接触的时候还是要花费比较长的时间,所以这是我写我恢复的经历的原因,能节约到其他人的时间,那就是这篇文章的价值。

数据库恢复操作原理并不复杂,包括阿里的数据库每天的备份也是依靠现有 的开源软件来实现和处理,所以开源的好处在于,你只是做了一部分,但是后来的人会基于你的成果再做出一点点,最后成了科技的大厦,站在巨人的肩膀上不可耻,因为后面的我们也会是巨人的一部分。

MySQL这样成熟的软件必然考虑到安全性和安全隐患,简单的狸猫换太子还是不能让你成功的,你可以看到数据库,但是你不能查出里面的数据,这就是取舍,结合下来,对核心的加密,你拿到数据库文件还是没用,还是需要密码才能解开,这才合理。

你可能感兴趣的:(简单教程,数据库,mysql,linux)