数据库因为某种情况被删掉了一列数据,需要恢复数据。
但是使用的是阿里云的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
就跟着教程走就查不多,讲一下中间的坑。
我建议使用linux服务器,因为安装软件比较方便,自己使用的是mac,本来打算在自己机器上装mysql然后恢复成表就好了,但是mac下权限很复杂,
就安装qpress
和Percona XtraBackup
就有问题,比如没法把sh移动到/usr/bin/下面去,最后直接用centos7服务器安装这些软件都是很顺利的,基本跟着教程都能一遍过
安装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
还是跟着教程走
对于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
这个解压出来的文件还是不能用,后缀还不是frm
和ibd
,继续解压
## 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
其实我们已经拿到了mysql的数据库文件,如果你去看下本地的数据库启动起来的话,也就是这些文件,所以备份机制就是全表文件备份(就是把你mysql相关的文件打包压缩),然后你恢复的时候再替换成备份文件而已。
下面是关键的语句
mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &
这句话理解起来其实很简单,就是指定配置的启动MySQL。指定了MySQL的数据库文件存储文件夹,这样就能读取到你的备份文件了。
但是这里有几个坑需要注意,❎不要试图把你的备份文件直接拷贝到mysql的本身的数据库存储文件夹/var/lib/mysql/
,直接替换是不行的。
因为我尝试了一下,按照生产环境创建了数据库和表,,看到生成了frm
和ibd
文件,然后李代桃僵,替换文件,还更换权限人和权限组,(cp这个动作会让所有人和权限组又变成root,你还需要改成mysql 结果证明没用-.-.)
拷贝进去确实你可以使用
show databases;
show tables;
但是无法select查询
为啥都识别出数据库和表了,却不能select?
说明show databases;
show tables;
命令是直接读取目录下文件的,而且是明文的,而具体的表的数据是需要读取文件,并且需要解密(解码)的。
结果肯定是不行,替换mysql文件就能读取数据库数据的话明显就是漏洞了,数据就没有安全性可言,mysql设置的东西确实不可能这样让你就把数据替换了,哈哈哈哈哈
其实照着教程基本没问题,但是教程不会告诉你为什么这样可以那样不行,
首先这段代码我们不能全抄。
mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &
我们理解一下前面是指定配置,主要是怕不兼容,但是我版本一致,而且我照着教程配置,怎么都启动不了,就拿第一个说添加参数,这个参数添加再哪里?开头还是末尾?注释掉不支持的参数?不支持的有哪些?
直接说怎么解决问题,把指定这个配置文件去掉就好了,我们并不需要额外指定配置
mysqld --user=mysql --datadir=/home/mysql/data &
启动成功,连接MySQL。。
密码错误❌
我不是设过密码了么?
难道指定配置就又创建了密码?
grep "password" /var/log/mysqld.log
还是之前的这个日志啊,试试
密码错误❌
我突然意识到问题所在了,找到项目里面的账号密码,输入
成功进入✅,查询数据也正常。
数据恢复说到底还是文件恢复,就像拷贝一份文件一样,就像linux其实就是一切都是文件,哪怕你的进程也是一个个文件来表示的。
数据恢复比较简单,但是第一次接触的时候还是要花费比较长的时间,所以这是我写我恢复的经历的原因,能节约到其他人的时间,那就是这篇文章的价值。
数据库恢复操作原理并不复杂,包括阿里的数据库每天的备份也是依靠现有 的开源软件来实现和处理,所以开源的好处在于,你只是做了一部分,但是后来的人会基于你的成果再做出一点点,最后成了科技的大厦,站在巨人的肩膀上不可耻,因为后面的我们也会是巨人的一部分。
MySQL这样成熟的软件必然考虑到安全性和安全隐患,简单的狸猫换太子还是不能让你成功的,你可以看到数据库,但是你不能查出里面的数据,这就是取舍,结合下来,对核心的加密,你拿到数据库文件还是没用,还是需要密码才能解开,这才合理。