SASGIS

Веб-картография и навигация

Восстановление убитого кэша Беркли (BerkeleyDB)

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 02 авг 2012, 23:30

По мотивам хотелки #1341 написал утилиту-помощника в нелёгком деле восстановления кэша. Хотя, строго говоря, я ещё не сталкивался с тем, чтобы мой кэш умер и не мог быть прочитан/восстановлен самим САСом при запуске (а "падает" САС у меня часто, т.к. запускаю я его преимущественно прямо в дебагере и имею привычку не всегда корректно завершать работу, а выходить по аналогу Ctrl+Alt+Del). Но, как говорится: "сани готовь летом" (c), так что, пусчай будет - авось когда и пригодится.

Итак, для восстановления баз Беркли поставщик оной БД (Оракл) предлагает нам в комплекте кучу различных консольных утилит. Утилиты там на все случаи жизни, какие только можно себе представить и всё бы хорошо, но для неподготовленного человека, встреча с консолью может быть весьма неприятна. Да и для гуру, выполнение однотипных рутинных операций через голую консоль, может отнимать лишнее время. Поэтому, представляю вам оболочку над некоторыми консольными утилитами (а именно: db_recover, db_verify, db_load и db_dump) с вшитыми настройками и минимальной конфигурацией. Настройки вполне достаточны для восстановления кэша Беркли в САСе (по крайней мере, пока кто-то не сообщит, что у него никак не выходит этот самый кэш восстановить). Если каких-то ключей/режимов вдруг не хватит - пишите, по возможности, добавим.

Забираем: sdb_util_1.0.2.8.7z + исходники для интересующихся

Инструкция к действию:
скрытый текст: показать
- закрываем САС
- распаковываем архив в папку с установленным САСом и соглашаемся с предложением заменить файлы
- запускаем sdb_util.exe
- выбираем папку с испорченным кэшем: path\to\cache_db\sat или даже целиком все карты: path\to\cache_db
- запускаем восстановление: Run
- по окончании процесса запускаем САС (предпочтительно - дебажную версию) и проверяем кэш на работоспособность
- если кэш по прежнему не работает, закрываем САС, возвращаемся в утилиту, жмём Config и выбираем "Rename broken files to *.bad" или "Restore broken files" (можно ещё включить Catastrophic recovery) и жмём Apply
- запускаем восстановление заново и по окончании, ещё раз проверяем в САС
- если и сейчас ничего не работает - пишите сюда и приложите логи (всё что писалось в чёрном окошке на всех этапах) и пару небольших битых файлов (*.bad). Лог так же мог создать и САС, в папке с exe: sdb.log

Описание режимов работы:
скрытый текст: показать
Restore cache after crash: Recover & Verify
Последовательно вызывает функции: Recover environment [cmd: db_recover -v] и Verify cache (find broken files) [cmd: db_verify] с предустановленными настройками (с вкладки Config).

Recover environment [cmd: db_recover -v] (утилита db_recover)
Используя файлы лога из папки env кэша, восстанавливает кэш до валидного состояния: записывает все завершённые и откатывает все незавершённые транзакции. Так же, при этой операции опционально создаётся файл DB_CONFIG с выбранными установками.

Prepare cache for backup (reset LSN) [cmd: db_load -r lsn] (утилита db_load)
Удаляет привязку файлов кэша (*.sdb) от файлов лога из папки env. Опционально, по окончанию процесса может удалять уже не нужную папку env вместе со всеми старыми логами.

Verify cache (find broken files) [cmd: db_verify] (утилита db_verify)
Проверяет файлы кэша (*.sdb) на ошибки. При обнаружении ошибок, в зависимости от настроек, может:
1. Не предпринимать никаких действий (Only report)
2. Удалить файл кэша, содержащий ошибку (Delete broken files). Использовать эту опции рекомендуется только в крайнем случае, т.к. а) ошибка может быть не критическая (САС может прекрасно работать с данным файлом кэша) и б) есть теоретическая возможность восстановить неповреждённые данные (см. ниже)
3. Переименовать файл в *.bad (Rename broken files to *.bad), который затем можно дополнительно анализировать/восстанавливать имеющимися утилитами.
4. Не отходя от кассы, попытаться восстановить повреждённый файл (Restore broken files). Следует учитывать, что эта операция достаточно медленная. Все действия, предпринимаемые программой будут аналогичны восстановлению данных из *.bad файлов (см. ниже).

