我认为页面撕裂不是问题所在。据我所知,所有驱动器都有足够的电力存储,以便在断电时完成当前扇区的写入。
问题是每个人都在说谎。
至少当数据库知道事务何时提交到磁盘时,每个人都在说谎。数据库发出fsync,操作系统仅在所有未完成的写操作都已提交到磁盘时才返回,对吧?也许不是。这是很常见的,特别是对于RAID卡和/或SATA驱动器,您的程序被告知一切都已提交(即fsync返回),但驱动器上还没有数据。
您可以尝试使用Brad's diskchecker来了解您将要用于数据库的平台是否能够在不丢失数据的情况下继续运行。底线:如果diskchecker失败,那么运行数据库的平台就不安全。使用ACID的数据库依赖于知道事务何时已提交到后备存储,以及何时未提交。无论数据库是否使用预写日志记录(如果数据库在没有执行fsync的情况下返回给用户,那么事务可能在失败的情况下丢失,因此它不应该声称它提供ACID语义),都是如此。
有一个讨论持久性的long thread on the Postgresql邮件列表。它从谈论固态硬盘开始,然后进入SATA驱动器、SCSI驱动器和文件系统。你可能会惊讶地发现你的数据有多容易丢失。对于需要持久性的数据库的任何人来说,这是一个很好的线程,而不仅仅是那些运行Postgresql的人。