zoukankan      html  css  js  c++  java
  • 数据库Table doesn't exist in engine

    前一段在月黑风高的夜里,修改线上服务器的表结构,直接导致崩溃,在此记录过程;

    事件回顾

    原始表结构

    原始表结构类似如下,原先只有一个bill_sn的唯一索引(索引类型为HASH,这里本身就是有些问题的);

    CREATE TABLE `op_bill`(`id` bigint(20) NOT NULL AUTO_INCREMENT,
    `billSn` varchar(17) NOT NULL COMMENT '单号',
     `imcome` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '收入金额',
     `outgo` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '支出金额',
     `currentBalance` decimal(10,2) NOT NULL COMMENT '当前帐户余额',
     `type` int(10) NOT NULL DEFAULT '1' COMMENT '1 支付 2 退款 3 充值',
     `createAt` datetime NOT NULL,
     PRIMARY KEY (`id`),
     UNIQUE KEY `bill_sn` (`billSn`) USING HASH,
    )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='流水信息(帐户余额变更记录)';
    

    修改表结构

    • 修改语句很简单,如下:
    ALTER TABLE `op_bill` ADD INDEX `create_at` (`createAt`) USING BTREE ;
    
    • 执行后提示:ERROR 2013 (HY000): Lost connection to MySQL server during query
    • 再次刷新后提示 对该表的任何操作均会提示:Table doesn't exist in engine,但show tables可以显示出该 表

    处理过程

    尝试1:
    查看表结构文件及数据文件,无缺失
    查询ibdata/ibdata_logfile1/ibdata_logifle2等文件,无缺失;
    重启数据库无效;
    
    尝试2:
    新建一张相同表结构的表,表名定义为xxx_1,修改项目中对应的表,让线上环境能够写入数据,记录当前的position地址;
    在测试环境测试,删除原表,提示一个警告,查询表已经删除,但新建该表结构时又提示该表存在,已经删除表结构文件与表数据文件,尝试几次无果;
    重构测试数据,在强制恢复模式下可以完全删除该表,然后重建表结构(xxx);
    
    恢复数据
    • 找到之前冷备份的数据,筛出该的数据,导入;
    • 从冷备数据找到备份时的postion,和数据库donw时的position,从mysql-binlog中找出该时段内该表的执行sql(mysqlbinlog -d xxx > xxx.sql);
    • 从sql中grep该表的记录,并导入到表中;
    • 将异常时间段内的数据(xxx_1)写入到xxx表中(insert inot xxx select * from xxx_1);

    异常总结

    • 这次可能是遇到了mariadb的bug;
    • 要有测试环境,两个环境的数据库环境要保持一致,所有操作在测试环境先测试无误后再到生产环境;
    • 数据库至少一天内的全备数据要有;
    • 直接删表的方法有待商榷,是否有修复成功的可能性;
  • 相关阅读:
    JS弹出下载对话框以及实现常见文件类型的下载
    什么是物理像素、虚拟像素、逻辑像素、设备像素,什么又是 PPI, DPI, DPR 和 DIP
    学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
    Menu实现逻辑
    控件保持多种绘图状态的做法
    2个函数宏技巧
    绘图 Painter转接口封装的方式
    DirectUI消息循环的简单封装
    c++以代理的方式来实现接口化编程
    c++对象工厂
  • 原文地址:https://www.cnblogs.com/417xiaoliu/p/11041203.html
Copyright © 2011-2022 走看看