写这篇文章的时候,刚刚才把一个旧数据库恢复。起因是在服务器配置环境的时候,一个错误命令把整个服务器硬盘初始化了。我用的是阿里云ECS。此时赶紧重启(一定要快,拖越长你硬盘上缺失的文件越多),重启时会提示正在初始化是否停止,强制了两三次终于停止了服务器,也就是好在这个时候停止了,才保住了宝塔里www这个目录。这个时候灾难来了,之前的数据全部没有来得及备份和导出。
如果你也和我同样的情况,不管是什么原因导致Mysql或系统已经无法进入了,但是你原来Mysql的data目录下的文件还在的话,是100%有机会恢复的,前提必须是这些文件都没有损失没有缺失。
下面我写一下步骤,跟同样遇到这种遭遇的朋友分享一下方法,首先要感谢ChatGPT,在我不是很懂Mysql语法的情况下,不停的询问ChatGPT,以下的方法也是建立在它给我的指引下操作成功的。
我之前的是mysql5.6,在data目录下的文件只有两种格式,同样名称的文件会产生一个.ibd文件,一个.frm文件,还有一个db.opt文件是系统默认生成的可能不用管。建议用第三方的数据管理工具,我用的是Navicat。如果没有的话,你直接在宝塔里用phpMyadmin也是可以的。
第一步:
首先你要把原磁盘Data目录下的所有数据库文件全部备份下来到本地。
在新的服务器环境中成功安装运行与之前同样版本的Mysql服务(必须是同版本),我之前是Mysql5.6,所以我新建的环境还是Mysql5.6 创建一个新的数据库,例如:newdatabase。
第二步:
如果你有原来的表结构SQL或之前备份过有SQL文件,把表结构导入到新建的数据库当中。
如果你啥也没有了,把你原来数据库中的所有.frm后缀的文件上传到新的Mysql的data目录下。
宝塔的默认路径是:/www/server/data/newdatabase
.frm文件上传后,用Navicat或宝塔的phpmyadmin访问这个数据库,你应该是可以看到所有的表名了,但是这些表是打不开的。
第三步:
接下来,在查询命令里输入以下命名:(表称为你数据库里的真实表名称,如果表很多,就一行一个不同的表名称)ALTER TABLE 表名称 DISCARD TABLESPACE;
这个是解除原来的表结构
第四步:
把这个表名称对应的.ibd文件上传到你的新数据库目录下,然后记得把这个.ibd文件的权限改成:660
上传完成后,同样在查询命令里输入:ALTER TABLE 表名称 IMPORT TABLESPACE;
这行命令的意思是导入新的数据文件,也就是你刚上传的.ibd文件。
如果没出现错误提示,那么你这一个表的数据就已经恢复了。你可以试试打开这个表检查一下是否正常。其他的表也是同样的方法,先解除原来的表结构数据,再导入新上传的ibd数据。
关于批量处理的方法:
一个数据库里肯定不止一个表,少则几十,多则几百上千。如果按上面的方法,一条一条输命令你肯定会崩溃。我是在不借助任何第三方工具情况上用了一个最原始的方法来批量处理。
首先在你保存ibd和frm的目录里,新建一个txt文本,在文本里输入并保存:
DIR *.frm/B>LIST.TXT
然后把这个文件的后缀改成bat格式。双击运行这个文件,此时就会在这个目录下生成一个list.txt文件,保存了这个目录里所有表的名称。
把文件全选,复制到Excel表格里,自动会一行一个,在前后加上刚刚的命令,再全选复制到SQL查询语句里就可以实际批量处理了。
评论(0)