数据库大文件损坏后,数据恢复操作(记录)
原因 :
数据表结构复杂且数据量大 , 加之疏忽管理未做备份 , 导致单表数据量过大 , 一次放假后数据库单表访问异常 程序访问数据库时提示 表满异常如下 , 初步以为是并发过高( 误认 ) 查看后无高并发出现, 但慢sql访问单表时均过长 , 使用重启大发 重启mysql服务 , 重启之后出现大问题 , ,直接导致表无法打开 , 只要访问异常表会直接导致mysql服务异常停止 , 启用强制恢复后 备份表原文件 *.idb *.frm , 后重建对应表结构 程序恢复正常状态 , 后导出对应文件期待恢复
问题出现时现场状态 :
硬盘150G固态( 系统盘 ) 1T机械硬盘( 逻辑分区 ) , 8G内存 , 文件保存分区的文件格式 NTFS , 数据库引擎 INNODB , 数据单表大小4.1G ,单表无法打开
后续尝试恢复操作 :
① 还原到本地数据库 , 由于本地数据库表结构 , 由于本地使用的是mysql8.0 , 所以操作时创建表结构后替换掉idb文件重启 mysql服务 , 结果跟在线上状态相同( 访问表数据时服务直接停止 )
②强制恢复后可以查询表总数据量( 绝望的开始 ) , 之后发现在访问时数据库错误日志暴涨 , 查询日志 出现异常如下 , 查询后得知是表ID与目标表不符合 ,
1) 查询目标表id为 6977
2) 创建表id至6977
③表ID完成后打开
Tablespace '*/data_product_event_collection' Page [page id: space=6977, p
结果 ( 最笨的办法写在最后 ) :
使用mysql binlog进行数据恢复
①使用mysqlbinlog “H:\app\MySQL Server 5.7\data\mysql-log.000061” -vv > 000061.binlog 进行log文件导出 , 用于查看起始位置方便执行后续操作( C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqlbinlog ) , 查看时可能看到乱码不必慌张 , 编码格式比较乱 , 打开大文件软件推荐UltraEdit ( 试用30天 )
② 执行指令 mysqlbinlog --database=database --start-position=8441152 --stop-position=8442430 “H:\app\MySQL Server 5.7\data\mysql-log.000116” | mysql -uroot -p123456 进行数据还原 ( 直接 )执行还原时可能会出现如下异常 , 大概率是起止位置选择的有问题 建议先选较短的语句进行执行 找下规则 , 剩下就是等待了
结论 :
数据库进行及时增量备份 , 或者整机同步 减少异常状态发生 , 表结构尽量简单 减少异常的发生且方便查询操作执行 避免慢SQL出现 , 对于暂时无法变更的表进行拆表保存 , 由于暂时未找到更加简单快捷的方式 , 执行binlog恢复操作