Работает samba4. Она использует базы формата TDB
И вот, в один прекрасный момент начались ошибки
Код: Выделить всё
>tdbdump fileofbase.ldb
tdb(fileofbase.ldb): FATAL: tdb_rec_read bad magic 0xd9fee666 at offset=518252
Открыл hex neo.
Там действительно эта последовательность(0xd9fee666). И что она не устраивает, не понимаю.
Пошел в сеть. Материала по теме восстановления tdb баз очень мало.
Нашел ключ у команды tcpdump
Код: Выделить всё
>tdbdump -e fileofbase.ldb > /tmp/keyfrombase.dmp
В этом случае программа сохраняет в текстовом виде ключи из базы. Их можно редактировать.
Мне это ничего не дало. Да, есть последовательность, но что не устраивает tdb не ясно.
Решил предпринять следующую стратегию.
Сохраняем ключи из текстового файла обратно в tdb и смотрим на целостность. После какого ключа база помрет, тот и виноват.
Сказано, сделано.
Создал скрипт /tmp/get_key.awk
Код: Выделить всё
nkey=0;
stopstr=4000;
}
{
tag=$1;
if (tag=="{")
{
nkey=nkey+1;
}
if (nkey<=stopstr)
{
print;
}
}
END {
}
Создал скрипт для некоторой автоматизации этого процесса
/tmp/restore.sh
Код: Выделить всё
awk -f /tmp/get_key.awk /tmp/keyfrombase.dmp > /tmp/from_key.dmp
rm /tmp/test.ldb
Грузим через tdbrestore
Если загрузка прошла нормально, то никаких сообщений не будет. Для проверки открываем tdbtooltdbrestore /tmp/test.ldb < /tmp/from_key.dmp
Код: Выделить всё
tdbtool
> open /tmp/test.ldb
> info
можно вывести ключи
>keys
Тогда через значение переменной stopstr подбираем номер ключа и вычисляем какой битый.
После этого удаляем этот ключ в исходном тексте и продолжаем проверять.
Что мне не нравится. Некогда было разбираться, как в awk передавать параметры. Поэтому пришлось делать исправление диапазона ключа вручную.
Ну и подбирать приходится методом деления отрезка пополам, а последние итерации в этом методе идут дольше. Хотя, это все мелочи по сравнению с гибелью базы