RAM或物理文件中的事务日志?


9

我是交易的初学者,只是有关交易日志的问题。我们知道在提交事务时,更改将写入事务日志,但是事务日志是否在RAM或物理文件中?如果它在RAM中并且发生系统故障时,显然RAM将被重新擦除,因此我们丢失了事务信息,那么如何恢复提交?

Answers:


15

您可以在此处找到有关此问题的非常全面的指南,但总而言之,SQL Server不会将控制权交还给已提交事务的应用程序,除非该事务已被加固到磁盘上。具体来说,一旦将其加固为事务日志文件,就可以返回控件。

此时,数据可能尚未被加固到数据文件中,但仍可能位于数据缓冲区高速缓存中,但是由于已被加固到事务日志中,因此如果发生故障,数据库恢复可以恢复该数据。交易并安全地保留更改。

内存中有一个日志缓冲区高速缓存,用于减少顺序写入事务日志的性能影响。在几种情况下会将缓冲区刷新到磁盘,但其中之一是事务提交。在此数据被加固之前,控制权不会返回给调用者,因此即使在此缓冲区刷新期间发生故障,也会保持事务一致性,因为尚未将该事务视为已提交。您将丢失该事务中的数据更改,但是由于未提交,因此您的应用程序将已经考虑那些丢失的更改,因为提交从未完成。



4

数据库由两个文件组成,一个数据文件和一个事务日志文件。这些存储在磁盘上。

每个数据库在RAM中都有一个日志缓存,提交事务后,它将移至日志缓存,等待刷新到磁盘。因此,暂时在提交转换并等待将其刷新到磁盘时,它在内存中,但是最终它存储在文件中的磁盘中,而不是RAM中。

我在这里过分简化,建议您阅读交易日志,在这里推荐Paul Randals讲座之一

https://youtu.be/LvlFgxZZOj4


@kevinwhat感谢您的回答。因此,如果我们提交一个事务并在日志缓存中对其进行更新,则系统会在日志缓存刷新到磁盘之前发生系统故障,那么我们如何恢复该事务?

1
在这种情况下,@ slowjams将回滚事务所做的更改,因为在崩溃发生时它在日志中的磁盘上不稳定。
肖恩·加拉迪-退休用户

3
slowjamsm您想要的东西不会发生。提交是同步的-直到所有日志记录都记录到该时间点为止,该提交才完成(“强化”)。
Tibor Karaszi '19年

0

就像其他人所写的那样,在COMMIT将控制权返回给您的应用程序之前,事务日志将始终被写入磁盘。因此,日志文件应始终放置在快速SSD上。

但是为了完整起见:至少使用Windows Server 2016和SQL Server 2016,您可以向服务器添加NVDIMM(非易失性DIMM =闪存或电池供电的RAM)。在这种情况下,SQL Server将使用该NVDIMM将“热”事务日志尾部放置在NVDIMM上,因为它们在每个定义的关机事件中都可以幸免。

这将大大提高写入速度(因为RAM甚至比SSD都快得多),但是您只会在写入/提交次数很多的数据库中提到它(例如,繁忙的在线商店或在线游戏背后的数据库很多)并发玩家)。


3
这实际上不是问题的答案,它是用于更快磁盘的插件。日志并不总是需要存储在快速存储中,有许多商业原因使它们不存在。如果您想快速购买,如果您不需要速度......
James Jenkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.