Имя: Пароль:
1C
Админ
Восстановление базы 1с
0 pochta13
 
05.11.12
19:06
Привет всем читающим эти строчки. Получилась так, что мне, в общем то далекому от именно 1с человеку, приходится восстанавливать сломанную после сбоя питания базу 8.2. .

Первый успех уже есть, после некоторых манипуляций Tool_1CD базу увидел:)
Перелопатив кучу форумов, описание формата 1CD, вооружившись винхексом и дельфей, а также годичным бекапом несчастной базы
и кофе я понял что в базе убит корневой раздел.
Т.е. в таблице смещений сбита адресация, значение может быть меньше предыдущего, а то и вообще может вести за пределы базы.

Вопрос такой. Есть ли какой-нибудь способ или готовый алгоритм способствующий перегенерации корневого,
а то изобретать велосипед совсем не хочется...
1 МихаилМ
 
05.11.12
19:19
лучше

обратитесь к специалистам в этом вопросе:
awa15 (автор тул сиди)
и
vde69 (http://www.sql.ru/forum/actualthread.aspx?tid=971669)
2 Alize
 
05.11.12
19:30
бэкап когда же научаться делать ежедневный ?
3 vde69
 
05.11.12
19:47
4 vde69
 
05.11.12
19:54
(0) если база не очень большая (1-2 гига) грузи ее в конфу востановления и смотри корневой обьект как таблицу, там показываются реальные ссылки и все что записано, и серым диапазоном выделено то что находится за индексом количества записей.

В 90% случаях ничего перегенерить не нужно, обычно все траблы - это 1-2 ссылкы или размер таблицы кривой.
5 vde69
 
05.11.12
19:57
(4)+ кстати если хочется "по быстрому" - то можно все и не грузить, а сначало создать блоки (это минут 10) и потом на блоке с номером 2 меню "загрузить таблицу", тогда сразу увидешь только один корневой
6 Xapac_2
 
05.11.12
20:23
(5) а вы где этому научились? я тоже хочу быть гуру восстановления
7 vde69
 
05.11.12
20:29
(6)
И Андрей закричал: Я покину причал,
 Если ты мне откроешь секрет.
И Спаситель ответил: Спокойно, Андрей,
 Никакого секрета здесь нет.

Видишь, там на горе   возвышается крест.
 Под ним десяток солдат,   повиси-ка на нём,
 А когда надоест,   возвращайся назад
 Гулять по воде, гулять по воде,
   гулять по воде со мной.

----------------------
просто нужно потратить N времени что-бы вьехать в проблемму...
8 pochta13
 
05.11.12
21:02
спасибо за ответы, пошел пробовать...
9 pochta13
 
05.11.12
21:09
да, вопрос гуру. что за блок находится по адресу 0x2000, у меня там в ломанной базе даже заголовка нет, одни нули...
10 vde69
 
05.11.12
21:14
(9) там обычно меньее 50 байт заполнено
11 pochta13
 
05.11.12
21:20
ну да, заголовок и 8байт, но без этого tool_1cd не открывала файл.
12 vde69
 
05.11.12
21:25
tool_1cd без коневого вроде вообще не открывает, по этому если она открывает - то как минимум часть корневого цела и говорить что в блоке  0x2000 одни нули - это обманывать себя.

Здесь форум где нужно говорить правду, даже если там трипер :)
13 pochta13
 
05.11.12
21:44
я говорю правду всегда, даже если там не только триппер)
изначально - в базе вместо заголовка в первом блоке были  нули и по адресу 0x2000 - пусто.
после вбития заголовка и переноса 16 байт из старой бекапленой базы в 0x2 файлик открылся в tool_1cd с кучей ошибок (отсутсвует dbschema, много - блок не является обьектом, ошибка парсинга и разбора раз так 60 итд)

в общем после этого я прочитал что лежит в 0x4000 в старом бекапе и в ломанной базе.
если перевести смещения из блока 0x4 в интегер получается так:
5,764,836...,2118,2128, 79635,74184,1475 ну итд)
насколько я понял в исправном корневом все смещения должны идти друг за другом. отсюда мой вывод - надо пробовать копать корневой...

