回答
的sync()
系統調用是幾乎沒有任何幫助;它承諾安排寫入磁盤操作,但這是所有。
使用正常的技術是設置正確的選項,當你open()
爲磁盤文件的文件描述符:O_DSYNC
,O_RSYNC
,O_SYNC
。但是,fsync()
和fdatasync()
變得非常接近相同的效果。你也可以看看O_DIRECTIO
,它經常被支持,雖然它根本不是POSIX的標準。
最終,DBMS依賴於O/S進行的書面和同步的數據到一個磁盤是安全的。只要設備將總是返回DBMS上次寫入的內容,即使它由於緩存而不在實際磁盤上(因爲它是在非易失性緩存中備份的,或者類似的東西),那麼它並不重要。另一方面,如果你有NAS(網絡附加存儲),它不能保證你最後寫的東西(並且被告知在磁盤上是安全的)會在你讀到它時返回,那麼你的DBMS如果必須做復甦。因此,您應該謹慎選擇數據庫的存儲位置,確保存儲的運作合理。如果存儲不能像假想磁盤一樣工作,那麼最終會丟失數據。
DirectIO不提供此問題要求提供的保證。但是,OSYNC標誌可以打開什麼是預期的,當然。 – ArekBulski
是,fsync
內核的現代版本確實都閃速存儲器(高速緩存)的磁盤和磁盤硬件緩衝區拼盤。手冊頁說舊的內核過去只做第一件事。
說明FSYNC()傳輸(「沖洗」)中的所有修飾在覈心數據(即,經修飾的緩存頁)由文件descrip- TOR FD稱爲 到磁盤的文件 設備(或其他永久存儲設備),以便即使在系統崩潰或重新引導後也可以檢索所有更改的信息 。 這包括 寫入或刷新磁盤高速緩存(如果存在)。 調用塊,直到設備報告傳輸已完成 。它還將與文件關聯的元數據信息(參見stat(2))刷新爲 。
舊版內核中的fsync()實現和較少使用的 filesys不知道如何刷新磁盤緩存。在這些 案例中,需要使用hdparm(8)或 sdparm(8)禁用磁盤緩存以確保安全操作。
這是指應用程序可以要求什麼。 Fsync是文件系統提供給應用程序的接口,文件系統本身使用下面的其他內容。文件系統使用障礙,或者明確的沖洗和FUA請求來提交日誌。看看LWN post.
- 1. 如何在java程序中實現SQLite的預寫式日誌記錄
- 2. 日誌改變實現?
- 3. 實現日誌觀察器
- 4. 如何實現日誌?
- 5. 星火流預寫日誌重啓
- 6. 在Golang中實現日誌文件appender
- 7. pkill的擔保
- 8. 線程安全日誌類實現
- 9. 如何分離日誌實現和API?
- 10. Websphere 8.5:Class org.apache.commons.logging.impl.Jdk14Logger沒有實現日誌
- 11. 你更喜歡什麼日誌實現?
- 12. 如何實現日誌系統
- 13. 實現線程安全日誌記錄
- 14. android - 如何實現日誌記錄
- 15. Git的日誌和現實不匹配
- 16. 使用Log4net實現彩色日誌
- 17. 如何實現呼叫日誌的ContentObserver
- 18. WCF實現簡單日誌記錄
- 19. 在kubernetes中寫入日誌
- 20. SLF 4J日誌不會寫入日誌
- 21. serilog寫日誌.netcore
- 22. Log4net不寫日誌
- 23. Scrapy日誌記錄:配置日誌重寫日誌文件
- 24. 出現SSLHandshakeException在日誌
- 25. 預計間諜日誌
- 26. 使用新的預寫日誌(WAL)日誌預填充核心數據SQL存儲
- 27. 日誌無法寫入日誌文件,但寫的classpath 安慰
- 28. Pubsubhubbub擔保交付
- 29. 在windows事件日誌中寫入activemq日誌
- 30. Glassfish LDAP日誌記錄正在填寫日誌文件
我會看看SQLite網站上的解釋。它涵蓋了如何使用這些方法,因爲它提供了何時使用硬件(同步)刷新的概述等。 – 2012-05-24 04:17:45