Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Recovery Dbf (Необходимо восстановить заголовок таблицы) [dBase, FoxPro]


Страницы:   1 2

Rustam_Katana ©   (2002-11-21 08:52:00) 

Доброго времени суток, мастера...
Есть проблема и достаточно серьезная - рухнула база, все мои попытки восставить ее ничем хорошим для нее незакончились. Пытался восстанавливать и всякими там FixDbf,SalvDbf (все они пестрят просто лозунгами о восстановлении без проблем header-ов) но нифига не помогло.
Размер базы 7,5 метров. Если кто-то встречался с подобной проблемой и находил выходы, укажите хотябы направление.
Заранее благодарен за все попытки помочь.


Rustam_Katana   (2002-11-23 13:37:00) [1]

>Anatoly Podgoretsky

Ну как это не правильно, если я это делал 2-мя способами:
1. Вручную Hex-редактором по эталону.
2. С помощью TFileStream ->> CopyFrom
Что есть не правильно??


Anatoly Podgoretsky   (2002-11-23 13:06:00) [2]

Раз переместились на 5 позиций, то это означает, что ты неправильно создал заголовок, вся остальная работа теряет смысл.
Если бы у тебя было больше опыта в части знания внутренней структуры FoxPro (а у тебя именно этот формат, или в худшем случае Клиппер), то можно было бы попробовать следующее, с поиощью процедур работы с нетипизированными файлами, читать записи напрямую из файла, разделять их на поля и запихивать в новую базу, но именно с ней у тебя проблема, твоя структура не совпадает с исходной. Хотя все равно попробовать можно, если твои даныые сами по себе не разрушены, то успех гарантируется на 100 процентов, поскольку у тебя нет мемо полей.


ЮЮ   (2002-11-23 12:59:00) [3]

>Каким образом организовать смещение всех записей на место ?

Переписать в новый файл, добавив недостающие(удалиы лишние) байты


Rustam_Katana   (2002-11-23 12:53:00) [4]

>Anatoly Podgoretsky
Как восстановить количество записей вручную, т.к. я так и не нашел нормальных лечилок ?
Каким образом организовать смещение всех записей на место ? (они переместились на 5 позиций)

Вот это 2 вопроса, не давшие мне сегодня поспать, если не считать заболевшего сына о 6 месяцах :(


Anatoly Podgoretsky   (2002-11-23 12:17:00) [5]

KSergey © (22.11.02 10:30)

С помощью планировщика конечно.
Разрушение целостности конечно учитывается, но так копирование почасовое, это означает, что у меня не один арзив, а по одному на каждый час. И это в определенной мере снимает проблему целостности. Кроме то проблема в основном возникает с неактуальностью индексов, но лечилка индексов включена в программу.

Да же с учетом некоторой неактуальности польза все равно большая, такая как или полностью порушенная база и черт знает с каким старым архивом, и серией предыдущих архивов за каждый час.

Так что выбор есть. Ночью и вечером естественно это не является проблемой, никто не работает. В этой части архив совпадет с твоим, но у меня их больше для выбора.


Anatoly Podgoretsky   (2002-11-23 12:10:00) [6]

Rustam_Katana (22.11.02 08:01)
Так как у тебя нет мемо полей, то твоя задача упращается, теперь твоя задача восстановить в заголовке количество записей, это можно сделать или вручную или с помощью лечилки, вот какая сможет верно отработать не знаю, пробуй подряд разные. Последний шаг восстановление индексов.


Rustam_Katana   (2002-11-23 09:25:00) [7]

В общем благодаря вниманию всех, и советам, я вчера исправил заголовок хексредактором и со 2-ой попытки база открылась, но проблемы с тем, что куда надо вписать кол-во записей??
и как убираются сдвиги образовавщиеся из-за сбоя?, вручную я смог только одну запись исправить, а остальные 34тысячи?? :)