вот и вся моя грустная история, грустная потому что базу поднимать придется мне, хотя про формат 1cd я узнал не далее как 2 дня назад.
14 vde69
 
05.11.12
21:49
(13) ну лечить по телефону вряд-ли выйдет....

база нужна, так это все слова...

короче пиши на почту :) или мне или awa15 и сразу про вознаграждение не забудь :))))
15 pochta13
 
05.11.12
21:59
После нгово колчичества часов ковыряния очень хочется попытаться разобраться самому, если таки не выйдет то прошу вашего разрешения на самом деле написать на почту...
16 pochta13
 
05.11.12
22:00
про вознаграждение разумеется не забуду:)
17 awa15
 
05.11.12
22:15
(13) Совершенно необязательно эти блоки должны идти в возрастающем порядке. Да, обычно они идут в возрастающем порядке, но не всегда.
Раз уж ты восстановил блок 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 pochta13
 
05.11.12
22:32
однако! исчезли все ошибки кроме 2х - ошибка получения обьекта из блока и индекс первого блока за пределами файлов индексов.
19 pochta13
 
05.11.12
22:33
а что же лежало в чудном блоке x2000?
20 vde69
 
05.11.12
22:37
(18) я даже знаю какие остались

1. общая длина файла не соответствует заголовку
...


теперь попробуй зайти chdbfl (в каталоге 1с) и потом в конфигуратор и там запустить сжатие базы :)

разумеется на копии
21 awa15
 
05.11.12
22:39
Блок 0х2000 - заголовочный блок корневого файла, блок 0x4000 - содержимое этого файла. Так как ты скопировал блок 0х2000 из другой базы, то у тебя в нем была неправильная длина корневого файла (байты в 0х2008). Для корневого файла существует простой способ вычислить правильную длину, которую я и написал.
22 awa15
 
05.11.12
22:40
(21) к (19), сорри
23 vde69
 
05.11.12
22:40
(19) там есть две волшебные цыфры
Длинна (ее можно и посчитать), и количество блоков "Dir" (обычно от 1 до 3х).
24 vde69
 
05.11.12
22:43
(17) кстати если база  была 8.0 то вместо "прибавь 0х24" нужно чуток поменьше :)
25 pochta13
 
05.11.12
22:44
Не, остались:
"ошибка получения обьекта из блока. Блок не является обьектом",
по адресу блока - нули,
и
"ошибка чтения индексов. Индекс первого свободного блока за пределами файла индексов"
длина файла индексов x7000, индекс свободной страницы - 0x42444331

chdbfl файл не открывает...
26 pochta13
 
05.11.12
22:45
блин, а я уже начал писать парсер на дельфе, а ларчик то вот как открывался!
27 awa15
 
05.11.12
22:46
(23) Скорее всего ты имеешь ввиду блок с таблицей размещения файла. Для корневого блока это обычно 0х3000. В 0x2000 только длина и ссылка на таблицу размещения.
(24) ТС написал 8.2, так что 0х24))
(25) Тогда еще попробуй уменьшить значение по 0x4020 на 1, а значение 0х2008 на 4.
28 pochta13
 
05.11.12
22:47
общая длина файла не соответствует заголовку  - нету такой)
база 8.2.14
29 awa15
 
05.11.12
22:49
(25) на ошибку "ошибка чтения индекса" наплевать. Надо избавиться от "ошибка получения объекта из блока". Тогда chdbfl базу обработает.
30 pochta13
 
05.11.12
22:51
ошибка получения обьекта из блока - адрес 0x851 - по этому адресу пусто, даже заголовка нет
31 awa15
 
05.11.12
22:54
(30) блок 0х851 - это адрес 0х851000
32 pochta13
 
05.11.12
22:56
>>блок 0х851 - это адрес 0х851000
да я это и имел в виду, забыл нули дописать
>>Тогда еще попробуй уменьшить значение по 0x4020 на 1, а >>значение 0х2008 на 4.
ошибка осталась, потерялась dbschema
33 awa15
 
05.11.12
22:59
(32) Это хуже. Какие значения у тебя в блоке 0х3000? Там 2 или 3 числа должны быть
34 awa15
 
