|
|
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
VFP9. После аварийной перезагрузки появилось сообщение о том , что таблица CORRUPT и ее необходимо REPAIR перед использованием. VFP6 эту таблицу открывает и обрабатывает нормально. Есть ли какой либо механизм "починки" такого рода поломок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 09:48:35 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
ArDoVFP9. После аварийной перезагрузки появилось сообщение о том , что таблица CORRUPT и ее необходимо REPAIR перед использованием. VFP6 эту таблицу открывает и обрабатывает нормально. Есть ли какой либо механизм "починки" такого рода поломок? Дак ты открой эту таблицу в VFP6 и сделай из нее селект всех данных в другую временную таблицу. Потом попытайся открыть временную таблицу в 9-ке. Если все нормально, то грохни поломанную таблицу, и замени ее временной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 09:51:45 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
2 Диченка Такие сложности ни к чему: после любого изменения сделанного в таблице из под 6 таблица становится нормальной и для 9. НО находится она у черта на куличиках - хотелось бы процедуру восстановления вшить в ЕХЕшник и повесить на пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 10:00:53 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
То, что таблица открылась в VFP6 вовсе не означает, что она корректна. Просто в VFP6 не было автоматического контроля некоторых структур. Почитай описание команды SET TABLEVALIDATE В твоем случае, скорее всего, произошло рассогласование количества записей сохраненных в заголовке таблицы (то, что возвращает Reccount()) и реального физического количества записей. Почитай описание структуры таблицы в статье HELP Table File Structure (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx) Написать собственный фиксер на эту проблему достаточно просто. Там даже приведена формула расчета физического количества записей. А в заголовке таблицы количество записей храниться в байтах с 4 по 7 включительно (читать справа налево) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 10:15:01 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Кстати, затронут довольно серьезный вопрос. Я бы, со своей стороны, предложил следующую тему для обсуждения: как правильно лечить базу данных VFP - сборник народных рецептов. И затем обобщить. Много по этой теме уже было, но мне лично попадались только разрозненные сведения. Тоже тема серьезной статьи, кстати. Вот почему я, например, с большой осторожностью пользуюсь dbc, сильно задумываюсь перед тем, как на уровне БД прописать лишнее RI и совсем не пользуюсь автоинкрементами: да потому что у меня нет четкого представления, как все индексы, связи, целостность и значения счетчиков восстановить в случае сбоя в какой-то одной таблице. Кто имеет системный подход и ему есть, что сказать? Кто знает ссылки по теме? Welcome! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 10:28:46 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
UrriВот почему я, например, с большой осторожностью пользуюсь dbc, сильно задумываюсь перед тем, как на уровне БД прописать лишнее RI и совсем не пользуюсь автоинкрементами: да потому что у меня нет четкого представления, как все индексы, связи, целостность и значения счетчиков восстановить в случае сбоя в какой-то одной таблице. Кто имеет системный подход и ему есть, что сказать? Кто знает ссылки по теме? Welcome! Не надо путать невосстановимые повреждения данных (самих DBF-таблиц) и повреждение структур, основанных на данных (индексах CDX). Логика восстановления индексов (CDX) достаточно проста: -) Создается образцовая структура (все таблицы и индексы) или же просто резервная копия базы данных -) В случае повреждения индексов, все испорченные файлы CDX просто удаляются. На их место коипруются нужные файлы CDX из образцовой (или резервной) копии. Поскольку их стурктура корректна, то открываем таблицы (USE ... EXCLUSIVE) и просто переиндексируем (REINDEX) для приведения содержимого индекса в соответсвии с содержимым таблицы. По поводу самого файла контейнера базы данных (DBC, DCT, DCX) Этот файл вообще не должен модифицироваться в процессе работы приложения. Для этого просто нет никаких причин. Поэтому его ремонт заключается в элементарном копировании всех этих 3 файлов из образцовой (резервной) копии. А вот восстановление собственно данных (DBF и FPT) - это задача которая в принципе не может иметь универсального решения. Да, есть ряд наиболее распространенных повреждений (например, несоответсвие записей в счетчике и их реального количества). Для них можно написать фиксеры. Но в общем случае восставновление решается ручным просмотром содержимого файла на низком уровне. Поскольку заранее просто невозможно предсказать, как именно будет повреждена область данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 10:42:02 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Владимир, большое спасибо, вот как раз третий вариант хотелось бы порассматривать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 11:31:31 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
ОК, хорошо, пусть даже мы решили, что последние введенные в битую таблицу данные восстановлению не подлежат, но у нас есть вчерашняя копия таблицы. Но на битой таблице автоинкремент, плюс она связана (с ограничениями целостности) с другими таблицами, в которых уже насоздавали ссылок на убитые данные. И как практически правильнее это восстанавливать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 11:35:28 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
для восстановления таблицы нужен эксклюзивный доступ если он есть то вам хватит этого тока проверте код c validate set validate to 3 alter table mytable add column nn n(1) alter table mytable drop column nn set validate to 0 Если нет эксклюзивного доступа то решения я не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 11:45:59 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Эксклюзивный доступ, конечно, есть, а как же без него ;-) Немного не понял, а что, собственно, делает Ваш пример, leaf? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 11:50:24 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
UrriОК, хорошо, пусть даже мы решили, что последние введенные в битую таблицу данные восстановлению не подлежат, но у нас есть вчерашняя копия таблицы. Но на битой таблице автоинкремент, плюс она связана (с ограничениями целостности) с другими таблицами, в которых уже насоздавали ссылок на убитые данные. И как практически правильнее это восстанавливать? Да при чем здесь автоинкремент и наложенные ограничения! Это вообще дело десятое. Представь, что у тебя есть комплекс таблиц вообще никак между собой не связанные в контейнере базы данных. Каждое значение поля ты формируешь в самом приложении путем прямой модификации (ну, как в DOS-приложении). И что ты будешь делать если "слетит" одна таблица? Либо просто восстановишь резервную копию на вчерашний день, либо будет очень много ручной работы. Невозможно что-то здесь автоматизировать. Абсолютно все то же самое и для контейнера базы данных с автоинкрементом. Поднять резервную копию, либо куча ручной работы с предварительным отключением как самого автоинкремента, так и наложенных связей и ограничений. А есть гарантия, что слетела только одна таблица? Разумеется нет. А сколько времени потребует ручное восстановление? В зависимости от сложности базы данных и степени повреждения от пары минут, до пары дней. Т.е. по сути, для достаточно сложных баз данных выбора вообще нет. Только восстановление из резервной копии. В сложных системах дешевле ввести все данные заново, чем ждать пару дней, пока кто-то вручную восстановит потерянные данные (причем еще далеко не факт, что восстановит!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 11:51:16 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Ок, Владимир, т.е. Ваше мнение - "померла так померла", и если уж восстанавливаем табличку на утро, то и всю базу восстанавливаем вместе с ней. А мне вот пользователей бывает жалко. Представим, что в битой таблице пропало всего 2 записи (правда, автосчетчик накрутили на 3), зато другой отдел успел к моменту сбоя понавводить 342 заказа на продажу по 10 позиций в каждом. К тому же, по идее, я приблизительно представляю, что навводили в сбоившую таблицу за сегодняшний день (у меня даже журнальчик ведется соответствующий - и он не грохнулся). Таким образом, моя задача - взять вчерашнюю таблицу, ввести в нее 2 пропавшие записи (значения некоторых из полей, в том числе ключевых, я знаю из таблички-журнала), накрутить счетчик, как положено (посмотреть для этого в другие таблички на предмет FK), положить ее вместо битой и переиндексировать в Exclusive. И все? Ничего не упустил, случаем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 12:02:04 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Кстати, специально для хаятелей FoxPro сообщаю, что рассматриваю гипотетическую ситуацию, которая только может произойти, но реально не происходила ни разу (у меня, по крайней мере) ;-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 12:10:21 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
Пропустил, причем много чего. -) Документ - это не одна запись в одной таблице. Обычно это комплекс, связанных между собой таблиц. Есть гарантия, что побилась только одна таблица? -) Есть гарантия, что побились только 2 записи? Т.е., если сбой произошел, то надо проверять ВСЮ базу данных. ВЕСЬ комплекс таблиц. Ты сейчас вот здесь вот эти 2 записи подправишь, а через пол-года выясниться, что оказываеьтся слетели данные еще где-то в другой таблице. А как реально можно проверить корректность ВСЕЙ базы данных. По большому счету - никак! Ну, а если ты так уж уверен, что повреждения носили чисто локальный характер, то пожалуйста, исправляй. Что именно надо подправить выясниться по мере исправления. Подкручивать счетчик автоинкремента нет никакой необходимости. Надо будет просто изменить тип поля на обычный Integer для внесения изменений (автоинкрементные поля невозможно модифицировать), а потом восстановить Integer (AutoIncrement) со старыми настройками. Или править код записи на низком уровне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 12:22:15 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
2Urri а что собственно делает? Восстанавливает таблицу. Можно так же сделать выборку из таблицы и уронить на место таблицы-родителя. Можно так же привести в соответствие количество записей указаное в заголовке и реально существующее.Но у Вас интерес праздный, а у нас есть такая проблема. Кстати, специально для хаятелей FoxPro сообщаю, что рассматриваю гипотетическую ситуацию, которая только может произойти, но реально не происходила ни разу (у меня, по крайней мере) ;-))) Почему-то вспомнился Джеймс Бонд (never say never) У меня тоже не было и сейчас нет, но вот перешли на девятку и у людей которые рядом со мной теперь есть такие проблемы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 12:31:16 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
leafset validate to 3 Sorry, если я туплю - праздники, однако... :-) Это чё за команда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 13:06:28 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
автордля восстановления таблицы нужен эксклюзивный доступ если он есть то вам хватит этого тока проверте код 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 - дает сообщение об ошибке! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 13:32:56 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
2Redrik У меня тоже были выходные поэтому торможу я конечно SET TABLEVALIDATE TO 0 просто вариант отпал и не используется пошли через селект да и проблема не у меня 2ArDo забавно неужели так просто счас проверим если отработает, пришлю виртуальное пиво но кажеться оно ругалось на внесение записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 13:49:05 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
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 терь открываеться ура :) сенкс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 13:53:00 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Спасибо!!! leaf А как ты сделал таблицу с такой ошибкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 14:36:06 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
ну во-первых сделал не я причем с любой стороны не я ( программа не моя) Во-вторых нужна версия фокса не ниже восьмой, так как именно в восьмой версии возобновили или ужесточили контроль за целостностью таблицы в-третьих ошибку пытаемся отловить пока без результатно причем лезет на всех таблицах даже где трансакций нет. Короче отовсюду. Ну что же будем давить пока не найдем причину А возникла как я уже говорил когда перешли на девятую версию с седьмой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 14:55:44 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
А я как то на 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" . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 20:23:27 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
2qwertyqwerty интересно к чему Вы это ? Всё не так уж запущено, хотя всё относительно. Нашлась ошибочка долго держаться открытые трансакции(плохой стиль). Но я говорил уже писал это не я Хотя возможно я бы наваял еще хуже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2005, 10:31:59 |
|
||
|
Восстановление таблиц ???
|
|||
|---|---|---|---|
|
#18+
2leaf - это вопрос : : На сколько стабильнее обработка неисправностей DBC в 8-е и 9-е? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2005, 11:32:15 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33124020&tid=1594033]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
196ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 562ms |

| 0 / 0 |
