Инкрементные резервные копии: как отслеживать удаление файлов

У меня есть решение для резервного копирования вне сайта, которое работает на C++, чтобы разбить файлы на блоки, и отслеживает блоки, используя хеши md5 в базе данных SQLITE3. И он передает блоки вместе с базой данных на удаленный сайт.

Поэтому, когда я хочу выполнить восстановление, он запрашивает базу данных SQLITE3 и восстанавливает блоки соответствующим образом.

При первом запуске резервного копирования создается большая таблица с именем base_backup. Каждое последующее изменение файла или новые файлы добавляются как новые записи в новую таблицу. Если я хочу сделать восстановление, я запрашиваю таблицу base_backup плюс все различия и восстанавливаю файлы.

Способ резервного копирования выполняет поиск всех файлов в заданной папке на наличие бита архива и, если он очищен, проверяет, не существует ли запись в базе данных, и принимает решение о ее резервном копировании или нет.

Что касается моего вопроса, если файл удален на локальном компьютере, как я могу отслеживать его и соответствующим образом обновлять внешнюю резервную копию? Потому что, когда я делаю восстановление, я не хочу восстанавливать все мусорные файлы. Есть ли возможность узнать, были ли файлы удалены из папки или нет? Я не хочу запускать проверку из базы данных, так как это займет слишком много времени.

3 ответа

сообщать с IN_DELETE?

Вы можете добавить новую информацию в вашу базу данных, которая перечисляет, какие файлы существовали во время последнего резервного копирования. Затем, даже если файл не изменился, во время резервного копирования будет сделана новая (маленькая) запись, указывающая, что он все еще существует.

При восстановлении резервной копии с определенной даты в прошлом, выберите только те файлы, в которых были записи, указывающие, что они существовали во время предыдущего резервного копирования.

Например, пара таких таблиц может работать:

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

Кто-то хочет восстановить, так как файлы существовали 15 марта, вы посмотрите на таблицу индексов резервного копирования, увидите, что резервная копия № 1 была самой последней, и посмотрите все пути, которые существовали в резервной копии 1, из таблицы путей.

В общем, вы отталкиваетесь от решения, был ли файл удален в операцию восстановления, а не в операцию резервного копирования.

Создайте службу для мониторинга каталога (используйте FindFirstChangeNotification или ReadDirectoryChangesW)

Другие вопросы по тегам