Текущий архив: 2002.12.12;
Скачать: CL | DM;
Вниз
Recovery Dbf (Необходимо восстановить заголовок таблицы) Найти похожие ветки
← →
Rustam_Katana (2002-11-21 08:52) [0]Доброго времени суток, мастера...
Есть проблема и достаточно серьезная - рухнула база, все мои попытки восставить ее ничем хорошим для нее незакончились. Пытался восстанавливать и всякими там FixDbf,SalvDbf (все они пестрят просто лозунгами о восстановлении без проблем header-ов) но нифига не помогло.
Размер базы 7,5 метров. Если кто-то встречался с подобной проблемой и находил выходы, укажите хотябы направление.
Заранее благодарен за все попытки помочь.
← →
Anatoly Podgoretsky © (2002-11-21 09:05) [1]Если еизвестна структура, то можно применить следующее, создать новую индетичную таблицу, затем физически заменить заголовок, останется только восстановить в заголовку счетчик количества записей.
← →
Rustam_Katana (2002-11-21 09:17) [2]Структура известна, чем заголовок править?
← →
Anatoly Podgoretsky © (2002-11-21 09:20) [3]Править не нужно, нужно создать НОВЫЙ (создать новую пустую таблицу)
← →
xenon © (2002-11-21 09:32) [4]hiew.exe или что-нибудь в этом роде.
в Dos Navigatore хороший редактор.
В старом корректишь байтики в заголовке.
Значения записываешь из НОВОГО, как сказал Anatoly Podgoretsky.
Не забудь исправить кол-во записей в заголовке.
← →
Rustam_Katana (2002-11-21 09:39) [5]Щас скачал FixDbf32 он что-то пытается сделать, грит непонятные поля, просит типы задать, но пошел уже бегать по кускам записей, а не пополям, так что придется наверно повашему методу.
А может есть какая еще восстановлялка,а?
← →
xenon © (2002-11-21 09:49) [6]Не верь им. Я уже много раз на всякие грабли наступал.
Самый надежный инструмент - руки + Hiew + калькулятор.
← →
makdi (2002-11-21 10:19) [7]Могу посоветовать прогу FOX.EXE, если твои базы под досом, он открывает ьаблицу с рухнувшим загаловком, потом добавляешь запись, удаляешь её и все - база функционирует (только нужно сделать переиндуксацию ). Если нужно пиши на мыло вышлю.
← →
Anatoly Podgoretsky © (2002-11-21 10:21) [8]Не надо ручками переписывать ничего, чревато ошиками, за пару минут напиши программу, читать новый файл и записать заголовок в старый. Надуюсь что все свои эксперименты проводишь над копией все таки.
← →
xenon © (2002-11-21 10:30) [9]> Anatoly Podgoretsky
Ручками все равно придется править кол-во записей.
← →
VladTen (2002-11-21 11:07) [10]В компонентах RX есть прога с исходниками "DBEXPL32". Достаточно им попытаться открыть таблицу, и все проблемы как ветром сдувает (сам не раз пользовался).
← →
Anatoly Podgoretsky © (2002-11-21 11:14) [11]xenon © (21.11.02 10:30)
Это единственно что надо делать сверх описанного, но вот тут уже на помощью можно привлечь лечилку, но только нормальную, хотя я лично предпочту ручками или просто востановлю таблицу из архива за предыдущий час.
← →
Rustam_Katana (2002-11-21 11:41) [12]>Anatoly Podgoretsky
Какую программку надо написать?? Я вчера пробовал переделывать компоненты на Delphi5 pgDbf, самописный для DBF, он там исключения всякие выдовал, так нифига я и не смог сделать, вылетала на получении списка полей :(
Может у тебя есть что-то, так поделись.
>VladTen нету у меня в RX таких модулей
← →
Rustam_Katana (2002-11-21 11:44) [13]Кстати, ну подправлю я заголовок, а дальше то что??
Количество записей где взять?
← →
xenon © (2002-11-21 11:56) [14](Длина файла - длина заголовка) / длина записи
Длину записи можно узнать, в Фокспро в окне модификации струкуры
Длина заголовка - c с первого байта по символ CHR(13)
Записи хранятся в тестовом виде, поэтому сразу видно, где они начинаются.
Длину файла сам как-нибудь узнаешь :)
← →
Anatoly Podgoretsky © (2002-11-21 12:02) [15]Программа простая, вот алгоритм
открыть файл эталон на чтение (двоиный нетипизированный файл)
открыть поврежденный файл на запись
прочитать первый файл полностью
записать все байты в поврежденный, в начало
закрыть все
остается только скорректировать количество записей, если ты знаешь внутренне устройство, то любым хекс редактором, произведя расчет, если нет, то лечилкой, только заведо надежной, большинство лечилок некачественные.
Для выполнения алгоритма можно использовать или нетипизированный файл или TFileStream (этот попроще и удобнее)
Такое можно делать если ты создал новую структур один к одному
Тогда у тебя в файле эталоне только заголовок и ноль записей, поэтому можно делать простую замену.
← →
Rustam_Katana (2002-11-21 12:08) [16]М-да..
Инфой снабдили, теперь надо садится и пробовать.
Благодарю всех за участие.
← →
xenon © (2002-11-21 12:10) [17]Кстати, в комплекте с нортон-командером есть dbview.exe,
он сам восстанавливает кол-во записей.
Если у тебя нет, могу кинуть тебе в ящик.
← →
Zn (2002-11-21 12:14) [18]В Norton Utilities под DOS (в 8 и ранее) была утилитка для восстановления повреждённых dbf-ов. Несколько раз пользовался. Но чаще открывал повреждённый файл dbf-редактором (назывался de, подробностей не помню), добавлял пустую запись, сохранял и тогда заголовок восстанавливался.
← →
Rustam_Katana (2002-11-21 12:29) [19]>xenon
Не может он нифига, грит не база и все тут
← →
xenon © (2002-11-21 13:52) [20]> Rustam_Katana (21.11.02 12:29)
> Не может он нифига, грит не база и все тут
Сначала заголовок из новой таблицы скопируй, а потом уже открывай dbview или dbed.exe (кажется этот тоже есть в комплекте)
← →
Anatoly Podgoretsky © (2002-11-21 13:58) [21]Сделай пока паузу, осмысли полученную информацию, поэкспериментируй.
А на будущее введи архивацию, лучше почасовую.
← →
Rustam_Katana (2002-11-21 14:00) [22]OK.
попробую, завтра напишу, что получилось,
--думаю, что обязательно напишу, чтобы там не получилось :)
← →
NickBat © (2002-11-21 14:39) [23]Человеку дали много разных советов, но никто не сделал предположения, что может не в заголовке дело. Он ведь не писал КАК "рухнула" база. Судя по описанию проблемы, испортился не только заголовок, но и данные, скорее всего, структура содержимого таблицы тоже нарушена. Именно поэтому все стандартные "восстановители" и спасовали. А при такой проблеме восстановить таблицу без потери информации невозможно. :(((
Резевное копирование баз не вчера придумали.
← →
kva (2002-11-21 17:11) [24]Какая версия dbf файлов (DBase III+ или выше)?
Какие индексы? (NTX, IDX, CDX, MDX или другие)
Есть ли Memo поля?
Присоветованная нортоновская смотрелка dbview не всегда распознает dbf файл. Она расчитана по моему только на DBase III+. По крайней мере Fox-вские файлы не берет. Все указанные параметры хранятся в заголовке dbf файла
Приходилось мне восстанавливать файл. Писал специальную программу. Основная трудность была в восстановлении memo. Memo поля хранятся в отдельном файле. Программа писала в протокол записи, для которых восстановить мемо не удавалось по причине порчи данных. Так что не всегда все просто.
Удачи.
← →
xenon © (2002-11-21 18:14) [25]> kva
Абсолютно верное замечание по поводу форматов и индексов.
Но в теме указано [dBase, FoxPro], а Delphi не упоминается. Следовательно есть все основания полагать, что файлы тоже в формате dBase или FoxPro. Нортоновская гляделка на ура распознает такие файлы.
Anatoly Podgoretsky © посоветовал создать новую таблицу. Могу поспорить на щелбан :), что новую Rustam_Katana будет создавать теми же средствами, что использовались при создании убитой таблицы. А значит заголовок будет содержать ту же информацию о версии и пр. Вот с cdx и memo действительно проблема (если, конечно, они есть).
← →
Rustam_Katana (2002-11-22 08:01) [26]cdx но без memo :)
← →
DiamondA (2002-11-22 08:21) [27]Попробуй утилиту, может поможет, она делает много что сказано выше. Проверь мыло.
← →
sw © (2002-11-22 08:50) [28]Вот фрагментик из UNIT"а на TP6.0, полезный на случай, если надо разобраться в структуре DBF заголовка:
(*==============================================================*)
(* *)
(* ВОЗМОЖНЫЕ ТИПЫ ПОЛЕЙ СТАНДАРТНОГО DBF ФАЙЛА *)
(* *)
(* *)
const
typs : array[1..5] of string[9] =
("Numeric ",
"Character",
"Date ",
"Logical ",
"Memo ");
FieldTyps : CharSet = ["C","D","L","N","M"];
(* *)
(*==============================================================*)
type
TStr10 = string[10];
TFldNam = TStr10; (* имя поля (длина = 10 символов) *)
TStrLen = TStr10; (* текстовое описание длины поля "12.5" *)
TAChars = array[1..$FFF0] of char;
PCharsPtr = ^TAChars;
(*==============================================================*)
(* *)
(* ОПИСАНИЕ ЗАГОЛОВОЧНОЙ ЗАПИСИ DBF ФАЙЛА *)
(* (согласно Р.Спенс "CLIPPER руководство *)
(* по программированию" 3-е издание *)
(* *)
(* *)
(* DBFDOC.pas - описание СТРУКТУРЫ DBF - ФАЙЛА *)
(* *)
(*==============================================================*)
(* Структура записи даты модификации DBF файла *)
(* *)
type
TDBFHeadDate = record
Year : byte;
Month : byte;
Day : byte;
end;
(*==============================================================*)
(* *)
(* ЗАГОЛОВОК DBF ФАЙЛА *)
(* *)
TDBFHeadRec = record
DBF_ID : byte;
LAST_UPDATE : TDBFHeadDate;
LAST_REC : longint;
DATA_OFFSET : word;
REC_SIZE : word;
FILLER : array [1..20] of byte;
end;
(*==============================================================*)
(* *)
(* ОДНА ЗАПИСЬ ОПИСАНИЯ ПОЛЯ *)
(* *)
TDBFFieldRec = object
FIELD_NAME : array [1..11] of char;
FIELD_TYPE : char;
CHAR_DUMMY : array [1..4] of char;
CHAR_LEN : word; { вариант CHAR_LEN : byte;
CHAR_DEC : byte; }
FILLER : array [1..14] of char;
end; (* object *)
(*==============================================================*)
(* *)
(* ВСЕ ЗАПИСИ ОПИСАНИЯ ПОЛЕЙ ВМЕСТЕ *)
(* *)
TDBFArrFieldRecs = array [1..255] of TDBFFieldRec; (* место для всех полей *)
PDBFFields = ^TDBFArrFieldRecs;
(* *)
(*==============================================================*)
← →
xenon © (2002-11-22 09:28) [29]С CDX бороться не сложно: Создать новую таблицу без индекса,
а после реанимации старой - создать к ней CDX. Нужно только знать теги и поля, п которым индексировать.
← →
KSergey © (2002-11-22 10:30) [30]to > Anatoly Podgoretsky
А как вы делали почасовую копию? Это интересно.
Я вижу один метод - копировать все файлы (ну там оаз в час). Но ведь данные постоянно модифицируются, пока один копируешь. связанный с ним может поменяться - и целостность в копии порушена... Я такое делаю только ночью, когда никто не работает, а как это можно сделать среди работы? (вариант выгонять всех раз в час на кофе - интересен, но не всегда приемлем, к сожалению...)
← →
Roman Yaroshenko (2002-11-22 10:54) [31]Кидай базу мне в мыло? Исправим ...
romanf@ukr.net
← →
Rustam_Katana (2002-11-23 09:25) [32]В общем благодаря вниманию всех, и советам, я вчера исправил заголовок хексредактором и со 2-ой попытки база открылась, но проблемы с тем, что куда надо вписать кол-во записей??
и как убираются сдвиги образовавщиеся из-за сбоя?, вручную я смог только одну запись исправить, а остальные 34тысячи?? :)
← →
Anatoly Podgoretsky © (2002-11-23 12:10) [33]Rustam_Katana (22.11.02 08:01)
Так как у тебя нет мемо полей, то твоя задача упращается, теперь твоя задача восстановить в заголовке количество записей, это можно сделать или вручную или с помощью лечилки, вот какая сможет верно отработать не знаю, пробуй подряд разные. Последний шаг восстановление индексов.
← →
Anatoly Podgoretsky © (2002-11-23 12:17) [34]KSergey © (22.11.02 10:30)
С помощью планировщика конечно.
Разрушение целостности конечно учитывается, но так копирование почасовое, это означает, что у меня не один арзив, а по одному на каждый час. И это в определенной мере снимает проблему целостности. Кроме то проблема в основном возникает с неактуальностью индексов, но лечилка индексов включена в программу.
Да же с учетом некоторой неактуальности польза все равно большая, такая как или полностью порушенная база и черт знает с каким старым архивом, и серией предыдущих архивов за каждый час.
Так что выбор есть. Ночью и вечером естественно это не является проблемой, никто не работает. В этой части архив совпадет с твоим, но у меня их больше для выбора.
← →
Rustam_Katana (2002-11-23 12:53) [35]>Anatoly Podgoretsky
Как восстановить количество записей вручную, т.к. я так и не нашел нормальных лечилок ?
Каким образом организовать смещение всех записей на место ? (они переместились на 5 позиций)
Вот это 2 вопроса, не давшие мне сегодня поспать, если не считать заболевшего сына о 6 месяцах :(
← →
ЮЮ © (2002-11-23 12:59) [36]>Каким образом организовать смещение всех записей на место ?
Переписать в новый файл, добавив недостающие(удалиы лишние) байты
← →
Anatoly Podgoretsky © (2002-11-23 13:06) [37]Раз переместились на 5 позиций, то это означает, что ты неправильно создал заголовок, вся остальная работа теряет смысл.
Если бы у тебя было больше опыта в части знания внутренней структуры FoxPro (а у тебя именно этот формат, или в худшем случае Клиппер), то можно было бы попробовать следующее, с поиощью процедур работы с нетипизированными файлами, читать записи напрямую из файла, разделять их на поля и запихивать в новую базу, но именно с ней у тебя проблема, твоя структура не совпадает с исходной. Хотя все равно попробовать можно, если твои даныые сами по себе не разрушены, то успех гарантируется на 100 процентов, поскольку у тебя нет мемо полей.
← →
Rustam_Katana (2002-11-23 13:37) [38]>Anatoly Podgoretsky
Ну как это не правильно, если я это делал 2-мя способами:
1. Вручную Hex-редактором по эталону.
2. С помощью TFileStream ->> CopyFrom
Что есть не правильно??
Страницы: 1 вся ветка
Текущий архив: 2002.12.12;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.022 c