故障现象:

1、Windows Server2012上运行的MySQL服务启动不起来;

D:\mysql-5.6.41-winx64\data\WIN-PIIPET1I95S.err
InnoDB: Database was not shutdown normally!
InnoDB: Doing recovery: scanned up to log sequence number 5026088332
2024-10-28 08:34:40 d98  InnoDB: Operating system error number 1117 in a file operation.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
2024-10-28 08:34:53 2664 [ERROR] InnoDB: File .\ibdata1: 'Windows aio' returned OS 
error 1217. Cannot continue operation
---
事件查看器报错:
InnoDB: File .\ibdata1: 'Windows aio' returned OS error 1217. Cannot continue operation 
   InnoDB: from the doublewrite buffer...  
   InnoDB: Database was not shutdown normally!  

2、通过删除然后自动生成ibdata1,MySQL服务启动正常,但是Navicat查看业务数据库atc_ty里面的表信息闪现一下就消失;

 select * from information_schema.tables;  里面没有atc_ty的表名!!!


Tip:

1、数据库密码可以从apache-tomcat-8.5.29\webapps\ROOT\WEB-INF\classes\config\application-taiyuan配置文件获取;

2、mysql-5.6.41,atc_ty库中表的引擎InnoDB(独立表空间)  ibdata1/ibd文件 

3、该系统使用以毫秒为单位的13 位时间戳,是从 1970 年 1 月 1 日 00:00:00 UTC 到特定时间点的毫秒数。例如,1685448000000 代表 2023 年 5 月 29 日 00:00:00 的时间戳。


恢复步骤总结:

1、从备份服务器将整个data目录拷贝来覆盖同名目录(因为两者平台,mysql版本和数据库结果均一致,只是数据是旧的);

2、出现问题的数据库服务器有 .frm 和 .ibd 文件(.frm:存储表定义; .ibd:存储数据和索引)。表定义已经OK,需要从ibd文件恢复每个表的数据: 

  • 依次将所有的表,alter table table_name DISCARD TABLESPACE,表的数据文件将不再与数据库的表空间关联,但表结构仍然存在于数据库中,这时.idb文件就可以覆盖了;
  • 覆盖拷贝所有表的.idb文件;
  • 依次将所有的表,alter table table_name IMPORT TABLESPACE,表的数据文件(新数据)将重新与数据库的表空间关联,使表恢复正常使用状态,实现表的数据恢复。

3、有11个表DISCARD TABLESPACE时报错:外键限制。需要先关闭外键约束检查set foreign_key_checks=0,操作完后再恢复set foreign_key_checks=1。

4、atc_seat_qualification和atc_tyattendance清理1年前的数据,结果出现刷脸“无上岗权限”报错,恢复后OK。

5、遗留问题,atc_attendance_record_new冗余数据待清理,否则异常慢。

 select count(*) from atc_attendance_record_new;
 718577条数据

直接删除就卡死,按一下步骤删除:

  • 创建临时表,结构与原表相同:CREATE TEMPORARY TABLE temp_table LIKE original_table;
  • 将满足特定条件的记录插入临时表:INSERT INTO temp_table SELECT * FROM original_table WHERE condition_to_keep;
  • 删除原表:DROP TABLE original_table;
  • 将临时表重命名为原表名:RENAME TABLE temp_table TO original_table;