2011-03-25 106 views
1

我有一個在C++上運行的異地備份解決方案,將文件分解爲塊,並使用SQLite3數據庫上的md5哈希跟蹤塊。它將塊和數據庫一起傳輸到遠程站點。增量備份:如何跟蹤文件刪除

因此,當我想要執行還原時,它將查詢SQLITE3數據庫並相應地還原這些塊。

第一次備份運行時,它會創建一個名爲base_backup的大表。每個後續的文件更改或新文件都作爲新記錄添加到新表中。如果我想執行還原,我查詢base_backup表並加上所有的差異並還原文件。

備份運行的方式是掃描給定文件夾中所有文件的歸檔位,如果清除,則驗證記錄是否已經存在於數據庫中並決定是否備份或不。

回到我的問題,如果一個文件在本地計算機上被刪除,我該如何跟蹤它並相應地更新非現場備份?因爲當我進行恢復時,我不想恢復所有的垃圾文件。無論如何知道文件是否已從文件夾中刪除?我不想從數據庫運行驗證檢查,因爲它需要很長時間。

+1

您沒有使用現有備份軟件的任何特定原因? – 2011-03-25 14:55:53

+0

像他/她正在實施他/她自己的產品? – 2011-03-25 15:07:53

+0

您是否能夠快速查看過去從給定目錄備份的文件? – Jonathan 2011-03-25 15:37:53

回答

1

inotifyIN_DELETE

+0

只有在備份程序正在運行而文件被刪除的情況下才有效。 – Gabe 2011-03-25 15:06:50

+0

對。需要一些監視過程才能運行。 – 2011-03-25 15:22:53

+0

另外,聽起來像Windows(有人提到了「存檔位」)。 – Jonathan 2011-03-25 15:35:54

0

創建服務監控的目錄(使用FindFirstChangeNotification或ReadDirectoryChangesW)

+0

謝謝,但我不希望它經常監視文件夾。 – roymustang86 2011-03-28 13:28:49

0

你可以一個新的資料片添加到您的數據庫,其中列出了上次備份時存在的文件。然後,即使文件沒有更改,備份期間也會創建一個新的(小)條目,表明它仍然存在。

從以前的指定日期恢復備份時,只能選擇在前一次備份期間具有指定它們的條目的文件。

例如,一對這樣的表可能會奏效:

Path(text) BackupIndex(int) 
path/to/file1 1 
path/to/file2 1 
path/to/file1 2 

注意path/to/file2沒有出現在備份#2,因爲它在備份過程中是不是在目錄(必須已被刪除)。

BackupIndex(int) Timestamp(timestamp) 
1     2011-03-12 7:42:31 UTC 
2     2011-03-20 8:21:56 UTC 

有人想恢復爲3月15日存在的文件,你看備份索引的表,請參閱備份#1是最近的,並期待從路徑備份1中存在的所有路徑表。

所以基本上,你正在推動決定一個文件是否被刪除到恢復操作,而不是備份操作。