2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個贊
您可以調(diào)用FlushViewOfFile
,它啟動臟頁寫入,然后FlushFileBuffers
,根據(jù)本文,它保證頁面已被寫入。
每次寫入后調(diào)用FlushFileBuffers
可能“更安全”,但不建議這樣做。你必須知道你能承受多少損失。有一些模式可以限制這種潛在的損失,即使是最好的數(shù)據(jù)庫也可能遭受寫入失敗。您只需要以盡可能少的損失恢復(fù)生活,這通常需要一些多階段提交的日志記錄。
我想可以打開內(nèi)存映射文件, FILE_FLAG_NO_BUFFERING
但這FILE_FLAG_WRITE_THROUGH
會消耗你的吞吐量。我不這樣做。我為異步 I/O 打開內(nèi)存映射文件,讓操作系統(tǒng)通過它自己的異步 I/O 完成端口實(shí)現(xiàn)來優(yōu)化吞吐量。這是最快的吞吐量。我可以容忍潛在的損失,并已適當(dāng)減輕。我的內(nèi)存映射數(shù)據(jù)是文件備份數(shù)據(jù)......如果我檢測到丟失,一旦硬件錯誤被清除,我可以檢測并重新備份丟失的數(shù)據(jù)。
顯然,文件系統(tǒng)必須足夠可靠才能運(yùn)行數(shù)據(jù)庫應(yīng)用程序,但我不知道有任何供應(yīng)商建議您仍然不需要備份。壞事會發(fā)生。計(jì)劃損失。我做的一件事是我從不寫入數(shù)據(jù)中間。我的數(shù)據(jù)是不可變的和版本化的,每個“數(shù)據(jù)”文件限制為 2gb,但每個應(yīng)用程序采用不同的策略。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個贊
NTFS 文件系統(tǒng)(和 ext3-4)使用事務(wù)日志來操作更改。每個更改都存儲在日志中,然后日志本身用于有效地執(zhí)行更改。除了災(zāi)難性的磁盤故障外,文件系統(tǒng)被設(shè)計(jì)為在其自己的數(shù)據(jù)結(jié)構(gòu)中保持一致,而不是您的:在崩潰的情況下,恢復(fù)過程將決定回滾什么以保持一致性。在回滾的情況下,您的“尚未寫入但要寫入”的數(shù)據(jù)將丟失。文件系統(tǒng)將是一致的,而您的數(shù)據(jù)則不是。
此外,還涉及其他幾個因素:軟件和硬件緩存引入了一個額外的層,因此是一個故障點(diǎn)。通常操作是在緩存中執(zhí)行的,然后緩存本身會刷新到磁盤上。文件系統(tǒng)驅(qū)動程序不會看到“在”緩存中執(zhí)行的操作,但我們會看到刷新操作。這樣做是出于性能原因,因?yàn)橛脖P是瓶頸。硬件控制器確實(shí)有電池,以保證即使在斷電的情況下也可以刷新自己的緩存。
扇區(qū)的大小是另一個重要因素,但不應(yīng)考慮此細(xì)節(jié),因?yàn)槌鲇诨ゲ僮餍阅康?,硬盤驅(qū)動器本身可能與其原始大小有關(guān)。
如果你有一個 mewmory 映射并且你在中間插入數(shù)據(jù),當(dāng)電源關(guān)閉時,如果文件的內(nèi)容超過了內(nèi)部緩沖區(qū)的大小,則文件的內(nèi)容可能部分包含你所做的更改。
TxF 是一種緩解問題的方法,但有幾個影響限制了您可以使用它的上下文:例如,它不適用于不同的驅(qū)動器或共享網(wǎng)絡(luò)。
為了成為 ACID,你需要設(shè)計(jì)你的數(shù)據(jù)結(jié)構(gòu)和/或你使用它的方式,以免依賴于實(shí)現(xiàn)細(xì)節(jié)。例如,Mercurial(版本控制工具)總是將自己的數(shù)據(jù)附加到自己的修訂日志中。有許多可能的模式,但是,您需要的保證越多,您獲得的技術(shù)就越具體(并且與之相關(guān))。
- 2 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報(bào)