Roman Yaroshenko   (2002-11-22 10:54:00) [8]

Кидай базу мне в мыло? Исправим ...

romanf@ukr.net


KSergey   (2002-11-22 10:30:00) [9]

to > Anatoly Podgoretsky

А как вы делали почасовую копию? Это интересно.
Я вижу один метод - копировать все файлы (ну там оаз в час). Но ведь данные постоянно модифицируются, пока один копируешь. связанный с ним может поменяться - и целостность в копии порушена... Я такое делаю только ночью, когда никто не работает, а как это можно сделать среди работы? (вариант выгонять всех раз в час на кофе - интересен, но не всегда приемлем, к сожалению...)


xenon   (2002-11-22 09:28:00) [10]

С CDX бороться не сложно: Создать новую таблицу без индекса,
а после реанимации старой - создать к ней CDX. Нужно только знать теги и поля, п которым индексировать.


sw   (2002-11-22 08:50:00) [11]

Вот фрагментик из 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;

(* *)
(*==============================================================*)


DiamondA   (2002-11-22 08:21:00) [12]

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


Rustam_Katana   (2002-11-22 08:01:00) [13]

cdx но без memo :)


xenon   (2002-11-21 18:14:00) [14]

> kva
Абсолютно верное замечание по поводу форматов и индексов.
Но в теме указано [dBase, FoxPro], а Delphi не упоминается. Следовательно есть все основания полагать, что файлы тоже в формате dBase или FoxPro. Нортоновская гляделка на ура распознает такие файлы.
Anatoly Podgoretsky © посоветовал создать новую таблицу. Могу поспорить на щелбан :), что новую Rustam_Katana будет создавать теми же средствами, что использовались при создании убитой таблицы. А значит заголовок будет содержать ту же информацию о версии и пр. Вот с cdx и memo действительно проблема (если, конечно, они есть).


kva   (2002-11-21 17:11:00) [15]

Какая версия dbf файлов (DBase III+ или выше)?
Какие индексы? (NTX, IDX, CDX, MDX или другие)
Есть ли Memo поля?
Присоветованная нортоновская смотрелка dbview не всегда распознает dbf файл. Она расчитана по моему только на DBase III+. По крайней мере Fox-вские файлы не берет. Все указанные параметры хранятся в заголовке dbf файла
Приходилось мне восстанавливать файл. Писал специальную программу. Основная трудность была в восстановлении memo. Memo поля хранятся в отдельном файле. Программа писала в протокол записи, для которых восстановить мемо не удавалось по причине порчи данных. Так что не всегда все просто.
Удачи.


NickBat   (2002-11-21 14:39:00) [16]

Человеку дали много разных советов, но никто не сделал предположения, что может не в заголовке дело. Он ведь не писал КАК "рухнула" база. Судя по описанию проблемы, испортился не только заголовок, но и данные, скорее всего, структура содержимого таблицы тоже нарушена. Именно поэтому все стандартные "восстановители" и спасовали. А при такой проблеме восстановить таблицу без потери информации невозможно. :(((

Резевное копирование баз не вчера придумали.


Rustam_Katana   (2002-11-21 14:00:00) [17]

OK.
попробую, завтра напишу, что получилось,
--думаю, что обязательно напишу, чтобы там не получилось :)


Anatoly Podgoretsky   (2002-11-21 13:58:00) [18]

Сделай пока паузу, осмысли полученную информацию, поэкспериментируй.
А на будущее введи архивацию, лучше почасовую.


xenon   (2002-11-21 13:52:00) [19]

> Rustam_Katana (21.11.02 12:29)
> Не может он нифига, грит не база и все тут

Сначала заголовок из новой таблицы скопируй, а потом уже открывай dbview или dbed.exe (кажется этот тоже есть в комплекте)


Rustam_Katana   (2002-11-21 12:29:00) [20]

>xenon
Не может он нифига, грит не база и все тут


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо