突然某种原因,比如服务器断电等,再重启mysql,发现无法重启,报错1067.
[ERROR] InnoDB: File (unknown): 'read' returned OS error 101. Cannot continue operation
从data目录的**.err日志看了半天看不出任何线索。
根据网上各种办法,尝试始终无法正常启动mysql,基本认定是ibdata1文件损坏。
然后只能通过.frm和.ibd恢复表数据了。
首先我们要知道:
a .frm存放数据库的表结构
b.ibd存放数据内容
c.这个是对innodb的数据恢复。myisam不需要这么麻烦,只要数据文件存在直接复制过去就可以。
数据恢复:
1:创建数据库(创建一个新库)
2:创建需要恢复的表(在新库中创建要恢复的表,如果你不知道表结构,通过.frm文件也可以搞出来结构)
CREATE TABLE `log_pbetebs_order` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`WORKORDERID` int(11) DEFAULT NULL COMMENT '工单标识',
`OPERATESTATE` varchar(100) DEFAULT NULL COMMENT '处理状态',
`LASTTRACE` varchar(100) DEFAULT NULL COMMENT '处理跟踪',
`BOOKDATE` datetime DEFAULT NULL COMMENT '预约安装时间',
`PROBLEMTYPE` varchar(300) DEFAULT NULL COMMENT '问题类别',
`OPERATERESULT` varchar(100) DEFAULT NULL COMMENT '操作结果',
`REMARK` varchar(3000) DEFAULT NULL COMMENT '备注',
`USERNAME` varchar(100) DEFAULT NULL COMMENT '操作人员',
`CREATETIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '工单操作时间',
PRIMARY KEY (`ID`),
KEY `WORKORDERID` (`WORKORDERID`)
) ENGINE=InnoDB AUTO_INCREMENT=254483 DEFAULT CHARSET=utf8;
这样就会在对应的数据库下产生.frm和.ibd文件
请注意:创建表时候的字段和需要被恢复的表的一致
3:执行
ALTER TABLE 表名字 DISCARD TABLESPACE; --卸载表空间
这时候数据库文件下面的 xxxx.ibd 文件就会消失
4:将备份的xxxx.ibd放到刚才消失的位置( mysql安装目录/data/数据库名称/ )
5:修改权限,所有者mysql,权限660 (若是windows系统,则不需要执行)
6:执行
ALTER TABLE 表名字 IMPORT TABLESPACE; --加载表空间
恭喜你,到此就已经恢复成功了!
有些需要注意的地方:
1. 要严格安装上面的步骤来,不能直接覆盖
2. 本地操作的mysql与待恢复的mysql保持版本一直
本文主要参考https://blog.youkuaiyun.com/qq_41116956/article/details/82996319,经尝试完全可用。
感谢网友的分享,希望此文也能帮助到正处于焦虑而一筹莫展的朋友!