专业的编程技术博客社区

网站首页 > 博客文章 正文

mysql数据库损坏,我是怎么恢复的

baijin 2024-09-23 03:44:39 博客文章 4 ℃ 0 评论

背景

甲方公司反馈说网站某些页面提示500错误,数据人员给我打电话说这个问题时是大晚上,看来问题是需要紧急解决的,我当时第一反应是定时任务等业务方面的延迟问题,电话中我跟他说了这种情况,当时我并没有向他说技术方面的问题,因为在我印象中,该网站已经运行了数年没有问题,我告诉他我需要检查检查,稍后给他反馈。

奇葩的问题

这里简单说下我查找问题的顺序(每个人的习惯不一样,适应自己的是最好的)。

我登上easyconnect进入甲方公司的内部服务器,首先打开服务器日志,动态监听,刷新网页,查看报错日志,大部分日志错误是执行sql语句报错,这种情况我第一反应是数据错误,为了验证我的猜想,我打算进入数据库查看表数据,我像往常一样输入密码进入数据库,注意,真相就要浮出水面了,我使用use切换到报错的数据库,我熟练的敲下了回车键,映入我眼帘的并不是熟悉的ok,而是connect to server error,我很吃惊,我尝试用navicat远程连接数据库,能连上!我镇定的用紧张的手指点击之前Use的数据库,能打开!吃惊!我黑人问号,我思索片刻,按下心中的猜想,决定先去看看mysql错误日志,不管两个客户端如何表现,报错问题可能藏在mysql的错误日志里。

因为是接手的项目,我先找到my.cnf文件,从中找到了我需要的错误日志的路径,打开日志,从中找到了如下error:InnoDB: Error: trying to access page number which is outside,打开chatgpt,输入错误,从他给出的回答,有一项是表损坏。

在解决问题前,我需要备份数据库,使用mysqldump报错,用navicat转储报错,错误都是执行命令丢失与服务器的链接,看来无法备份了,原因可能确实是某些表损坏了,因为navicat能连上数据库,我尝试着打开表,部分能打开,部分不能打开。问题是表损坏的原因更加确定了。

解决过程

既然是表损坏,我尝试删掉重新建表,他给了我惊喜的结果,查询此表正常打开,插入测试数据,页面能正常显示,到这里,我确认表存坏了,但问题来了,我不会修复表,网上查询各种解决办法,加配置innodb_force_recovery,设置了1-6,不管用,其他方式也尝试了,不管用,脑袋大了,因为甲方催促,和领导商量决定,重装mysql数据库,因为无法备份,该项目之前也没有备份数据,决定使用项目刚开发完本地用的测试数据,之后新增缺少的数据。

重装mysql和导入数据这里就略过了,这里接着说一下接下来遇到的一个问题。

测试数据和线上数据相差悬殊,数据人员不干!让我导没有损坏的表,本着我这里容易做得原则,由我干,悲催的来了,线上数据库宕了,尝试各种方式也无法重启,

只能走下一步了:使用ibd文件恢复数据。

使用ibd文件恢复数据

1:在本地安装了和线上相同版本的msql,创建同名数据库

2: 创建需要恢复的表会生成idb和frm文件

3: 删除表空间(ibd文件),使用如下命令:alter table 表名称 discard tablespace;

4:将需要恢复的ibd文件复制到新创建的数据库的DATA文件夹下,并修改文件权限

我的是放在如下位置

chown mysql:mysql 表名称.ibd

5:重新导入表空间alter table 表名称 import tablespace;

接下来就是大量表的恢复了,转储导入,超多,累!如果哪位大佬有更好的方式,留言,拜谢!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表