问题描述:
- 需要将qp.xb文件内部分数据恢复到数据库,需要恢复到MySQL中可用,服务器知识趋向于0,摸索进行吧。
思考:
Q:这种qp.xb格式的数据是如何生成的?
A: qp.xb文件生成过程是,先经过 qpress 压缩,后经过 xbstream 打包。生成的,所以我们还原过程即 先解包再解压。
Q:既然qp.xb数据是先压缩再打包形成的,那是通过什么软件进行的压缩解压?
A:Xtrabackup 软件进行的压缩,此软件目前只支持Linux系统,所以我们只能在Linux系统云服务器进行此类操作了。
Q:解压这份数据,都需要哪些过程呢?
A:首先需要准备解压软件Xtrabackup,通过此软件解压成 frm 和 ibd格式的数据,其次将frm格式数据恢复为Mysql数据可读的格式即可。
Q:既然只能在Linux系统上面操作,那Linux是什么?我是小白兔,我只是一直听说服务器服务器,但是并不完全了解到底是什么。。。。
A:简单说,就是另一台不同于Win和Macos 系统的电脑。在这里都是通过抽象的命令行对Linux电脑进行操作。下面会介绍如何获取一台Linux服务器,如何通过Mac登录到Linux服务器进行简单的操作。创建文件夹、下载软件、安装软件等一些简单操作,来满足咱们数据恢复。
Linux知识杂学:
- 先购买一台服务器,我们用阿里云的服务器就好了。登录阿里云官网购买即可,购买后我们登录到控制条的云服务器ECS创建一个实例(ECS 即 Elastic Compute Service 可弹性伸缩的服务),创建实例后即代表我们拥有了一台属于我们自己的Linux服务器,后面我们的操作都在此实例进行,然后对实例进行密码重置。
- 如何操作Linux服务器:我在阿里云那边创建完成实例、密码重置后。我该如何在自己Mac电脑上操作这台Linux服务器呢?我们识别Linux服务器是通过公网IP来识别,就如没人身份证号一样,我们通过ssh登录此ip即可登录这个服务器。
登录服务:ssh root@4.11.2x1.10
- 题外话:刚才好奇看了下ssh由来。简单来说,这些服务器需要通过shell来控制,shell里面封装了那些常用的命令,常用的bash、zsh、oh my zsh等,ssh就是可以远程控制shell进而来控制服务器。mac系统子代ssh的终端,win系统自带的cmd。
用到的命令:
//通过ssh登录远程服务器
ssh root@47.11.21x.16x
//启动mysql
systemctl start mysqld.service
// 查看mysql状态
systemctl status mysqld.service
// 登录数据库:
mysql -uroot -p
// 查看初始密码
grep "password" /var/log/mysqld.log
// 修改数据库密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'testTest11.....';
//创建数据库
create database prod_coin_db;
// 删除软件安装包缓存
yum clean packages
// 查看现有云盘容量
fdisk -l
// 查询所有磁盘
df -h
// 内存使用情况,通过m来显示
free -m
// 当前文件下按大小排序
ls -Shl
// 查看 文件夹下面大小
ls -lh
// 查看Linux下文件的权限
ls -l
// 查看linux系统版本信息
lsb_release -a
// 删除某个空文件夹
rmdir xxx
// 删除如果不是空文件夹,上面命令会报错
rm -rf xxxx
// 可以在单个命令中删除多个目录,如下面的命令所示。命令删除所有目录和它们的子目录,而不提示删除。
rm -rf dir1 dir2 dir3
// 可以使用下面的命令来移动目录内的文件
mv <filename> <path_of _destination_directory>
//复制某个文件到某个文件夹下面.如果文件存在会提示覆盖
cp address.frm /var/lib/mysql/wordpress/
//复制某个文件夹到某个文件夹下面
cp -r 文件夹A路径 文件夹B路径
- 查看log日志的命令
less
命令
// less 打开所需查看文件
less 文件名路径
//less 翻页
空格
//less 跳转到最后一行
shift + g
- SFTP本地Mac和服务器传数据相关
// 查看服务器路径
pwd
// 查看本地电脑路径
lpwd
// 进入Linux文件方法
cd xxx
// 进入本地服务文件路径的方法
lcd xxx
//上传本地文件到服务器
put -r *
get命令
get xxx //xxxxxxlinux 系统中想要下载下来的文件的路径
get -r xxx 与get xxx不同的是-r可以下载文件夹
途中发现Linux上面云盘容量不够,对云盘进行了一次扩容,可是购买扩了容量,可实际可用还是不对,后面根据阿里云官方文档操作才完成了。
阿里云扩容:https://help.aliyun.com/document_detail/111738.html
qp.xb数据解压流程
安装数据库Mysql
(1) 执行以下命令,下载并安装MySQL。
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm &&
yum -y install mysql57-community-release-el7-10.noarch.rpm &&
yum -y install mysql-community-server
(2) 执行以下命令,启动MySQL数据库。
systemctl start mysqld.service
(3) 执行以下命令,查看MySQL初始密码。
grep "password" /var/log/mysqld.log
(4) 执行以下命令,登录数据库。
mysql -uroot -p
(5) 执行以下命令,修改MySQL默认密码。
set global validate_password_policy=0; #修改密码安全策略为低(只校验密码长度,至少8位)。
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
(6) 执行以下命令,授予root用户远程管理权限。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';
(7) 输入exit退出数据库。
systemctl命令管理mysql,简单贴一下吧。
启动mysql服务
systemctl start mysqld.service
停止mysql服务
systemctl stop mysqld.service
重启mysql服务
systemctl restart mysqld.service
查看mysql服务当前状态
systemctl status mysqld.service
设置mysql服务开机自启动
systemctl enable mysqld.service
停止mysql服务开机自启动
systemctl disable mysqld.service
安装解压用到的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##
重点:需要先查看自己MySQL版本,根据对应版本安装对应xtrabackup,否则会由于依赖库的原因报错。我之前按照如下版本执行,发现后面版本不匹配而无法使用。(我的MySQL版本 5.7.41 对应下载xtrabackup的2.4.14)
错误版本流程:
先下载24-2.4.9-1版本
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
结果发现无法安装,报
libgcrypt.so.11(GCRYPT_1.2)(64bit)
的错误,后面根据如下文章重新安装了一下。
参照文章:https://blog.csdn.net/qq_34779067/article/details/106193421
(1).先检查本地是否有libgcrypt183的安装包
[root@localhost tools]# rpm -qa |grep libgcrypt
libgcrypt-1.8.3-4.el8.x86_64
(2). 如本地安装了libgcrypt183,就下载下方的包
https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.14/binary/tarball/percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt183.tar.gz
(3). 刚才下载的tar压缩包,我们需要解压配置后再安装使用
(1) tar xf percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt183.tar.gz
(2) mv percona-xtrabackup-2.4.14-Linux-x86_64 /usr/local/xtrabackup
(3) echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >> /etc/profile
(4) source /etc/profile
(4).检测是否安装成功
[root@iZbp125ohgv1547khtesvuZ ~]# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/var/lib/mysql
xtrabackup version 2.4.14 based on MySQL server 5.7.19 Linux (x86_64) (revision id: ef675d4)
至此所需要的全部软件安装完成
本地Mac数据上传Linux服务器
此次我们使用的SFTP协议进行数据传输,SFTP的好处是:对命令和数据进行加密,防止密码和敏感信息通过网络公开传输
使用SFTP的真正原因是,Mac自带的terminal可以直接使用SFTP,避免再下FTP客户端了。
首先使用SFTP登录服务器
1) 打开terminal
2)点击上面shell,选择链接远程服务器
3)选择安全文件传输sftp,点击右边服务器下的加号添加你要连接的远程服务器ip地址
4)输入想要连接的ip地址或者服务器名称
5)选中服务器,输入服务器对应的用户名,点击连接。(注意:此处用户名必须写root)
6)首次连接一个服务器会让你确认(Are you sure you want to continute connecting(yes/no)),你输入yes然后回车就可以了
输入密码,连接成功
接下来就是进行Mac本地和Linux数据传输流程
1) 先进入到远程服务器目录
2)再进入本地要上传的目录
3)执行put命令,将本地文件上传到远端
开始恢复
_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
问题出现:至此我们的数据已经顺利解析到 ibd frm 格式,按照下面流程走下去,给mysql设置读取文件权限,指定数据库文件就可以看到数据但是,我失败了。具体原因还在排查,先写完正常流程吧
这个执行完成,应该就是你的数据库真实的文件了,下面需要把用户和权限组设置给mysql,这样启动起来mysql才有读写的权限。
chown -R mysql:mysql /home/mysql/data
mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &
这句话理解起来其实很简单,就是指定配置的启动MySQL。指定了MySQL的数据库文件存储文件夹,这样就能读取到你的备份文件了。
但是这里有几个坑需要注意,❎不要试图把你的备份文件直接拷贝到mysql的本身的数据库存储文件夹/var/lib/mysql/
,直接替换是不行的。
----------------------------华丽分割线-----------------书接上回 ----------------------------
上次说到,我们给Linux安装好解压软件,已经成功吧qp.xb格式解压成frm、ibd格式,但是我们给MySQL指定数据库的时候无法识别,继续研究解决吧。
- 首先我看了下mysql本身数据库存储文件夹
/var/lib/mysql
里的数据,看到他们格式跟我解压出来的一样,但是普遍都多出一个db.opt
文件,查了下这个只是存放默认字符集,不影响数据库运行。
突然想到是不是需要重启MySQL,学习了下systemctl控制MySQL,然后关闭重启。发现报错如下:
[root@iZbp125ohgv1547khtesv ~]# systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
可由于我的Linux版本是8版本,所以需要 nmcli 命令进行管理网络。
- 虽然服务器重启问题解决了,但是我还是无法查看我备份出的frm数据库,我想到把这些数据copy到已有可读的数据库下面,然后添加了权限,可是后面发现虽然数据库可以读,但是里面表都无法读取,不知道什么原因
----------------------------华丽分割线-----------------书接上回 ----------------------------
偶然间发现切换数据库指向后重启数据库需要输入密码,习惯输了密码后提示不对,才突然意识到数据库指向成功了。现在问题就是找到原密码,可是原密码试了好几个都不对,现在就是绕过这个原密码看能不能解出数据。
更改了 /etc/my.cnf 路径下的文件,设置登录服务器跳过密码输入,成功了。在图书馆喜极而泣。。。。。
参考文章:
https://www.cnblogs.com/shenjp/p/16579161.html
https://blog.csdn.net/qq_34779067/article/details/106193421
https://blog.csdn.net/weixin_41979605/article/details/118496138
https://zhuanlan.zhihu.com/p/559462499
可惜密码一直不对,干脆跳过密码了
https://blog.csdn.net/beichengqing/article/details/127057564