技术分享
mysql 5.6 通过.frm和.ibd恢复数据
2021-06-03
突然某种原因,比如服务器断电等,再重启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保持版本一直
- 标签:
-
网络安全