Restore broken files from *.bad [cmd: db_dump && db_load] (утилиты db_dump и db_load)
1. Создаёт дамп данных из повреждённых файлов (пытается прочитать неповреждённые данные). При создании дампа используется утилита db_dump. Файл дампа имеет несколько бОльший размер, чем исходный файл *.sdb (примерно в 1,5-2 раза).
2. Из свежего дампа формирует новый файл кэша, с гарантией отсутствия ошибок (использует утилиту db_load). В качестве дополнительного бонуса, происходит оптимизация структуры файла кэша, в результате чего, он может быть меньшего размера (даже, если удалось восстановить абсолютно все данные). При этом, однако, нет возможности оценить количество восстановленных данных (в процентном или абсолютном выражении) по отношению к исходным данным.
3. По окончании процесса подчищает за собой хвосты: удаляет восстановленный *.bad файл и его файл дампа (*.dump).

Несколько слов про пресеты Durability:
скрытый текст: показать
1. Low - при записи в кэш, максимально используются буферы в памяти и запись на диск производится только если буферы переполняются или САС вызывает sync метод (каждые 5 мин или через 1024 операций записи в кэш). С такими настройками сейчас работает САС по-умолчанию (конфигурация зашита в коде), а вот новые версии САСа, планируется по-умолчанию заставить работать с пресетом Normal.
Пресет Low соответствует SQLite-овскому PRAGMA synchronous=OFF, со всеми вытекающими последствиями. Определяющим флагом, активирующим пресет, является флаг DB_TXN_NOSYNC:
If set, Berkeley DB will not write or synchronously flush the log on transaction commit. This means that transactions exhibit the ACI (atomicity, consistency, and isolation) properties, but not D (durability); that is, database integrity will be maintained, but if the application or system fails, it is possible some number of the most recently committed transactions may be undone during recovery. The number of transactions at risk is governed by how many log updates can fit into the log buffer, how often the operating system flushes dirty buffers to disk, and how often the log is checkpointed.

Или, говоря по-русски, тут не гарантируется полное восстановление кэша при падении САСа или винды.

2. Normal - файл лога пишется синхронно (после каждого коммита из буфера в памяти, производится запись в лог), но не даётся гарантий, что винда сбросит буфер и данные действительно запишутся в файл. Определяющий флаг - DB_TXN_WRITE_NOSYNC:
If set, Berkeley DB will write, but will not synchronously flush, the log on transaction commit. This means that transactions exhibit the ACI (atomicity, consistency, and isolation) properties, but not D (durability); that is, database integrity will be maintained, but if the system fails, it is possible some number of the most recently committed transactions may be undone during recovery. The number of transactions at risk is governed by how often the system flushes dirty buffers to disk and how often the log is checkpointed.

Или, говоря по-русски, тут не гарантируется полное восстановление кэша только при падении винды. Если же упадёт только САС, то по логам возможно всё восстановить. В SQLite это называется PRAGMA synchronous=NORMAL.

3. High - гарантированная запись в лог, т.е. после каждой транзакции, мало того, что данные записываются в файл лога, так ещё и вызывается системная функция (FlushFileBuffers), которая указывает Windows принудительно записать свой буфер на диск. Активирует данный пресет одновременное отключение флагов DB_TXN_NOSYNC и DB_TXN_WRITE_NOSYNC. В SQLite это называется PRAGMA synchronous=FULL.

4. Extremaly High - в дополнение к High, по возможности отключаются все буферы (в том числе и виндозный) при записи в лог и в кэш - экспериментальный пресет и насколько он лучше или хуже чем High, должны показать тесты (если кто возьмётся за них).

