Mysql服务器断电,数据库表打不开解决方案

现象:服务器突然断电,数据库重启后现场服务启动报错,提示某某表找不到 doesn’t exist,命令行链接数据库后,使用show
databases查看数据库存在,进一步use后,show tables所有的表也存在,但是进而对所有的表进行下一步操作,如select *
from xxx表,均提示:xxx doesn’t exist

解决办法:找一个新的数据库,重新创建已经损坏的表结构(字段和字段类型保持和原已损坏的表结构一致),清除该表的表空间,复制损坏表的表空间到新表,修改属组,然后重新对新表进行表空间的导入

实现:举例说明

  • 创建新表
CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  • 删除新表空间
 mysql> alter table city discard tablespace;
  • 复制已损坏表空间文件到新表空间所在目录中(具体位置不同,可在mysql的配置文件中查看data目录所在)
cp city.ibd city.ibd(此处目录为示例,具体路径根据自己情况)
  • 修改新表空间文件的属组
chown -R xxx.xxx city.ibd(xxx属组信息根据当前新表目录里面文件而定)
  • 重新读取导入自己的表空间
mysql> alter table city import tablespace;
  • 查询即可看到新表中已经有了已损坏表的数据
mysql>select ID, NAME from city;
  • 可根据需要执行是否要删除旧表数据(此时如果直接sql删除旧表的话提示已经又原来的xxx doesn’t exist变为了 Unknown table;要删除的话可在服务器中直接物理删除表 rm xxx.ibd)

原因可能是表空间ibd文件的损坏,ibd文件存储的是数据库的表的数据和索引,上述解决的思路也是通过替换该文件实现

你可能感兴趣的:(踩坑记,数据库,mysql)