Склеивание двух 1CD-файлов в один

Склеивание двух 1CD файлов в один, когда "свежий" файл физически не читается, но есть старый читаемый файл.

Столкнулся с ситуацией, когда при чтении 1CD-файла (БП 2.0) возникают CRC-ошибки, т.е. файл физически не читается. Лечение и тестирование не помогают, увы. Оказалось, даже просто скопировать поврежденный файл — проблемаFrown. Выяснил, что физически поврежденные блоки находятся в районе 10Мб (а файл больше гигабайта), поэтому я предположил, что это не данные, а какая-то из конфигураций. Еще есть архив трехмесячной давности и конфигурация с тех пор точно не менялась. Как перенести правильные куски конфигурации из старого файла в новый? 

Пришлось написать маленькую консольную утилиту, которая читает битый файл порциями по 4096 байт (8 блоков по 512, стандартный размер кластера в NTFS) и пишет эту порцию в новый файл. Если возникает ошибка чтения, то выдается сообщение ERR «номер ошибки» «позиция от начала файла». Для CRC-ошибки номер 32 (а других я не видел) и в выходной файл пишется блок «*ERROR* нулевые байты…».  Однако можно указать старый файл и в этом случае порция будет считана из него (с той же позиции, как и в битом файле). В процессе копирования выводится начальный адрес читаемой порции (один раз на 1000 порций).

Можно изменить размер  считываемой порции, указав ключ -n (n=1..8, количество 512-байтовых блоков в порции), но для NTFS это приводит только к замедлению работы, а толку — никакого. Однако этот ключ может помочь, когда размер кластера  меньше 8 блоков (при чтении с флешки или маленького FAT/FAT32 раздела).

