保证提前写入日志记录的实现

Pau*_*eph 7 c algorithm file-io

如果一个人发出一系列连续的write(2)中的Linux/Unix通过分隔fdatasync(2)fsync(2)或者sync(2)是它保证了第一次写入()会在第二写入之前提交到磁盘()?以下SO帖子似乎表示不能给出这样的保证,因为涉及多个缓存层.对于保证一致性的数据库系统,这似乎很重要,因为在WAL(写入前向记录)恢复中,您需要在实际更改数据之前将日志保留在磁盘上,以便在应用程序/系统发生故障时您可以恢复到上次已知的一致状态.如何在实际的数据库系统中确保/实现?

Jon*_*ler 1

系统sync()调用实际上没有任何帮助;它承诺安排写入磁盘操作,但仅此而已。

open()使用的常规技术是在设置磁盘文件的文件描述符时设置正确的选项: O_DSYNC, O_RSYNC, O_SYNC。然而,fsync()fdatasync()的效果非常接近。您还可以查看O_DIRECTIO哪些通常受支持,尽管 POSIX 根本没有标准化它。

最终,DBMS 依靠操作系统来确保写入和同步到一个磁盘的数据是安全的。只要设备始终返回 DBMS 最后写入的内容,即使由于缓存而尚未位于实际磁盘上(因为它备份在非易失性缓存或类似的东西中),那么它并不重要。另一方面,如果您的 NAS(网络附加存储)不能保证您上次写入的内容(并被告知在磁盘上是安全的)在您读取时会返回,那么您的 DBMS 可能会受到影响(如果必须这样做)恢复。因此,您需要谨慎选择存储 DBMS 的位置,确保存储正常工作。如果存储不能像假设的磁盘那样充分工作,您最终可能会丢失数据。