Добавить способ восстановления с очисткой базы от мусора дополнительной утилитой
db_dump создает в дампе много мусора (дополнительные варианты баз, дополнительные варианты значений ключей, значения ключей без самих ключей ...), поэтому пересозданная потом db_load база часто оказывается нефункциональной. С целью убрать весь этот мусор из дампа, чтобы получить базу только с валидными тайлами, была написана консольная утилита. При чистке ею дампа, значения ключей проверяются на сигнатуры jpg и png, так что в очищенный дамп идут только небитые пары ключ-значение. Предлагается заменить в sdb_util неработающую опцию агрессивного восстановления -R и заменить его пунктом: "агрессивное восстановление -R с фильтром валидных jpg/png" команда при этом будет следующая: db_dump -R FN.bad | db_cleaner | db_load FN и если все будет гладко, то сделать это дефолтным вариантом восстановления .bad
Comments (25)
-
repo owner -
reporter Тоже думал об этом. Но если считать контрольные суммы, то сильно увеличится затраченное время (еще поленился разбираться где там в значении ключа позиция CRC и каким аллгоритмом оно вычисляется, т.к. для этого нужно глубоко вникать в код САС). В тоже время >90% кешей - это jpg/png, и как я видел, битые тайлы - это огрызки без конца, что сильно облегчает их выявление по сигнатурам. .kml и .gif можно легко добавить не меняя аглоритм, а вот с bmp и kmz будут уже проблемы, т.к. они, вроде бы, не имеют фиксированного hex-окончания файла.
да и значения версионных ключей вообще, кроме как по контрольной сумме, не отличишь от невалидных.
Поясните? Они разве в дампе не отдельными парами ключ-значение идут, где версия = последние 4 бита ключа?
-
reporter Может, сделать так: по дефолту jpg/png/kml/gif проверяю по hex-сигнатурам, но если вижу hex-начало bmp/kmz - то проверяю его полностью по CRC.
И добавлю дополнительный ключ, при наличии которого (задается через GUI sdb_util) будет происходить полная проверка по CRC для всех типов тайлов.
-
repo owner Но если считать контрольные суммы, то сильно увеличится затраченное время
Время увеличится, но я бы не стал делать на этом акцент. Всё же, задача максимально точно восстановить данные, а не сделать это как можно быстрее. Ну займёт оно лишнюю минуту, и чёрт с ним.
Они разве в дампе не отдельными парами ключ-значение идут, где версия = последние 4 бита ключа?
В версионном кэше есть записи с метаинформацией (список всех доступных версий для конкретного тайла) и, собственно, записи с тайлами. Для метаинформации, последние 2 байта ключа установлены в 0xFFFF, а у ключей с тайлами, последние два байта - индекс, по которому можно получить версию из метаинформации.
В общем-то, я могу попробовать переписать вашу утилиту на Delphi, поскольку в SAS уже есть код парсинга и валидации данных, то вся сложность будет исключительно в логике чтения данных из дампа.
-
repo owner Можете дать мне сорцы утилиты и какой-нибудь битый файл кэша для тренировок?
-
reporter - attached db_cleaner.pl
исходник с подробным описанием алгоритма Битый кэш легко сделать самому, скопировав первые мегабайт 10 от любой базы. Можно, например, взять то, на чем я отлаживал работу версионного кеша http://rgho.st/68GnvcTX5 (80М)
Для метаинформации, последние 2 байта ключа установлены в 0xFFFF
Да, все забываю, что байт - это не один а два hex символа ) В моей утилитке все ключи, имеющие в конце ffff, печатаются без проверки (под это условие попадает также служебный тайл неверсионного кеша, ключ которого состоит из одних f).
-
repo owner Ок, алгоритм очистки достаточно прост, поэтому сделаю вариант на Delphi с доп. проверками чексумм. Поскольку утилита внешняя, вы всегда сможете подменить её на свой вариант.
-
reporter Время увеличится, но я бы не стал делать на этом акцент.
Я уже работал с содержимым тайлов (через pack H* содержимого тайла из дампа). Даже если не считать CRC, время обработки, увы, на перле возрастает в разы.
Но, действительно, каждый может выбрать нужный вариант, и проверка на Делфи може будет быстрее, чем на Перле.
-
repo owner Добавил в sdb_util опцию для вызова чистильщика, исполняемый файл должен называться sdb_dump_cleaner.exe.
Тестовый билд с сегодняшними доработками: https://bitbucket.org/zedxxx/sdb_util/downloads/sdb_util_1.3.2_test.zip
-
reporter Протестировал на нескольких базах (переименовал нормальные в .bad и запустил восстановление с включенной новой опцией). Дампы восстановленных и исходных баз совпадают.
-
repo owner Написал утилитку, с честной валидацией данных по CRC. Тестируйте: https://bitbucket.org/zedxxx/sdb_util/downloads/sdb_dump_cleaner_1.0.1.0.zip
-
repo owner - changed status to on hold
-
Account Deleted Добрый день. Настала необходимость вновь воспользоваться утилитами восстановления БД, и вот, проблема. Тестовый билд, ссылка на который чуть выше, работает не так, как ожидалось. Вот что пишет в окне:
[+] 2017-03-03 16:51:34.159 [Auto (Recover + Verify)]: I:\SASPlanet\cache\Google_sat_version\z14\
VerifyCache.Read: I:\SASPlanet\cache\Google_sat_version\z14\4\1\18.7.sdbv << Exists: True; Changed: False; Verified: 2017-03-03 16:35:54.220 [0,3829 ms] VerifyCache.UpdateFull: ID = 2 << Updated: True; Status: Busy (4); Result: 0x00BADBAD (12245933) [2,2915 ms] "db_verify.exe" 18.7.sdbv [I:\SASPlanet\cache\Google_sat_version\z14\4\1] << Error: Не удается найти указанный файл VerifyCache.Update: ID = 2 << Updated: True; Status: Aborted (3); Result: 0xFFFFFFFF (4294967295) [0,9226 ms] Total processed: 1 (492,0 kB) [-] 2017-03-03 16:51:34.175 [Auto (Recover + Verify)]: I:\SASPlanet\cache\Google_sat_version\z14\
То же самое происходит при попытке воспользоваться любой другой утилитой из набора. Что посоветуете?
PS Честно сказать, в последнее время поведение базы Беркли меня немного напрягает. Я уже стал бояться обращаться к ней, особенно скачивать что-нибудь с одновременным построением карты заполнения. Шаг влево-вправо - и вылет, порча базы. Такое впечатление, что есть узкое место, через которое не успевают проскочить все необходимые данные. Это может быть внешний HDD?
-
repo owner Приведенный лог нечитаем...
-
repo owner Есть более новый тестовый билд: https://bitbucket.org/zedxxx/sdb_util/downloads/sdb_util_1.3.3_test.zip
Актуальную версию всегда можно найти тут: https://bitbucket.org/zedxxx/sdb_util/downloads/
-
Account Deleted Новый тестовый билд даёт аналогичный результат. Попробую вставить лог:
[+] 2017-03-04 13:10:44.345 [Verify]: I:\SASPlanet\cache\Google_sat_version\z14\
VerifyCache.Read: I:\SASPlanet\cache\Google_sat_version\z14\4\1\18.7.sdbv
<< Exists: True; Changed: False; Verified: 2017-03-03 16:51:34.175 [0,6388 ms]
VerifyCache.UpdateFull: ID = 2
<< Updated: True; Status: Busy (4); Result: 0x00BADBAD (12245933) [3,1301 ms]
"db_verify.exe" 18.7.sdbv [I:\SASPlanet\cache\Google_sat_version\z14\4\1]
<< Error: Не удается найти указанный файл
VerifyCache.Update: ID = 2
<< Updated: True; Status: Aborted (3); Result: 0xFFFFFFFF (4294967295) [1,1329 ms]
Total processed: 1 (492,0 kB)
[-] 2017-03-04 13:10:44.595 [Verify]: I:\SASPlanet\cache\Google_sat_version\z14\
-
repo owner Файл не заблокирован на запись? Может у него выставлен атрибут "Только для чтения"?
Если скопировать его в другую папку и запустить проверку она тоже обломится?
Другие файлы проверку проходят или такая проблема со всеми?
Ошибку выдаёт утилита
db_verify.exe
. Попробуйте скопировать её (и все dll) в папку с файлом и выполнить команду в консоли:db_verify.exe 18.7.sdbv
-
repo owner А может вы вообще не положили в папку с тестовой версией файлы от стабильной версии? В тестовом архиве ведь лежат только те файлы, которые изменились по сравнению со стабильной версией. Но все остальные файлы (типа
db_verify.exe
) ей тоже нужны. -
Account Deleted А ведь да! Тут что было? Я скачал билд, поместил его в папку с утилитами. При попытке запуска начало ругаться на отсутствие библиотеки, не помню точно, но вроде sqlite. Я подумал, что, наверное, надо запускать из папки с самой программой, перекинул туда файлы из архивов (те, что скачал). А остальные файлы остались в той самой папке с утилитами! Вот и косяк. Однако, неудобно, когда все файлы свалены в одну кучу. Но придётся. Спасибо!
-
repo owner Мне за три месяца так никто и не отписался, что тестовая утилита работает нормально, вот я до сих пор и не сделал нормальный архив со всеми необходимыми файлами. И да, эту утилиту и все её принадлежности лучше хранить в отдельной папке. Более того, в следующем релизе SAS я не планирую включать её в архив. К тому же, все существующие db_XXX.exe, которые сейчас есть даже в ночнушке, так же будут оттуда удалены.
-
Account Deleted Да, так уж вышло... Сейчас я всё-таки восстановил битые файлы на z14, упоминавшиеся в логе моём. Не без проблем. Потому что при восстановлении базы из дампа у меня опять произошёл краш, и это уже точно мой внешний HDD. Похоже, ему не хватает питания в некоторые моменты времени, и он отсоединяется от системы. Мне пришлось его передёрнуть, затем скопировать битые файлы на другой диск и восстанавливать их там, а потом уже восстановленные файлы копировать обратно. Ну да ладно, но сразу после этого при скачивании уже z15 опять вылет. Я запитал один из USB этого диска от внешнего источника, стал пытаться восстановить новые битые файлы (их оказалось два). Но тут меня постигла неудача, дампы не создаются. Похоже, я эти файлы потерял безвозвратно...
-
repo owner Посмотрите на эту ситуацию с другой стороны - у вас есть прекрасная возможность провести сравнительный стресс-тест SQLite кэшу в условиях, где Беркли, очевидно не выживает. Если тут и SQLite не выживет, то, увы, условия слишком суровые. Ну а если выживет, то будете знать, куда мигрировать.
-
repo owner Будем считать, что тестирование окончилось успешно. Собрал всё в один архив: sdb_util_1.0.3.3.zip
-
repo owner - changed status to open
-
repo owner - changed status to resolved
- Log in to comment
Но будут же проблемы с остальными форматами (kml/kmz/gif/bmp). Если уж делать такую утилиту, то проверку значений надо выполнять по их контрольным суммам. Тогда с форматами проблем не будет, да и значения версионных ключей вообще, кроме как по контрольной сумме, не отличишь от невалидных.