Чтобы активировать тот или иной пресет, нужно выполнить операцию Recover (db_recover), во время которой в папку env будет записан файлик DB_CONFIG с нужной конфигурацией. И при следующем запуске САС автоматически подхватит эти настройки.

Утилиту можно натравливать и на здоровый кэш, она его не испортит. Работу утилиты можно прерывать в любой момент времени, кэш при этом всегда будет оставаться работоспособным.

Пара скриншотов:
main.gif

config.gif

За это сообщение автора zed поблагодарили: 9
cycler (15 июн 2013, 21:43) • guf (15 авг 2012, 13:42) • igel72 (11 апр 2013, 10:17) • Papazol (03 авг 2012, 09:56) • Parasite (03 авг 2012, 16:19) • saldek (21 янв 2020, 10:17) • Tolik (03 авг 2012, 12:44) • vvstepa (05 апр 2017, 20:21) • xromeo (14 апр 2013, 11:43)
Рейтинг: 47.37%
 
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 07 авг 2013, 19:03

cycler писал(а):Можно ли прервать восстановление без ущерба для данных?

Можно.

За это сообщение автора zed поблагодарил:
cycler (07 авг 2013, 19:34)
Рейтинг: 5.26%
 
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение cycler » 07 авг 2013, 19:32

Йессс!!! В режиме Recover environment [cmd: db_recover -v] всё оч.быстро восстановилось.
У меня есть подозрение, почему кеш упал. Я ему предварительно, видимо, помог. Я поставил на папку /cache_db запрет на удаление файлов/папок.
скрытый текст: показать
Сначала я поставил запрет на изменение, но карты не поднялись, значит беркли что-то пишет в свои конфиги.. тогда я оставил только запрет на удаление.

Когда запустил восстановление в режиме Recover environment, он мне в первую очередь ругнулся, что не может удалить DB_CONFIG. Зачем удалять конфиги..? Ладно, запрет на удаление снял, отрекавилось буквально за 30сек и в новой версии САС всё заработало (в старой не пробовал)! Ура, товарищи!!!
cycler
Новичок
 
Сообщения: 32
Зарегистрирован: 15 июн 2013, 10:01
Благодарил (а): 10 раз.
Поблагодарили: 2 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 07 авг 2013, 20:30

cycler писал(а):Я ему предварительно, видимо, помог. Я поставил на папку /cache_db запрет на удаление файлов/папок.

Зачем? Если вы хотели подключить кэш в режиме только для чтения, то для этого есть специальный конфиг. Подробности в тикете: 0001874: Berkeley cache: READ-ONLY
cycler писал(а):он мне в первую очередь ругнулся, что не может удалить DB_CONFIG. Зачем удалять конфиги..?

Возможно вы его сами попросили, поставив галочку в настройках. И оно хотело перезаписать конфиг, в соответствии с выбранными настройками.

За это сообщение автора zed поблагодарил:
cycler (07 авг 2013, 23:56)
Рейтинг: 5.26%
 
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение DJ VK » 23 авг 2013, 07:53

Итак, вопрос. Почистили мы карту. переместили, удалили что-то. База естественно похудела лишь виртуально.
Нет ли возможности аналогично reset LSN и verification сделать такую же консольную оптимизацию данных, с чисткой места мертвых тайлов?
или даже засунуть этот процесс в первый пункт.
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 300 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 23 авг 2013, 11:06

Есть два варианта:
1. Использовать связку из 2-х утилит: db_dump + db_load. Эта операция является аналогом команды VACUUM для SQLite, с тем отличием что тут данные вначале будут распакованы во временный файл (db_dump), а затем из этого временного файла будет создан файл БД (db_load). В SQLite же это выполняется за одну операцию.

