Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Улет индекса / 21 сообщений из 21, страница 1 из 1
14.07.2007, 09:53
    #34658908
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Всем привет!

Такая вот проблемка... В течение некоторого времени были проблемы с сервером и при входе в программу (программа локально на компе, база на сервере) появлялось сообщение "запись находится вне заданного диапазона" или что-то такое. Как я понял при анализе ситуации - это слетал индексный файл. После переиндексации все восстанавливалось. Но это обнаруживалось только при входе в программу при открытии индексированного файла.
Вопрос.
Техника у нас не очень надежная, так вот есть ли возможность в процессе работы (не выходя/входя в программу) отслеживать такую ситуацию?
Кстати, раньше я просто переиндексировал систему (не reindex, а просто переиндексация по новой). После этого перед переиндексацией я стал удалять индексные файлы. И пока, тьфу-тьфу, работает. Здесь может быть животное порыто?
...
Рейтинг: 0 / 0
14.07.2007, 10:54
    #34658934
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
1. Если индексы создаются заново, то их лучше предварительно удалить DELETE TAG ALL, т.к. без этого предыдущий (замененный) индекс остается в индексном файле, но не используется (мусор вобщем).
2. По максимуму отказаться от монопольного открытия таблиц, т.к. при вылете клиента изменяющего что-то монопольно в таблице индекс почти всегда портится, а иногда и таблица.
3. Если есть возможность надо сделать ежедневную индексацию. Например по заданию на сервере по ночам, или если сервер на ночь выключается, то при включении.
...
Рейтинг: 0 / 0
14.07.2007, 11:35
    #34658952
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Сорри, что не совсем в тему... Вот тут мелькнула фраза "DELETE TAG ALL"...
А не попадалось ли кому-нибудь в ответ на это "INDEX TAG NOT FOUND"?
Не могу въехать - что за фигня?!
Причем на одной из машин... Какие настройки???
...
Рейтинг: 0 / 0
14.07.2007, 11:43
    #34658959
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
2DimaT

на 1. Теперь я просто удаляю индексные файлы.

на 2. Монопольного доступа на таблицы ни у кого нет. Дается только для переиндексации, базе никто не сидит.

на 3. Так и сделано. Каждое утро, тот кто первый запускает программу, автоматом попадает на переиндексацию. При этом создается на время переиндексации временный файл, наличие которого пресекает вход другим пользователям. После переиндексации он удаляется.

НО.В том-то и загвоздка, что я боюсь слета индекса в процессе работы и того, что не удастся это вовремя обнаружить! Ведь тогда может быть катастрофа - не работать поиск или, что хуже работать неправильно!
...
Рейтинг: 0 / 0
14.07.2007, 12:38
    #34658997
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
RedrikСорри, что не совсем в тему... Вот тут мелькнула фраза "DELETE TAG ALL"...
А не попадалось ли кому-нибудь в ответ на это "INDEX TAG NOT FOUND"?
Не могу въехать - что за фигня?!
Причем на одной из машин... Какие настройки???
Вероятно на других машинах в эту часть программы не попадают или индекс от локальной таблицы.
Варианты возникновения:
USE ... order MyOrder (set order to MyOrder, seek ... order MyOrder и т.п.) - при несуществующем тэге MyOrder, или если индексный файл не открыт. Включи в проекте debuginfo и сохраняй в лог где конкретно ошибка происходит, а потом код смотри что не так.

StandD...
НО.В том-то и загвоздка, что я боюсь слета индекса в процессе работы и того, что не удастся это вовремя обнаружить! Ведь тогда может быть катастрофа - не работать поиск или, что хуже работать неправильно!
Тогда сделай какую-нибудь систему контроля корректного выхода. Например объект где в Init() - добавление записи в таблицу активных пользователей, установка флага активности и ее блокировка (при вылете блокировка снимается автоматом), в Destroy() снятие флага и снятие блокировки записи. И проверку - блокировки нет, а флаг есть значит пользователь вышел некорректно, возможна порча индексов
При запуске проги создается объект, желательно с private datasession (чтобы случайно таблицу не закрыть в процессе работы), проверяется наличие некорректных выходов - в случае наличия - сообщение пользователю "Надо индексировать". При нормальном выходе (даже при прерывании по ошибке в коде) объект уничтожается и снимает флаг активности, а при зависании компа или пропадании сетки флаг активности останется.
...
Рейтинг: 0 / 0
14.07.2007, 12:44
    #34659005
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
2DimaT

