几天前由于停电,客户的系统重新启动,导致数据库回滚。
但是由于这次回滚,我们丢失了各个表中大约 2k 条现有记录(这些记录已经存在于 DB 中)。
这就像 DB 的状态转移到前几天的状态一样(大约 2-3 天前)。
可能是什么原因?日志中没有看到任何错误:
2015-01-13 11:16:41 1664 [注意] InnoDB: InnoDB内存堆已禁用
2015-01-13 11:16:41 1664 [注意] InnoDB: 互斥锁和 rw_locks 使用 Windows 互锁函数
2015-01-13 11:16:41 1664 [注意] InnoDB:压缩表使用zlib 1.2.3
2015-01-13 11:16:41 1664 [注意] InnoDB: 未使用 CPU crc32 指令
2015-01-13 11:16:42 1664 [注意] InnoDB:初始化缓冲池,大小 = 101.0M 2015-01-13 11:16:42 1664 [注意] InnoDB:已完成缓冲池初始化
2015-01-13 11:16:42 1664 [注意] InnoDB: 支持的最高文件格式是Barracuda。
2015-01-13 11:16:42 1664 [注意] InnoDB: ibdata文件中的日志序列号145957754和145957754与ib_logfiles中的日志序列号146939560不匹配!
2015-01-13 11:16:42 1664 [注意] InnoDB: 数据库未正常关闭!
2015-01-13 11:16:42 1664 [注意] InnoDB:开始崩溃恢复。
2015-01-13 11:16:42 1664 [注意] InnoDB:从.ibd 文件读取表空间信息...
2015-01-13 11:17:10 1664 [注意] InnoDB: 恢复可能写入一半的数据页
2015-01-13 11:17:10 1664 [注意] InnoDB:来自双写缓冲区... 2015-01-13 11:17:28 1664 [注意] InnoDB:128 个回滚段处于活动状态。
2015-01-13 11:17:29 1664 [注] InnoDB:等待清除开始 2015-01-13 11:17:29 1664 [注] InnoDB:5.6.13 已启动;日志序列号 146939560
2015-01-13 11:17:30 1664 [注] 服务器主机名(绑定地址):'*';端口:3306 2015-01-13 11:17:30 1664 [注] IPv6 可用。 2015-01-13 11:17:30 1664 [注] - '::' 解析为 '::'; 2015-01-13 11:17:30 1664 [注] 在 IP 上创建服务器套接字:'::'。 2015-01-13 11:17:35 1664 [注] 事件调度程序:已加载 0 个事件
2015-01-13 11:17:35 1664 [注意] C:/Program Files/MySQL/MySQL Server 5.6/bin\mysqld:已准备好连接。
版本:'5.6.13' 套接字:'' 端口:3306 MySQL 社区服务器(GPL)
2015-01-13 11:18:21 1664 [注意] C:/Program Files/MySQL/MySQL Server 5.6/bin\mysqld:正常关闭
环境:Windows 7 + Apache Tomcat 7.0 + Mysql 5.6服务器+Apache Active MQ
答案1
我怀疑任何 SQL 引擎都会回滚几天的更新。通常是最后几笔交易。只有在一种情况下它才能回滚几天 - 你每天有 0.5 笔交易,而且你很幸运在交易发生的那一刻停电了。
即使我错了,除了添加 UPS(显而易见的选择)之外,您还可以添加从属/备用/副本 - 无论这在您的 SQL 引擎中如何称呼。甚至可以添加自动启动发电机。
您还可以使用快照。例如 ZFS 快照(虽然不是 Windows 的选择,但您提到的一切听起来对 Windows 来说都很陌生,所以实际上我不知道是什么让您使用 Windows 来做这件事)或 SAN 提供的快照。如果您没有,您绝对应该获得可以执行这些操作的东西。或者决定 - 可能是您的数据不值得(这不是讽刺,有很多数据并不那么重要)。
答案2
我建议添加一个UPS,然后根据“无电源”信号干净地关闭您的服务。