设想:
一个客户最近遇到了一个 Azure VM 的问题,其中(非操作系统)“高级”存储磁盘被错误地删除,而 Microsoft 没有发出警告。这相当于将硬盘驱动器从正在运行的服务器中拉出。
他们在此 VM 上运行 SQL Server 2014,数据和日志文件分别放置在两个“故障”驱动器上。
实时、生产、非集群数据库通过各种服务和应用程序被大量使用——当问题发生时,命令和事务很可能在 bin 进行中或提交中。
问题发生后,VM 被强制关闭,并且仅在几次重新启动后才“可操作”。
问题:
虽然到目前为止似乎没有发现任何问题,但我的问题是这可能出现的 SQL 故障模式是什么?事务日志/SQL 服务器架构是否会导致这种类型的整个磁盘故障?在这种情况下是否可能丢失数据(不考虑磁盘本身的损坏)。在此类事件之后应该/可以执行哪些检查?
SQL Server 使用预写日志 (WAL),因此任何已完成的事务至少应该已刷新到磁盘(除非您使用延迟持久性)。这意味着当您的数据库重新联机时,所有已提交的事务都将从日志文件中重播。进行中的事务也将被回滚。
尽管有 WAL 架构,但我确信 Windows 不会意识到突然的磁盘丢失。数据似乎很可能已损坏 - 例如,如果将一个 8 KB 页面刷新到物理日志文件的一半,并且在那一刻删除了磁盘,那么日志似乎会损坏。
如果您使用的是完全恢复模式,您可能仍然会在损坏之前进行时间点恢复。但是由于部分写入,会有一些数据丢失。
除了跑步,真的没什么可做的
DBCC CHECKDB
。这将检查数据库以查看它是否在此异常事件中损坏。另一种选择是将备份(在此事件之前)恢复到单独的数据库/服务器,然后使用比较工具(如Red Gate 的SQL 数据比较)查看备份和备份之间是否有任何数据不同。当前数据库。