05.11.12
23:01
И скажи значение 0х2008
35 pochta13
 
05.11.12
23:02
записал по адресу 0x851000 заголовок "1CDBOBV8" - ошибка в tool_1cd пропала,
chdbfl все равно ругается "Повреждена таблица размещения внутреннего файла <Описание базы данных>"
36 awa15
 
05.11.12
23:03
(35) Не, это не поможет. Надо найти в корневом файле блок 0х851, и удалить его
37 pochta13
 
05.11.12
23:04
0x2008 - 0c3e
0x3000 - 01 00 00 00  и 04 00 00 00
38 awa15
 
05.11.12
23:06
Отлично! Найди байты 51 08 00 00, начиная с адреса 0х4024, и напиши, по какому адресу ты их нашел
39 awa15
 
05.11.12
23:07
0хС3Е - это после уменьшения на 4, про которое я говорил в (27) или после?
40 awa15
 
05.11.12
23:08
*или до
41 awa15
 
05.11.12
23:11
Кстати, 0xC3E - явно неправильное число, оно должно на 4 делиться
42 pochta13
 
05.11.12
23:12
>>0хС3Е  - после
(38) первое вхождение внутри текста по af200,
среди нулей - 003d1200
43 pochta13
 
05.11.12
23:15
c3e\4=30f вроде...
44 awa15
 
05.11.12
23:18
(42) А какое было до? Кажется, ты что-то неправильно посчитал. Если было раньше С40, то С40 - 4 = С3С.
(43) 30F * 4 = C3C
А вот то, что ты не нашел байты 51 08 00 00, это я не понимаю. Они должны были быть в промежутке 0х4024 - 0х4С40
45 awa15
 
05.11.12
23:20
+(44) Если их там нет, то и chdbfl не должен падать. А раз он падает, эти байты должны быть в корневом файле!
46 awa15
 
05.11.12
23:24
А скажи, какое значение изначально было по адресу 0x4020?
Может ты неправильно посчитал 0x2008 и поэтому и chdbfl падает?
47 pochta13
 
05.11.12
23:26
так, да, наверно туплю.
1. 51 08 нет, точно есть 50 08
48 pochta13
 
05.11.12
23:28
по 0x4020 f200
49 awa15
 
05.11.12
23:31
(48) т.е. по адресу 0х4020 изначально были байты F2 00 00 00?
Если так, то по адресу 0x2008 должно быть число 0х3EC (байты EC 03 00 00)
50 pochta13
 
05.11.12
23:35
(49) да,туплю, блин((
51 vde69
 
05.11.12
23:37
(49)(50) быстрее файл передать....
52 awa15
 
05.11.12
23:39
(51) Ну, это в качестве эксперимента)) Вдруг получится))
53 pochta13
 
05.11.12
23:42
...! получилось! ошибка блока осталась, но chdbfl поколдовал и все запустилось!
54 pochta13
 
05.11.12
23:43
awa15! вы спасли меня от семейной расправы! с меня причитается, завтра с вами свяжусь!
55 vde69
 
05.11.12
23:44
(52)учитывая что таблица схема при каждом обновлении может поменять свое место на ближе к концу, то игры с копированием корневого из полугодичного бекапа - выглядят сильно сомнительно....
56 pochta13
 
05.11.12
23:46
буду сейчас анализировать все вышенаписанное, хотя надеюсь не пригодится никогда)
57 awa15
 
05.11.12
23:46
(53) Ура))
В конфигураторе после chdbfl запустилось? На копии попробуй в ТиИ сделать сначала реиндексацию, затем реструктуризацию. Если пройдет - все в пордке.
(55) Сам корневой был в порядке (0х4000), битым был заголовочный блок корневого (0х2000).
58 pochta13
 
06.11.12
00:08
на реиндексации правда вылетает...
59 pochta13
 
06.11.12
00:09
но это уже мелочи. еще раз всем спасибо!
60 awa15
 
06.11.12
00:15
(58) Попробуй перед реиндексацией сделать сжатие таблиц.
61 fedoseev-kirill
 
07.11.12
20:38
awa15, отписался на почту.