powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Восстановление таблиц ???
25 сообщений из 25, страница 1 из 1
Восстановление таблиц ???
    #33124020
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP9.
После аварийной перезагрузки появилось сообщение о том , что таблица CORRUPT и ее необходимо REPAIR перед использованием. VFP6 эту таблицу открывает и обрабатывает нормально.
Есть ли какой либо механизм "починки" такого рода поломок?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124028
Фотография Диченка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArDoVFP9.
После аварийной перезагрузки появилось сообщение о том , что таблица CORRUPT и ее необходимо REPAIR перед использованием. VFP6 эту таблицу открывает и обрабатывает нормально.
Есть ли какой либо механизм "починки" такого рода поломок?

Дак ты открой эту таблицу в VFP6 и сделай из нее селект всех данных в другую временную таблицу. Потом попытайся открыть временную таблицу в 9-ке. Если все нормально, то грохни поломанную таблицу, и замени ее временной.
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124045
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Диченка
Такие сложности ни к чему: после любого изменения сделанного в таблице из под 6 таблица становится нормальной и для 9.
НО находится она у черта на куличиках - хотелось бы процедуру восстановления вшить в ЕХЕшник и повесить на пользователя.
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124077
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что таблица открылась в VFP6 вовсе не означает, что она корректна. Просто в VFP6 не было автоматического контроля некоторых структур. Почитай описание команды

SET TABLEVALIDATE

В твоем случае, скорее всего, произошло рассогласование количества записей сохраненных в заголовке таблицы (то, что возвращает Reccount()) и реального физического количества записей.

Почитай описание структуры таблицы в статье HELP

Table File Structure (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx)

Написать собственный фиксер на эту проблему достаточно просто. Там даже приведена формула расчета физического количества записей. А в заголовке таблицы количество записей храниться в байтах с 4 по 7 включительно (читать справа налево)
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124112
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, затронут довольно серьезный вопрос.

Я бы, со своей стороны, предложил следующую тему для обсуждения: как правильно лечить базу данных VFP - сборник народных рецептов.
И затем обобщить.
Много по этой теме уже было, но мне лично попадались только разрозненные сведения. Тоже тема серьезной статьи, кстати.
Вот почему я, например, с большой осторожностью пользуюсь dbc, сильно задумываюсь перед тем, как на уровне БД прописать лишнее RI и совсем не пользуюсь автоинкрементами: да потому что у меня нет четкого представления, как все индексы, связи, целостность и значения счетчиков восстановить в случае сбоя в какой-то одной таблице.
Кто имеет системный подход и ему есть, что сказать? Кто знает ссылки по теме? Welcome!
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124146
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrriВот почему я, например, с большой осторожностью пользуюсь dbc, сильно задумываюсь перед тем, как на уровне БД прописать лишнее RI и совсем не пользуюсь автоинкрементами: да потому что у меня нет четкого представления, как все индексы, связи, целостность и значения счетчиков восстановить в случае сбоя в какой-то одной таблице.
Кто имеет системный подход и ему есть, что сказать? Кто знает ссылки по теме? Welcome!
Не надо путать невосстановимые повреждения данных (самих DBF-таблиц) и повреждение структур, основанных на данных (индексах CDX).

Логика восстановления индексов (CDX) достаточно проста:

-) Создается образцовая структура (все таблицы и индексы) или же просто резервная копия базы данных
-) В случае повреждения индексов, все испорченные файлы CDX просто удаляются. На их место коипруются нужные файлы CDX из образцовой (или резервной) копии. Поскольку их стурктура корректна, то открываем таблицы (USE ... EXCLUSIVE) и просто переиндексируем (REINDEX) для приведения содержимого индекса в соответсвии с содержимым таблицы.

По поводу самого файла контейнера базы данных (DBC, DCT, DCX)

Этот файл вообще не должен модифицироваться в процессе работы приложения. Для этого просто нет никаких причин. Поэтому его ремонт заключается в элементарном копировании всех этих 3 файлов из образцовой (резервной) копии.

