Склеивание двух 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 не будет опубликован. Обязательные поля помечены *