如果在復製文件時修改了文件會發生什麼?
如果在 cp 操作過程中,例如 35% 的過程中,fileA.big 附加了新資訊並從 900MB 增長到 930MB,那麼將文件說 fileA.big (900mb) 從位置 B 複製到位置 C 會有什麼影響?
最終副本(即位置 C 的 fileA.big)的結果是什麼?
如果拷貝70%左右,原文件更新了但是這次被截斷到400MB(即拷貝進度超過截斷點),最後拷貝的結果是什麼?
指的是 ext3/ext4 文件系統上的 Linux 作業系統。沒有捲影魔法等。只是普通的老cp。複製實時 CouchDB 文件進行備份引發了好奇心,但對一般場景而不是特定案例更感興趣。
如果
fileA.big
在複製期間增長,則副本將包括附加的數據。如果文件被截斷的時間短於副本目前所在的位置,則副本將在其所在位置中止,並且目標文件將包含在其中止時所複製的內容。
帕特里克或多或少是正確的,但這就是原因。在 UNIX 下複製文件的方式是這樣的:
- 嘗試從中讀取一些(更多)字節
fileA
。- 如果我們因為處於(或超過)文件末尾而未能獲取字節,那麼我們就完成了;放棄。
- 否則,將字節寫入
fileB
並循環回到步驟 1。知道這一點,並且知道它就這麼簡單,讓我們看看一些極端情況。
一旦我們找到文件的結尾,複製就完成了。因此,假設我們的文件在複製期間正在增長,但增長速度比我們複製它時要慢。複製程序將繼續超過原始文件大小,因為當它到達那裡時,文件中還有更多內容。但是在某些時候,它會趕上文件的末尾,並且它知道它在末尾,因為它現在無法讀取更多字節。所以它就在那裡退出,即使文件即將進一步增長。
如果文件被截斷,複製程序會說“哇,我已經過了文件末尾!” 並退出。
如果文件的各個部分被數據庫程序隨機更新:-),那麼您的副本將是新舊數據的某種混合,因為數據不是同時複製的。結果可能是一個損壞的副本,這就是為什麼製作實時數據庫的副本通常不是一個好主意。
(也就是說,我不熟悉 CouchDB,並且可以設計一個數據庫來抵抗這種損壞。但最好絕對確定。)