2011-03-25 104 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中存在的所有路径表。

所以基本上,你正在推动决定一个文件是否被删除到恢复操作,而不是备份操作。