А вот восстановление собственно данных (DBF и FPT) - это задача которая в принципе не может иметь универсального решения. Да, есть ряд наиболее распространенных повреждений (например, несоответсвие записей в счетчике и их реального количества). Для них можно написать фиксеры. Но в общем случае восставновление решается ручным просмотром содержимого файла на низком уровне. Поскольку заранее просто невозможно предсказать, как именно будет повреждена область данных.
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124242
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир, большое спасибо, вот как раз третий вариант хотелось бы порассматривать.
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124249
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК, хорошо, пусть даже мы решили, что последние введенные в битую таблицу данные восстановлению не подлежат, но у нас есть вчерашняя копия таблицы. Но на битой таблице автоинкремент, плюс она связана (с ограничениями целостности) с другими таблицами, в которых уже насоздавали ссылок на убитые данные. И как практически правильнее это восстанавливать?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124267
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для восстановления таблицы нужен эксклюзивный доступ
если он есть то вам хватит этого тока проверте код c validate
set validate to 3
alter table mytable add column nn n(1)
alter table mytable drop column nn
set validate to 0

Если нет эксклюзивного доступа то решения я не знаю
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124280
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эксклюзивный доступ, конечно, есть, а как же без него ;-)
Немного не понял, а что, собственно, делает Ваш пример, leaf?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124281
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrriОК, хорошо, пусть даже мы решили, что последние введенные в битую таблицу данные восстановлению не подлежат, но у нас есть вчерашняя копия таблицы. Но на битой таблице автоинкремент, плюс она связана (с ограничениями целостности) с другими таблицами, в которых уже насоздавали ссылок на убитые данные. И как практически правильнее это восстанавливать?
Да при чем здесь автоинкремент и наложенные ограничения! Это вообще дело десятое.

Представь, что у тебя есть комплекс таблиц вообще никак между собой не связанные в контейнере базы данных. Каждое значение поля ты формируешь в самом приложении путем прямой модификации (ну, как в DOS-приложении).

И что ты будешь делать если "слетит" одна таблица?

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

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

А есть гарантия, что слетела только одна таблица? Разумеется нет. А сколько времени потребует ручное восстановление? В зависимости от сложности базы данных и степени повреждения от пары минут, до пары дней.

Т.е. по сути, для достаточно сложных баз данных выбора вообще нет. Только восстановление из резервной копии. В сложных системах дешевле ввести все данные заново, чем ждать пару дней, пока кто-то вручную восстановит потерянные данные (причем еще далеко не факт, что восстановит!)
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124313
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, Владимир, т.е. Ваше мнение - "померла так померла", и если уж восстанавливаем табличку на утро, то и всю базу восстанавливаем вместе с ней.

А мне вот пользователей бывает жалко. Представим, что в битой таблице пропало всего 2 записи (правда, автосчетчик накрутили на 3), зато другой отдел успел к моменту сбоя понавводить 342 заказа на продажу по 10 позиций в каждом. К тому же, по идее, я приблизительно представляю, что навводили в сбоившую таблицу за сегодняшний день (у меня даже журнальчик ведется соответствующий - и он не грохнулся). Таким образом, моя задача - взять вчерашнюю таблицу, ввести в нее 2 пропавшие записи (значения некоторых из полей, в том числе ключевых, я знаю из таблички-журнала), накрутить счетчик, как положено (посмотреть для этого в другие таблички на предмет FK), положить ее вместо битой и переиндексировать в Exclusive. И все? Ничего не упустил, случаем?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124331
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, специально для хаятелей FoxPro сообщаю, что рассматриваю гипотетическую ситуацию, которая только может произойти, но реально не происходила ни разу (у меня, по крайней мере) ;-)))
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124370
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропустил, причем много чего.

-) Документ - это не одна запись в одной таблице. Обычно это комплекс, связанных между собой таблиц. Есть гарантия, что побилась только одна таблица?
-) Есть гарантия, что побились только 2 записи?

Т.е., если сбой произошел, то надо проверять ВСЮ базу данных. ВЕСЬ комплекс таблиц. Ты сейчас вот здесь вот эти 2 записи подправишь, а через пол-года выясниться, что оказываеьтся слетели данные еще где-то в другой таблице.

А как реально можно проверить корректность ВСЕЙ базы данных. По большому счету - никак!

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