2. Написать свою утилиту и использовать там метод: DB->compact. Это метод "щадящей" оптимизации (без пересоздания файла БД), поддерживает множество опций, но консольной утилиты для этой операции они почему-то не сделали. Возможно из-за того, что при обычных операциях записи в БД, там такая оптимизация проводится по-умолчанию, но не для всей БД, а только для тех страниц, которые используются для поиска/записи текущего ключа (key). Т.е. структура БД самооптимизирующаяся.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение Parasite » 23 авг 2013, 12:15

zed писал(а):Есть два варианта:
1. Использовать связку из 2-х утилит: db_dump + db_load. Эта операция является аналогом команды VACUUM для SQLite, с тем отличием что тут данные вначале будут распакованы во временный файл (db_dump), а затем из этого временного файла будет создан файл БД (db_load). В SQLite же это выполняется за одну операцию.

2. Написать свою утилиту и использовать там метод: DB->compact. Это метод "щадящей" оптимизации (без пересоздания файла БД), поддерживает множество опций, но консольной утилиты для этой операции они почему-то не сделали. Возможно из-за того, что при обычных операциях записи в БД, там такая оптимизация проводится по-умолчанию, но не для всей БД, а только для тех страниц, которые используются для поиска/записи текущего ключа (key). Т.е. структура БД самооптимизирующаяся.

3. Переименовать нужный файл базы в .bad, и заюзать zedову утиль в режиме восстановления .bad (и оно сделает автоматом п.1) :roll:
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 460 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 17 окт 2013, 20:51

Новая версия: sdb_util_1.0.2.8.7z

Изменения касаются DB_CONFIG:
- убрана строчка, определяющая зарезервированное число мьютексов (mutex_set_max 30000), поскольку новые версии SAS умеют более точно определять это число
- по-умолчанию включён пресет High Durability. В этом же режиме работает и SAS, при отсутствии DB_CONFIG.

За это сообщение автора zed поблагодарил:
garl (17 окт 2013, 22:00)
Рейтинг: 5.26%
 
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение Gma » 29 ноя 2014, 19:31

После установки дополнительных карт (слоёв) _Coverage сломался кэш Я-карт, хранимый в беркли. все попытки восстановления с помощью sdb_util не удались
Вложения
sdb.rar
(22.78 KiB) Скачиваний: 93
Gma
Советчик
 
Сообщения: 427
Зарегистрирован: 10 апр 2011, 23:10
Благодарил (а): 35 раз.
Поблагодарили: 71 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение zed » 29 ноя 2014, 19:43

В sdb.log ошибки у двух карт:

1. s:\sas\cache_db\imagery\
Код: Выделить всё
BerkeleyDB: file z15\9\4\38.19.sdb has LSN 4/2426893, past end of log at 1/1066665 [root path: s:\sas\cache_db\imagery\]

2. s:\sas\cache_db\yamapng\
Код: Выделить всё
BerkeleyDB Env: unable to join the environment [root path: s:\sas\cache_db\yamapng\]


Для первого кэша нужно запустить проверку sdb файлов (опция Restore cache after crash: Recover & Verify (default) в sdb_util), у второго кэша нужно попробовать удалить файл env\__db.register и запустить восстановление (опция Recover environment [cmd: db_recover -v]).

Подозреваю, что проблемы с кэшем появились из-за старого файла с настройками DB_CONFIG. После того, как восстановите кэш, удалите эти файлы и пускай SAS создаст актуальные настройки (при этом нужно взять последний релиз, а не какую-то лохматую версию).
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Восстановление убитого кэша Беркли (BerkeleyDB)

Сообщение Gma » 29 ноя 2014, 20:17

Имеджери работает, а Ях так и не хочет. весия САСа была 14009 (не такая уж и старая) сейчас крайняя ночнушка. результат одинаков. Версия утилиты даже моложе выложенной тут.
Вложения
sdb2.rar
(14.51 KiB) Скачиваний: 107
Gma
Советчик
 
Сообщения: 427
Зарегистрирован: 10 апр 2011, 23:10
Благодарил (а): 35 раз.
Поблагодарили: 71 раз.

Пред.След.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10