我们有运行 SQL Server(2008 SP4 和 2016 SP1)的 PC,它们经常断电。显然,这有时会导致 SQL Server 数据库(索引)损坏,我们需要在之后进行恢复。
我知道 SQL Server 不是为这种情况而设计的,正确的解决方案是解决掉电的原因(如果您好奇,请参阅下文)。尽管如此,我可以设置 SQL Server 中的任何调整选项来降低断电时数据库损坏的风险吗?
背景:“PC”是安装在叉车上的 Windows 平板电脑。当用户关闭叉车时,平板电脑就会断电。我们曾尝试教用户在关闭叉车之前正确关闭 Windows,但失败了(可能是因为大多数时候只是将其关闭“有效”)。我们目前还在研究其他选项,例如添加一个 UPS,该 UPS 会向平板电脑发出信号以在断电时关闭。
实际上,它旨在处理功率损耗,这就是为什么会有诸如预写日志(WAL)和启动时崩溃恢复(或任何你想称之为的东西)之类的东西。完成此操作的方法之一是选择不缓存写入,这似乎是平板电脑正在执行的操作,因此会损坏。
不,SQL Server 正在做它应该做的。您应该查看 SQL Server 外部(用于驱动器缓存的 Windows 设置 [SQL 想要关闭但我们不能强迫您]、硬件/固件更新等),或者正如 Eric 所说,购买外部电源相对可以解决症状的便宜(实际问题可能是某种类型的缓存或电池支持的写入,但实际上并未得到支持)。
如果平板电脑有可用的电池,您可以将 Windows 配置为在电池电量不足时关闭。
如果平板电脑的电池不工作,请考虑更换电池。(我有过这样的笔记本电脑——你会惊讶于 eBay 上的替换电池是多么便宜。它们不如 OEM 好用,但是,在这种情况下,有总比没有好。)
如果平板电脑根本没有电池功能,请考虑添加一个带有 USB 输出的小型不间断电源 (UPS),它可以与 Windows 通信,以告知它何时使用电池供电。(例如,我将自己的桌面配置为在 UPS 电池电量不足时关闭 - 这样即使我不在家,它也会在停电时关闭。)
如果这些都不是一个选项,那么你有点不走运。这是一份旧的白皮书,但 Microsoft 的SQL Server 2000 I/O Basics基本上解释了您需要一个可以优雅地处理断电的 I/O 子系统。
您可以使用一些选项来增加风险 - 例如延迟持久性或仅内存(非持久)表 - 但默认情况下,SQL Server 已经尽最大努力在每次写入事务日志时最大限度地提高可靠性。如果由于随机断电甚至无法保证事务日志写入,请花 100 美元购买 UPS 电池。
假设由于无线连接不稳定,您在叉车上有一个本地数据库而不是服务器?显然,让 SQL 从叉车上下来将是更可取的解决方案。
无论如何,就像布伦特建议的那样,将平板电脑设置为在电池供电 x 分钟或一些类似标准后自行关闭。
如果做不到这一点,那么在这种情况下,可以启动正常关机的小型 UPS 可能是你最好的选择。依靠用户来做这样的事情是要求失败。
底层操作系统必须保证写入成功或返回错误。操作系统反过来依赖于驱动程序,而驱动程序又依赖于依赖于硬件的固件如果驱动程序、固件或硬件存在,则 Windows 或 sql server 对此无能为力。
这就是为什么您需要咨询驱动程序/固件/硬件制造商的原因。
此外,必须保证所有层的写入顺序,因此也需要检查。
即使是电池支持的缓存也可能出现故障,例如在纽约风暴期间,一些数据中心数天都无法访问,电池可能会耗尽,可能会丢失通勤写入
https://www.postgresql.org/docs/devel/static/wal-reliability.html
https://brad.livejournal.com/2116715.html
http://rhaas.blogspot.com/2010/10/wal-reliability.html?m=1
要扩展其他答案:
首先,如果可能的话,试着把 SQL 从叉车上拿下来。认为从断电中恢复是不好的,在笔记本电脑被 7,000 多磅碾压后尝试这样做。有数小时的仓库活动,没有备份......
其次,笔记本电脑在电池使用 x 次后自动关机的机制无论如何都应该到位。
第三,将笔记本电脑连接到叉车上的非开关电源是否是一种选择?一定要考虑安全规定(环境可能要求使用叉车钥匙关闭所有东西),以及叉车在两次使用之间放置多长时间(尤其是在周末和节假日),以避免耗尽机器电池。