Подкручивать счетчик автоинкремента нет никакой необходимости. Надо будет просто изменить тип поля на обычный Integer для внесения изменений (автоинкрементные поля невозможно модифицировать), а потом восстановить Integer (AutoIncrement) со старыми настройками. Или править код записи на низком уровне.
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124396
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Urri
а что собственно делает? Восстанавливает таблицу. Можно так же сделать выборку из таблицы и уронить на место таблицы-родителя. Можно так же привести в соответствие количество записей указаное в заголовке и реально существующее.Но у Вас интерес праздный, а у нас есть такая проблема.
Кстати, специально для хаятелей FoxPro сообщаю, что рассматриваю гипотетическую ситуацию, которая только может произойти, но реально не происходила ни разу (у меня, по крайней мере) ;-)))
Почему-то вспомнился Джеймс Бонд (never say never)
У меня тоже не было и сейчас нет, но вот перешли на девятку и у людей которые рядом со мной теперь есть такие проблемы
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124467
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafset validate to 3
Sorry, если я туплю - праздники, однако... :-)
Это чё за команда?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124537
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордля восстановления таблицы нужен эксклюзивный доступ
если он есть то вам хватит этого тока проверте код c validate
set validate to 3
alter table mytable add column nn n(1)
alter table mytable drop column nn
set validate to 0

Если нет эксклюзивного доступа то решения я не знаю

В данном конкретном случае на ура отработал вариант:

SET TABLEVALIDATE TO 0
USE mytable.dbf shared (reccount = 630)
append blank
delete (reccount = 631)
SET TABLEVALIDATE TO 1

при том , что вариант :

SET TABLEVALIDATE TO 0
USE mytable.dbf exclusive
pack
результата не дал


leaf
set validate to 3 - дает сообщение об ошибке!
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124589
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Redrik
У меня тоже были выходные поэтому торможу я конечно
SET TABLEVALIDATE TO 0
просто вариант отпал и не используется пошли через селект
да и проблема не у меня
2ArDo
забавно
неужели так просто счас проверим если отработает, пришлю виртуальное пиво но кажеться оно ругалось на внесение записи
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124606
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ArDo
Все гениальное просто
SET TABLEVALIDATE TO 0
USE d:\chek33.dbf IN 0 SHARED
APPEND BLANK
DELETE
SET TABLEVALIDATE TO 3
USE
USE d:\chek33.dbf IN 0 SHARED

терь открываеться ура :)

сенкс
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124746
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ Спасибо!!!

leaf А как ты сделал таблицу с такой ошибкой?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33124815
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну во-первых сделал не я причем с любой стороны не я ( программа не моя)
Во-вторых нужна версия фокса не ниже восьмой, так как именно в восьмой версии возобновили или ужесточили контроль за целостностью таблицы
в-третьих ошибку пытаемся отловить пока без результатно причем лезет на всех таблицах даже где трансакций нет. Короче отовсюду. Ну что же будем давить пока не найдем причину
А возникла как я уже говорил когда перешли на девятую версию с седьмой
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33125503
qwertyqwerty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я как то на VFP7 решил с эмулировать изчезновение индексного файла (PRIMARY KEY) у файла dbf в составе DBC, типа удаляю его, за тем запускаю программу, в требуемый момент работает код:

REMOVE TABLE spuser
select 0
use (p_dbc+"\"+"spuser.dbf") exclusive
if used("SPUSER")
select SPUSER
use
ADD TABLE (p_dbc+"\"+"spuser.dbf")
ALTER TABLE spuser ADD PRIMARY KEY id_user TAG id_user
else
Messagebox("Невозможно автоматически исправить ошибку!!! Обратитесь в службу поддержки")
endif

Прога запущена ... поработали, но по выходу из выходу из проги происходит
ошибка " ... Exception 00005" .
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33126051
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2qwertyqwerty
интересно к чему Вы это ? Всё не так уж запущено, хотя всё относительно.
Нашлась ошибочка долго держаться открытые трансакции(плохой стиль). Но я говорил уже писал это не я
Хотя возможно я бы наваял еще хуже
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33126258
qwertyqwerty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2leaf - это вопрос : :

На сколько стабильнее обработка неисправностей DBC в 8-е и 9-е?
...
Рейтинг: 0 / 0
Восстановление таблиц ???
    #33126280
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2qwertyqwerty
ну как Вам сказань насколько? Нет у меня линейки в нужном месте
Только перешли. Просто на девятке запрешены некоторые фривольности. И как сказал один известный товарищь : "И это правильно."
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Восстановление таблиц ???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]