24 Comments

  1. TrinitronOTV

    интересная методика восстановления файла базы, спасибо, что поделились своей идеей

    Reply ↓
  2. Wooster

    Нормальный ход. А быстрый обмен БП и УТ таким макаром можно запилить ?

    Reply ↓
  3. zels

    Я бы не рискнул так обмениваться.

    Reply ↓
  4. script

    Оказывается и среди 1С-ников встречаются программисты

    Reply ↓
  5. zels

    (4) script, и программисты и физики и математики и экономисты…

    Интересно, есть представители гуманитарных профессий?

    Если кому интересно, то выходной файл (формирование которого на картинке к статье) получился полностью рабочим.

    Не думаю, что следует торопиться скачивать саму програмку (так просто ее не протестировать, нужны реальные сбои) — достаточно знать, что она есть и помнить, где ее взять. Не знаю почему, но поиск ее по характерным словам не находит…

    Reply ↓
  6. vasiliy_b

    Что только народу не приходится делать, и только потому что не хотят делать ежедневные копии. Но вещь полезная, не спорю в хозяйстве сгодится. Хотя ее полезность относится только к тому случаю когда поврежден диск в области конфигурации, а в остальных случаях, вы получите не рабочую базу.

    Reply ↓
  7. MMF

    ИМХО, или я не оценил идеи или идея идиотская. 1CD файл с произвольным доступом и модификацией. Допустим, супер утилита не может прочитать кусок с неким смещением и в итоге она заменяет его взятым из архива с тем же смещением. Это маразм и бред. Итог такого склеивания нужно сразу же Shift+Del.

    Reply ↓
  8. zels

    (7) MMF, не только люди отбирают идеи, но и наоборот.

    Базу я восстановил, она работает. Если еще кому-то пригодится — буду рад. А те, кто не понял, пусть используют другие способы (я их не отвергаю, просто у меня на один способ больше)…

    Кстати, когда файл не читается, стандартные средства тестирования/лечения нередко просто «валятся»…

    Reply ↓
  9. asved.ru

    Я бы предложил читать постранично структуру 1CD, и копировать поврежденные страницы.

    Reply ↓
  10. zels

    (9) asved.ru, когда появится конкретная необходимость, буду смотреть.

    Сейчас програмка универсальная и простая, ей все равно какие файлы склеивать — от 8-ки, от 7-ки или какие-то еще…

    Reply ↓
  11. insurgut

    (10) т.е. если конфигурация не изменяется — данные всегда в конец в файловой базе дописываются?

    Reply ↓
  12. zels

    (11) insurgut, не знаю как платформа ведет себя «вообще», но в моем случае это было так.

    Гарантий нет, но надеяться можно, имхо. Я полдня убил на тестирование винчестера, попытки восстановить файл.

    Потом написал програмку, которая за 5 мин все восстановила и последующее тестирование ошибок не нашло.

    Имхо, потратить 5 мин+тестирование — небольшие временные затраты для такого экстраординарного случая (базы физически портятся довольно редко). Получится — замечательно, а не получится — надо пробовать другие способы.

    Я не позиционирую этот подход, как универсальный способ с гарантией результата. Просто это:

    1. Может сработать сразу.

    2. Занимает мало времени.

    3. Полученный файл (у которого испорченные блоки забиты нулями) можно попробовать восстановить штатными средствами.

    А любителям стрелять из пушек по воробьям никто не мешает…

    Reply ↓
  13. asved.ru

    Новые страницы данных добавляются в конец, это верно. Но:

    1) Первая страница и некоторые другие являются оглавлением

    2) Кроме запросов INSERT, существуют еще и запросы UPDATE.

    Reply ↓
  14. zels

    (13) asved.ru, если бы сбой был в начале, я возможно и не стал пробовать.

    Но поскольку сбой был на 10Мб, я рассчитывал, что служебная информация и данные не пострадали. И рад, что не ошибся.

    Reply ↓
  15. vasiliy_b

    Может тогда стоит допилить утилиту для подмены только той части файла где лежит конфигурация, а если повреждения в области данных, то выдавать соответствующее сообщение.

    Reply ↓
  16. Evil Beaver

    (4) script,

    Оказывается и среди 1С-ников встречаются программисты

    и чаще, чем вы думаете. А если считывание блоков из файла для вас уже признак Программиста(тм), то хм….

    Reply ↓
  17. burlakov

    мда. представляю сколько денег можно на таком восстановлении заработать. клиенты порой готовы платить любые суммы (по собственному опыту). сама методика реально интересна!

    Reply ↓
  18. avtospanov

    интересная методика восстановления файла базы

    Reply ↓
  19. zels

    (17) burlakov, не на таком, но можно.

    Как-то у клиента полетел сравнительно новый raid и пришлось почти неделю собирать базу по кусочкам из 4-х баз (2 SQL и 2 файловых). Правда, там пришлось действовать не через чтение 1CD, а через прямые запросы к SQL и специальные обработки XML-загрузки/выгрузки.

    А для разборок с логическими проблемами в 1CD есть прекрасные решения здесь, на инфостарте. Вот, к примеру отличная статья: Файловые базы *.1CD. Физическая структура. Восстановление

    Зачем с ними конкурировать? Их надо использовать (что и делаю иногда).

    Reply ↓
  20. 12345qwerty

    Надо развивать идею , может и что стоящее выйдет

    Reply ↓
  21. amon_ra

    если мне не изменяет память ошибка CRC это ошибка считывания информации с HDD, т.е. тут проблема с самим хардом, вероятно бэды. Мы в свою очередь часто встречаемся с такими ошибками, конечно ваш вариант интересный с точки зрения дальнейшего развития, однако, мы разрешали ситуацию путем копирования файла с битого сектора утилитой «non-stop copy», затем чекали и если, что то пропадала/убивалось дополняли/правили в хекс редакторе (им реже пользовались, в основном после chdbfl догружали недостающие данные, которые были на битых секторах). К слову, сказать размер БД у нас досттаочно огромен.

    А за идею и разработку, конечно, плюс. Развивайте идею, разработка довольно интересная и спрос у нее по-любому появится.

    Reply ↓
  22. zels

    Да, CRC-ошибка означает сбой на HDD. Я пробовал non-stop copy, но прочитать без сбоев не удалось. Поэтому и написал свою утилиту, которая пытается скопировать что можно, а что нельзя — подставить из другого файла. Можно заменить сбойные блоки и вручную, но это займет больше времени. Что касается развития. Тут я сторонник unix-подхода: пусть каждая утилита делает свое дело, но делает его хорошо.

    Задачи этой:

    — сделать из нечитаемого файла читаемый

    — показать, в каких блоках проблемы

    — при наличии архива заменить нечитаемые блоки

    По ссылке Файловые базы *.1CD. Физическая структура. Восстановление. очень много полезной информации и других ссылок, а также есть описание замечательного инструмента Tool_1CD. Я делал «для себя» 1С обработку, которая читает блоки 1CD-файла и использует для работы компоненту 1CDLib Компонента для прямого чтения/записи данных из файлов баз данных .1CD Прилагаю обработку, каждый может ее использовать и допиливать для «сырого» чтения 1CD-файла (компоненту 1CDLib надо скачать отдельно, если ее нет). Делал для себя, так что она не причесана и строго не судите…

    Развивать утилиту в этом направлении пока смысла не вижу, ее можно использовать совместно с 1CDLib и Tool_1CD.

    Кроме того, при проблемах с 1CD-файлом его можно отправить в 1С для восстановления (главное, чтобы он был и читался).

    Для «глубокого бурения» может понадобиться такой инструмент, как программа чтения логической структуры нескольких 1CD-файлов с копированием и модификацией таблиц (см статьи по ссылкам).

    Я думаю, что когда очень нужно восстановить файл, а стандартные средства (включая отправку на техподдержку) не помогают, нужно будет разрабатывать индивидуальную утилиту для исследования и исправления. Заготовка такой утилиты есть, но к сожалению (или к счастью) пока не понадобилась для реального восстановления. По сути это C++ проект, который изменяется под конкретный 1CD-файл. Но это чисто теоретические размышления, слабо подкрепленные практикой (так, потренировался на одном битом файле).

    Reply ↓
  23. sss999

    (22)а что он может?

    Reply ↓
  24. zels

    Утилиту скачало довольно много народу. Напишите, кому она помогла, как удалось восстановить базу (какие дополнительные действия предприняли).

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *