网站首页 > 技术文章 正文
一、概述
如果Linux操作系统宕机,启动不了,救援模式(rescue installed system)也行不通的时候,那么该机器上的MySQL数据还能恢复吗?如果能,怎么恢复呢?带着这个问题我们做个实验。
二、环境介绍
准备两台虚拟机,虚拟机软件为virtualbox。
IP 192.168.56.81 该虚拟机上面运行了MySQL,后面模拟这个机器崩溃,然后将MySQL数据抢救回来。
“81”上的文件:
“81”上的MySQL数据库:
IP 192.168.56.71 该虚拟机为新机器,后面需要将“81”上的数据库迁移到“71”这台机器上。
三、开始实验
删除“81”机器上的/boot目录文件,然后强制重启。
这时候系统启动失败,报error: file ‘/grup2/i386-pc/normal.mod’ not found.
关闭故障虚拟机“81”,选择强制退出。
将故障虚拟机“81”的硬盘挂载到新的虚拟机“71”上,启动新的虚拟机“71”。
通过lsblk能看到sdb就是新挂载的磁盘。
建立挂载点,挂载新的磁盘,提示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。
使用vgchange -ay /dev/vg激活逻辑卷组(vg是逻辑卷组名字),可以看到LV Status为available。
挂载逻辑卷,可以看到文件已经找回来了。
[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 ]
可以看到数据库的表也找回来了!
四、总结
- 只要没有删除数据库的数据文件,即使系统起不来了,我们仍然可以将系统的盘拆下来挂到新的机器上,将数据拷贝出来。
- 养成备份的习惯,正式、仿真、开发、测试环境都需要。
关于作者
杨豹,国泰君安专职DBA,热爱Oracle、MySQL数据库技术,熟悉shell,python编程,熟悉zabbix监控。
墨天轮原文链接:https://www.modb.pro/db/49742
猜你喜欢
- 2024-10-20 高效访问海量地图数据--GeoServer手动发布本地Shapefile地图
- 2024-10-20 详解grafana常见报错internal server error如何解决
- 2024-10-20 python教程之FTP相关操作(python2 ftp)
- 2024-10-20 僵尸毁灭工程联机教程 僵尸毁灭工程联机服务器设置
- 2024-10-20 tftp为何timeout?为何server error:(1)File not found
- 2024-10-20 MySQL server PID file could not be found!失败
- 2024-10-20 esp8266_server 的 streamFile 方法
- 2024-10-20 Java IO之字节流详解,文件字节输出流,文件字节输入流
- 2024-10-20 SQL server 2008 R2 图文安装教程(附资源)
- 2024-10-20 GET!无法连接数据库,SOLIDWORKS Electrical解决方法
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 534℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 496℃MySQL service启动脚本浅析(r12笔记第59天)
- 475℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 473℃启用MySQL查询缓存(mysql8.0查询缓存)
- 453℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 432℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 430℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)