Восстановление базы 1с #637786


#0 by pochta13
Привет всем читающим эти строчки. Получилась так, что мне, в общем то далекому от именно 1с человеку, приходится восстанавливать сломанную после сбоя питания базу 8.2. . Первый успех уже есть, после некоторых манипуляций Tool_1CD базу увидел:) Перелопатив кучу форумов, описание формата 1CD, вооружившись винхексом и дельфей, а также годичным бекапом несчастной базы и кофе я понял что в базе убит корневой раздел. Т.е. в таблице смещений сбита адресация, значение может быть меньше предыдущего, а то и вообще может вести за пределы базы. Вопрос такой. Есть ли какой-нибудь способ или готовый алгоритм способствующий перегенерации корневого, а то изобретать велосипед совсем не хочется...
#1 by МихаилМ
лучше обратитесь к специалистам в этом вопросе: awa15 (автор тул сиди) и vde69 (
#2 by Alize
бэкап когда же научаться делать ежедневный ?
#3 by vde69
#4 by vde69
если база не очень большая (1-2 гига) грузи ее в конфу востановления и смотри корневой обьект как таблицу, там показываются реальные ссылки и все что записано, и серым диапазоном выделено то что находится за индексом количества записей. В 90% случаях ничего перегенерить не нужно, обычно все траблы - это 1-2 ссылкы или размер таблицы кривой.
#5 by vde69
+ кстати если хочется "по быстрому" - то можно все и не грузить, а сначало создать блоки (это минут 10) и потом на блоке с номером 2 меню "загрузить таблицу", тогда сразу увидешь только один корневой
#6 by Xapac_2
а вы где этому научились? я тоже хочу быть гуру восстановления
#7 by vde69
И Андрей закричал: Я покину причал,  Если ты мне откроешь секрет. И Спаситель ответил: Спокойно, Андрей,  Никакого секрета здесь нет. Видишь, там на горе   возвышается крест.  Под ним десяток солдат,   повиси-ка на нём,  А когда надоест,   возвращайся назад  Гулять по воде, гулять по воде,    гулять по воде со мной. ---------------------- просто нужно потратить N времени что-бы вьехать в проблемму...
#8 by pochta13
спасибо за ответы, пошел пробовать...
#9 by pochta13
да, вопрос гуру. что за блок находится по адресу 0x2000, у меня там в ломанной базе даже заголовка нет, одни нули...
#10 by vde69
там обычно меньее 50 байт заполнено
#11 by pochta13
ну да, заголовок и 8байт, но без этого tool_1cd не открывала файл.
#12 by vde69
tool_1cd без коневого вроде вообще не открывает, по этому если она открывает - то как минимум часть корневого цела и говорить что в блоке  0x2000 одни нули - это обманывать себя. Здесь форум где нужно говорить правду, даже если там трипер :)
#13 by pochta13
я говорю правду всегда, даже если там не только триппер) изначально - в базе вместо заголовка в первом блоке были  нули и по адресу 0x2000 - пусто. после вбития заголовка и переноса 16 байт из старой бекапленой базы в 0x2 файлик открылся в tool_1cd с кучей ошибок (отсутсвует dbschema, много - блок не является обьектом, ошибка парсинга и разбора раз так 60 итд) в общем после этого я прочитал что лежит в 0x4000 в старом бекапе и в ломанной базе. если перевести смещения из блока 0x4 в интегер получается так: 5,764,836...,2118,2128, 79635,74184,1475 ну итд) насколько я понял в исправном корневом все смещения должны идти друг за другом. отсюда мой вывод - надо пробовать копать корневой... вот и вся моя грустная история, грустная потому что базу поднимать придется мне, хотя про формат 1cd я узнал не далее как 2 дня назад.
#14 by vde69
ну лечить по телефону вряд-ли выйдет.... база нужна, так это все слова... короче пиши на почту :) или мне или и сразу про вознаграждение не забудь :))))
#15 by pochta13
После нгово колчичества часов ковыряния очень хочется попытаться разобраться самому, если таки не выйдет то прошу вашего разрешения на самом деле написать на почту...
#16 by pochta13
про вознаграждение разумеется не забуду:)
#17 by awa15
Совершенно необязательно эти блоки должны идти в возрастающем порядке. Да, обычно они идут в возрастающем порядке, но не всегда. Раз уж ты восстановил блок 0х2000, то попробуй сделать так: Посмтори, какое число 4х байтовое число записано по адресу 0х4020. Умножь это число на 4 и прибавь 0х24. Плучившийся результат запиши по адресу 0х2008. Например: Смотрим 0х4020, видим там Е3 00 00 00, значит наше число 0хЕ3. Умножаем на 4, получаем 0х38С, прибавляем 0х24, получаем 0х3В0. По адресу 0х2008 пишем байты В0 03 00 00.
#18 by pochta13
однако! исчезли все ошибки кроме 2х - ошибка получения обьекта из блока и индекс первого блока за пределами файлов индексов.
#19 by pochta13
а что же лежало в чудном блоке x2000?
#20 by vde69
я даже знаю какие остались 1. общая длина файла не соответствует заголовку ... теперь попробуй зайти chdbfl (в каталоге 1с) и потом в конфигуратор и там запустить сжатие базы :) разумеется на копии
#21 by awa15
Блок 0х2000 - заголовочный блок корневого файла, блок 0x4000 - содержимое этого файла. Так как ты скопировал блок 0х2000 из другой базы, то у тебя в нем была неправильная длина корневого файла (байты в 0х2008). Для корневого файла существует простой способ вычислить правильную длину, которую я и написал.
#22 by awa15
к , сорри
#23 by vde69
там есть две волшебные цыфры Длинна (ее можно и посчитать), и количество блоков "Dir" (обычно от 1 до 3х).
#24 by vde69
кстати если база  была 8.0 то вместо "прибавь 0х24" нужно чуток поменьше :)
#25 by pochta13
Не, остались: "ошибка получения обьекта из блока. Блок не является обьектом", по адресу блока - нули, и "ошибка чтения индексов. Индекс первого свободного блока за пределами файла индексов" длина файла индексов x7000, индекс свободной страницы - 0x42444331 chdbfl файл не открывает...
#26 by pochta13
блин, а я уже начал писать парсер на дельфе, а ларчик то вот как открывался!
#27 by awa15
Скорее всего ты имеешь ввиду блок с таблицей размещения файла. Для корневого блока это обычно 0х3000. В 0x2000 только длина и ссылка на таблицу размещения. ТС написал 8.2, так что 0х24)) Тогда еще попробуй уменьшить значение по 0x4020 на 1, а значение 0х2008 на 4.
#28 by pochta13
общая длина файла не соответствует заголовку  - нету такой) база 8.2.14
#29 by awa15
на ошибку "ошибка чтения индекса" наплевать. Надо избавиться от "ошибка получения объекта из блока". Тогда chdbfl базу обработает.
#30 by pochta13
ошибка получения обьекта из блока - адрес 0x851 - по этому адресу пусто, даже заголовка нет
#31 by awa15
блок 0х851 - это адрес 0х851000
#32 by pochta13
>>блок 0х851 - это адрес 0х851000 да я это и имел в виду, забыл нули дописать >>Тогда еще попробуй уменьшить значение по 0x4020 на 1, а >>значение 0х2008 на 4. ошибка осталась, потерялась dbschema
#33 by awa15
Это хуже. Какие значения у тебя в блоке 0х3000? Там 2 или 3 числа должны быть
#34 by awa15
И скажи значение 0х2008
#35 by pochta13
записал по адресу 0x851000 заголовок "1CDBOBV8" - ошибка в tool_1cd пропала, chdbfl все равно ругается "Повреждена таблица размещения внутреннего файла <Описание базы данных>"
#36 by awa15
Не, это не поможет. Надо найти в корневом файле блок 0х851, и удалить его
#37 by pochta13
0x2008 - 0c3e 0x3000 - 01 00 00 00  и 04 00 00 00
#38 by awa15
Отлично! Найди байты 51 08 00 00, начиная с адреса 0х4024, и напиши, по какому адресу ты их нашел
#39 by awa15
0хС3Е - это после уменьшения на 4, про которое я говорил в или после?
#40 by awa15
*или до
#41 by awa15
Кстати, 0xC3E - явно неправильное число, оно должно на 4 делиться
#42 by pochta13
>>0хС3Е  - после первое вхождение внутри текста по af200, среди нулей - 003d1200
#43 by pochta13
c3e4=30f вроде...
#44 by awa15
А какое было до? Кажется, ты что-то неправильно посчитал. Если было раньше С40, то С40 - 4 = С3С. 30F * 4 = C3C А вот то, что ты не нашел байты 51 08 00 00, это я не понимаю. Они должны были быть в промежутке 0х4024 - 0х4С40
#45 by awa15
+ Если их там нет, то и chdbfl не должен падать. А раз он падает, эти байты должны быть в корневом файле!
#46 by awa15
А скажи, какое значение изначально было по адресу 0x4020? Может ты неправильно посчитал 0x2008 и поэтому и chdbfl падает?
#47 by pochta13
так, да, наверно туплю. 1. 51 08 нет, точно есть 50 08
#48 by pochta13
по 0x4020 f200
#49 by awa15
т.е. по адресу 0х4020 изначально были байты F2 00 00 00? Если так, то по адресу 0x2008 должно быть число 0х3EC (байты EC 03 00 00)
#50 by pochta13
да,туплю, блин((
#51 by vde69
быстрее файл передать....
#52 by awa15
Ну, это в качестве эксперимента)) Вдруг получится))
#53 by pochta13
...! получилось! ошибка блока осталась, но chdbfl поколдовал и все запустилось!
#54 by pochta13
awa15! вы спасли меня от семейной расправы! с меня причитается, завтра с вами свяжусь!
#55 by vde69
учитывая что таблица схема при каждом обновлении может поменять свое место на ближе к концу, то игры с копированием корневого из полугодичного бекапа - выглядят сильно сомнительно....
#56 by pochta13
буду сейчас анализировать все вышенаписанное, хотя надеюсь не пригодится никогда)
#57 by awa15
Ура)) В конфигураторе после chdbfl запустилось? На копии попробуй в ТиИ сделать сначала реиндексацию, затем реструктуризацию. Если пройдет - все в пордке. Сам корневой был в порядке (0х4000), битым был заголовочный блок корневого (0х2000).
#58 by pochta13
на реиндексации правда вылетает...
#59 by pochta13
но это уже мелочи. еще раз всем спасибо!
#60 by awa15
Попробуй перед реиндексацией сделать сжатие таблиц.
#61 by fedoseev-kirill
awa15, отписался на почту.
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям