故障现象:
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;