В принципе у меня создается таблица активных пользователей, которые попадают в нее при входе и удаляются при корректном выходе. Т.о. если пользователь неактивен,а запись о нем есть - это признак некорректного выхода и намек на необходимость переиндексации.
Но это при вылете пользователя из программы. Но ведь возможен вариант невылета, но угробливания индекса. Вот что меня смущает.
...
Рейтинг: 0 / 0
14.07.2007, 12:58
    #34659016
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandD... Но ведь возможен вариант невылета, но угробливания индекса. Вот что меня смущает. Например? Средствами VFP испортить индексы невозможно, фокс сам следит за их целостностью, за исключением одной ситуации: индекс не структурный (имя файла CDX не совпадает с именем DBF), таблица открывается без индекса и изменяется.
...
Рейтинг: 0 / 0
14.07.2007, 13:01
    #34659017
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Dima T StandD... Но ведь возможен вариант невылета, но угробливания индекса. Вот что меня смущает. Например? Средствами VFP испортить индексы невозможно, фокс сам следит за их целостностью, за исключением одной ситуации: индекс не структурный (имя файла CDX не совпадает с именем DBF), таблица открывается без индекса и изменяется.

А вот это уже интересно... Дело в том, что имена индексных файлов у меня не совпадают с именами таблиц! Насколько это плохо? И второе - насчет изменения таблицы при отключенном индексе - надо проверить, не мой ли косяк!
Спасибо!
...
Рейтинг: 0 / 0
14.07.2007, 13:05
    #34659020
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandD... Дело в том, что имена индексных файлов у меня не совпадают с именами таблиц! Насколько это плохо?Плохо только тем что надо следить чтобы индексы всегда открывались. А чем не устроили одноименные индексы?
...
Рейтинг: 0 / 0
14.07.2007, 13:11
    #34659024
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Dima T StandD... Дело в том, что имена индексных файлов у меня не совпадают с именами таблиц! Насколько это плохо?Плохо только тем что надо следить чтобы индексы всегда открывались. А чем не устроили одноименные индексы?

Открываются... А одноименные не делаю черт его знает почему. Когда-то что-то навеяло. Теперь всегда индексный файл именую как filedbf+"i". Традиция, блин...
...
Рейтинг: 0 / 0
14.07.2007, 13:16
    #34659028
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Если отказался от структурных индексов только из-за проблем с индексированием при серьезном слете индексов, то это лечится пропуском ошибок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
on error do localerr with ERROR(), MESSAGE(), LINENO(), PROGRAM()
private plWasError
local lcPath, lcFile, lnSc
lcPath = addbs(justpath(SYS( 2014 , 'rees.dbc')))
for lnSc =  1  to  10 
	clear
	plWasError = .f.
	? 'Проход № ' + astr(lnSc)
	if lnSc =  2  && Второй проход, значит проблемы. Удаляем индексы.
		close data all
		lcFile = lcPath + 'rees.dcx'
		delete file &lcFile
		lcFile = lcPath + '*.cdx'
		delete file (lcFile)
		use rees.dbc excl
	endif

	close data all
	? "Контейнер базы данных"
	open database rees excl
	validate database
	pack database

	? "Таблица REPORT"
	use report excl
	if used('report')
		delete tag all
		pack
		index on name tag name
	endif

	...

	if !plWasError && Ошибок не было. Выходим.
		exit
	endif
endfor

close data all
if plWasError && Ошибки не исправлены
	?
	? '!!! ОБНАРУЖЕНЫ НЕИСПРАВИМЫЕ ОШИБКИ !!!'
	inkey( 0 )
endif

proc localerr
para err,x1,x2,x3
if err= 1557  .or. err= 1705 
	clear
	close data all
	messagebox("Не могу проиндексировать."+chr( 13 )+"Вероятно работает кто-то еще.", 0 ,"ОШИБКА")
	return to master
endif
? 'error'
plWasError = .t.
return
...
Рейтинг: 0 / 0
14.07.2007, 13:34
    #34659042
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Спасибо, пробую разобраться.
...
Рейтинг: 0 / 0
14.07.2007, 14:17
    #34659078
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandD... Дело в том, что имена индексных файлов у меня не совпадают с именами таблиц! Насколько это плохо? Еще один подводный камень в данной ситуации - использование команд SQL (SELECT, UPDATE, INSERT, DELETE) приводит к автоматическому открытию таблицы (если она не открыта ранее) и индексы в твоем случае не откроются, т.е. SELECT - будет тормозить, а UPDATE, INSERT, DELETE приведут к необходимости индексации.
...
Рейтинг: 0 / 0
14.07.2007, 17:16
    #34659206
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Понял, приму к сведению!
...
Рейтинг: 0 / 0
16.07.2007, 10:55
    #34660275
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandDТехника у нас не очень надежная, так вот есть ли возможность в процессе работы (не выходя/входя в программу) отслеживать такую ситуацию?
Пробовал технику, рекомендуемую на UT. Проблемы с индексами иногда обнаруживались, иногда нет. Мой частный вывод - автоматизировать данный процесс нельзя. Можно только немного "уменьшить" вероятность его появления методами описанными выше - ежедневным удалением и пересозданием индекса.

P.S. Причина, по которой у нас возникала пробема - часть таблиц открывалась на изменение в FPW2.6 а часть в VFP 9.1 c буферизацией. Отсюда и получался "развал" индекса (то есть неправильное построение ветки индекса), потому как FPW2.6 и более поздние версии FoxPro имеют отличия в построении b-trees...

