![]() |
![]() |
![]() |
|
Восстановление базы 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, отписался на почту.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |