操作系统宕机,MySQL数据找回记录
  

sailyang 8262人觉得有帮助

{{ttag.title}}
本帖最后由 sailyang 于 2021-4-20 15:16 编辑

一、概述
  如果Linux操作系统宕机,启动不了,救援模式(rescue installed system)也行不通的时候,那么该机器上的MySQL数据还能恢复吗?如果能,怎么恢复呢?带着这个问题我们做个实验。

二、环境介绍
准备两台虚拟机,虚拟机软件为virtualbox。
IP 192.168.56.81 该虚拟机上面运行了MySQL,后面模拟这个机器崩溃,然后将MySQL数据抢救回来。
“81”上的文件:
81098607e7ebf5dd44.png
“81”上的MySQL数据库:
70573607e7ecca9885.png
  IP 192.168.56.71 该虚拟机为新机器,后面需要将“81”上的数据库迁移到“71”这台机器上。

三、开始实验
删除“81”机器上的/boot目录文件,然后强制重启。
93882607e7eed38ab8.png
61080607e7ef2ac411.png
关闭故障虚拟机“81”,选择强制退出。

25825607e7f02869d3.png
将故障虚拟机“81”的硬盘挂载到新的虚拟机“71”上,启动新的虚拟机“71”。
61449607e7f2db301e.png
通过lsblk能看到sdb就是新挂载的磁盘。

52850607e7f3a95f3d.png

建立挂载点,挂载新的磁盘,提示mount: unknown filesystem type ‘LVM2_member’

[root@oracletest ~]# mkdir /newmnt
[root@oracletest ~]# mount /dev/sdb2 /newmnt
mount: unknown filesystem type 'LVM2_member'
这是因为/dev/sdb2是一个物理卷,不能直接挂载,需要挂载该物理卷对应的逻辑卷。查看逻辑卷(这个可能需要等一会才查看得到),可以看到LV Status为NOT available
16843607e7f7157a16.png

使用vgchange -ay /dev/vg激活逻辑卷组(vg是逻辑卷组名字),可以看到LV Status为available。
8742607e7f7e1c549.png
挂载逻辑卷,可以看到文件已经找回来了。

[root@oracletest ~]# mount /dev/vg/lvroot /newmnt
[root@oracletest ~]# cd /newmnt
[root@oracletest newmnt]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@oracletest newmnt]# cd /newmnt/root
[root@oracletest root]# ls
important.txt  install.sh  mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz
[root@oracletest root]# cat important.txt
this is important text!
接下来是恢复MySQL数据库。原理很简单,跟迁移MySQL没区别,就是将原MySQL文件迁移到新的目录,然后起库。首先在新的虚拟机“71”上面安装跟故障虚拟机中相同版本的MySQL(安装过程略……)。查看原MySQL的参数文件,确定MySQL日志文件和数据文件的目录。

[root@oracletest root]# cat /newmnt/etc/my.cnf
[mysqld]
# basic settings #
...
basedir = /usr/local/mysql
datadir = /opt/mydata/data
tmpdir = /opt/mydata/tmp
log_bin = /opt/mydata/log/binlog/binlog
...
查看原MySQL的数据文件。

[root@oracletest root]# cd /newmnt/opt/mydata/
[root@oracletest mydata]# ll
total 12
drwxr-xr-x 6 995 1000 4096 Feb 11 14:03 data
drwxr-xr-x 4 995 1000 4096 Feb 11 14:03 log
drwxr-xr-x 2 995 1000 4096 Feb 11 14:03 tmp
创建相关目录。

mkdir -p /opt/mydata/data
mkdir -p /opt/mydata/tmp
mkdir -p /opt/mydata/log/binlog
chown -R mysql:mysql /opt/mydata
拷贝MySQL文件到对应的目录。

cp -r /newmnt/etc/my.cnf /etc
cp -r /newmnt/opt/mydata/data /opt/mydata/
cp -r /newmnt/opt/mydata/log/binlog /opt/mydata/log/
chown -R mysql:mysql /opt/mydata # 这一步的目的是由于原始文件在挂到新的机器上时所属用户和所属组会丢失,需要重新更改成mysql组
启动MySQL。

[root@oracletest ~]# service mysql start
Starting MySQL.2021-04-08T11:39:26.437943Z mysqld_safe error: log-error set to '/opt/mydata/log/error.log', however file don't exists. Create writable for user 'mysql'.
The server quit without updating PID file (/opt/mydata/data[FAILED]est.pid).
报错,提示没有error.log,那就创建一个,再启动MySQL。

[root@oracletest ~]# touch /opt/mydata/log/error.log
[root@oracletest ~]# chown -R mysql:mysql /opt/mydata/log/error.log
[root@oracletest ~]# service mysql start
Starting MySQL..      [  OK  ]
可以看到数据库的表也找回来了!

41367607e7fdf5582a.png

四、总结
只要没有删除数据库的数据文件,即使系统起不来了,我们仍然可以将系统的盘拆下来挂到新的机器上,将数据拷贝出来。

养成备份的习惯,正式、仿真、开发、测试环境都需要。

打赏鼓励作者,期待更多好文!

打赏
12人已打赏

飞翔的苹果 发表于 2021-4-23 08:35
  
感谢分享,有助于工作,学习学习
新手899116 发表于 2021-4-23 09:22
  
感谢分享,有助于工作,
wuliyy 发表于 2021-4-23 21:21
  
感谢分享,有助于工作,学习学习
amwpnpynn 发表于 2021-4-24 08:25
  
虚拟环境恢复起来还是比较方便,但物理环境做了raid就没有这么方便了。
新手612152 发表于 2021-4-24 08:37
  
感谢分享  学习一下.
新手078326 发表于 2021-4-24 09:17
  
感谢分享,学习学习!
深藏功与名 发表于 2021-4-25 14:25
  
MySQL也可以这么恢复,这真不错。
呆呆蛙 发表于 2021-4-26 09:37
  
感谢分享,有助于工作,学习学习
新手993100 发表于 2021-4-26 14:38
  
感谢分享,很不错幺,期待继续分享
发表新帖
热门标签
全部标签>
GIF动图学习
每日一问
信服课堂视频
技术笔记
项目案例
技术咨询
在线直播
产品连连看
技术圆桌
新版本体验
功能体验
专家分享
安装部署配置
原创分享
SDP百科
每日一记
SANGFOR资讯
标准化排查
畅聊IT
答题自测
授权
安全攻防
专家问答
MVP
网络基础知识
升级
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
技术顾问
信服故事
功能咨询
终端接入
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本

本版达人

新手89785...

本周建议达人

新手78183...

本周分享达人