В общем этот bug вроде как был уже исправлен в VFP 9.1... Но многие фирмы продолжают использовать FPW2.6...
...
Рейтинг: 0 / 0
16.07.2007, 11:05
    #34660311
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
2 Sergey Ch

Спасибо за информацию. Индексы уже давно утром убиваю и создаю. В общем-то, что-то вроде нащупал. В программе ведется протокол действий пользователей (где-то по 4-5 тыс. записей в день). Так вот по времени в протоколе локализовал один компьютер, на котором сразу после переиндексации вошли в программу и индексы слетели через несколько минут (в это время на других компах программа не была запущена). Нашел на нем вирус, убил. Пока тихо. Возможно ли разрушение индекса вирусом?
...
Рейтинг: 0 / 0
16.07.2007, 12:56
    #34660803
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandD... Пока тихо. Возможно ли разрушение индекса вирусом?
Теоретически - да, практически - маловероятно, почитай описание вируса, я такого ни разу не видел, да и смысла портить индексы у вирусописателя нет, только если какой шизанутый враг dbf-а писал.

А кроме лечения вируса никакие изменения не проходили? exe обновил? локально что-нибудь снес и поновой записал? неверно это помогло.
...
Рейтинг: 0 / 0
16.07.2007, 13:08
    #34660845
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Dima TТеоретически - да, практически - маловероятно, почитай описание вируса, я такого ни разу не видел, да и смысла портить индексы у вирусописателя нет, только если какой шизанутый враг dbf-а писал.

А кроме лечения вируса никакие изменения не проходили? exe обновил? локально что-нибудь снес и поновой записал? неверно это помогло.

Да нет, ничего не менял... То-то и беспокоит. А насчет врага dbf-a - это да, это круто! ж-)
...
Рейтинг: 0 / 0
16.07.2007, 13:11
    #34660859
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
StandD2 Sergey Ch
Возможно ли разрушение индекса вирусом?
Весьма возможно. Если вирус контролирует наиболее часто открываемые файлы и мешает правильному построению дерева индекса (причина аналогичная указанная мной выше).
...
Рейтинг: 0 / 0
06.11.2007, 13:28
    #34918672
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Dima T RedrikСорри, что не совсем в тему... Вот тут мелькнула фраза "DELETE TAG ALL"...
А не попадалось ли кому-нибудь в ответ на это "INDEX TAG NOT FOUND"?
Не могу въехать - что за фигня?!
Причем на одной из машин... Какие настройки???
Вероятно на других машинах в эту часть программы не попадают или индекс от локальной таблицы.
Варианты возникновения:
USE ... order MyOrder (set order to MyOrder, seek ... order MyOrder и т.п.) - при несуществующем тэге MyOrder, или если индексный файл не открыт. Включи в проекте debuginfo и сохраняй в лог где конкретно ошибка происходит, а потом код смотри что не так.

Прозевал ответ... :-(
"Другие машины" - это не насчет сети и т.п. Это просто копия на другой комп - софт исключительно локальный!
Индексирую и после пары операций - DELETE TAG ALL, а в ответ - INDEX TAG NOT FOUND!
Если дать ему DELETE TAG QQQ (т.е. указать конкретное имя) - без проблем!
И это только на одном компьютере и только на VFP7 - "рядом" есть VFP9 и на нем никаких ругательств...
...
Рейтинг: 0 / 0
06.11.2007, 14:24
    #34918930
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улет индекса
Redrik Dima T RedrikСорри, что не совсем в тему... Вот тут мелькнула фраза "DELETE TAG ALL"...
А не попадалось ли кому-нибудь в ответ на это "INDEX TAG NOT FOUND"?
Не могу въехать - что за фигня?!
Причем на одной из машин... Какие настройки???
Вероятно на других машинах в эту часть программы не попадают или индекс от локальной таблицы.
Варианты возникновения:
USE ... order MyOrder (set order to MyOrder, seek ... order MyOrder и т.п.) - при несуществующем тэге MyOrder, или если индексный файл не открыт. Включи в проекте debuginfo и сохраняй в лог где конкретно ошибка происходит, а потом код смотри что не так.

Прозевал ответ... :-(
"Другие машины" - это не насчет сети и т.п. Это просто копия на другой комп - софт исключительно локальный!
Индексирую и после пары операций - DELETE TAG ALL, а в ответ - INDEX TAG NOT FOUND!
Если дать ему DELETE TAG QQQ (т.е. указать конкретное имя) - без проблем!
И это только на одном компьютере и только на VFP7 - "рядом" есть VFP9 и на нем никаких ругательств... Т.е. на другом компе работает - копируешь на этот и ошибка начинается? А если эту с ошибкой на другой комп?
Может в контейнере БД что-то съезжает? смотри мой самплес выше - я ж не просто так 10 проходов с игнорированием ошибок делаю. Их там столько разных вылазит, что обрабатывать замучишься.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Улет индекса / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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