|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Всем привет Волей судеб вынужден на работе поддерживать работоспособность старой программы (вообще-то их порядка 10), написанной на Delphi с использованием БД Firebird. Я в обоих системах имею очень поверхностные знания. Недавно столкнулся с новой проблемой. При массовых вставках в некоторые таблицы стали выдаваться ошибки на ограничении по первичному ключу. В ходе анализа выяснилось, что по какой-то причине, в генераторе записано значение, которое существенно меньше последнего добавленного ключа и при новой вставке, естественно, появляется задвоение. Найти разработчиков не удалось (уволились и старые контакты уже не актуальны) - приходится самому разбираться. Подключений к БД много. Работает с БД не один клиент (порядка 10 разных программ) и есть системы, которые работают 24/7 - фиксируют в журнале разные операции, которые происходят постоянно. Т.е. определить какие клиенты и чьи запросы приводят к такой ситуации - не могу. Вручную я конечно генератор переопределяю и все опять запускается, но мне такое решение не нравится Очень надеюсь, что знатоки на форуме смогут мне подсказать - куда копать... Заранее всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 09:38 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub, - проверить, не сломана ли структура базы; - посмотреть в процедурах/триггерах работу с генераторами. Наверное, всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 09:57 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub, а триггер есть при добавлении в таблицу, в котором срабатывает генератор? Или как используется gen_id()? Заодно и версию FB озвучьте. Может даже и скрипт добавления данных в таблицу приведёте? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 09:58 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
KreatorXXI delphi_nub, а триггер есть при добавлении в таблицу, в котором срабатывает генератор? Или как используется gen_id()? Заодно и версию FB озвучьте. Может даже и скрипт добавления данных в таблицу приведёте? Триггер есть. И все работало до недавнего времени Версия 2.0 - знаю, что устаревшая, но миграцию боюсь выполнять, т.к. если что-то сломается я сам назад не откачу и поломки не сделаю (собственник нанял аутсерсеров - они разрабатывают новую систему, а эту мне нужно просто поддерживать, чтобы дожили до внедрения новой) Сам триггер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:18 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
ъъъъъ delphi_nub, - проверить, не сломана ли структура базы; - посмотреть в процедурах/триггерах работу с генераторами. Наверное, всё. Каждую неделю делаю бекап/ресторе (это прописано в протоколе обслуживания) - вычищаю, если возникли какие-то артефакты. Как еще проверить структуру? Ну и триггер в 99.99% случаев работает правильно, но раз в несколько суток может выбирать ошибку. Руками обновляю генератор и все опять работает в штатном режиме. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:20 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub Всем привет Волей судеб вынужден на работе поддерживать работоспособность старой программы (вообще-то их порядка 10), написанной на Delphi с использованием БД Firebird. Я в обоих системах имею очень поверхностные знания. Недавно столкнулся с новой проблемой. При массовых вставках в некоторые таблицы стали выдаваться ошибки на ограничении по первичному ключу. В ходе анализа выяснилось, что по какой-то причине, в генераторе записано значение, которое существенно меньше последнего добавленного ключа и при новой вставке, естественно, появляется задвоение. Найти разработчиков не удалось (уволились и старые контакты уже не актуальны) - приходится самому разбираться. Подключений к БД много. Работает с БД не один клиент (порядка 10 разных программ) и есть системы, которые работают 24/7 - фиксируют в журнале разные операции, которые происходят постоянно. Т.е. определить какие клиенты и чьи запросы приводят к такой ситуации - не могу. Вручную я конечно генератор переопределяю и все опять запускается, но мне такое решение не нравится Очень надеюсь, что знатоки на форуме смогут мне подсказать - куда копать... Заранее всем спасибо. Forced write включено? Были записи о падении службы сервера? Внеплановые перезагрузки? Довольно часто встречается при регулярном нажатии кнопки ресет на сервере. Иногда умирают и индексы PK/FK. Мы лечим переносом данных в чистую эталонную БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:29 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
pastor Forced write включено? Были записи о падении службы сервера? Внеплановые перезагрузки? Довольно часто встречается при регулярном нажатии кнопки ресет на сервере. Иногда умирают и индексы PK/FK. Мы лечим переносом данных в чистую эталонную БД. Сейчас погуглю, что это за Forced write Внеплановые перезагрузки возможно бывали (не могу сейчас точно определить) Но точно бывали принудительные "обрывы" подключений путем удаления всех клиентских процессов - это админы зачем-то сделали. Это могло повлиять? Можно подробней про перенос данных в чистую БД? Т.е. это не ресторе/бекап, а какой-то отдельный процесс? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:41 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub, Извлекаешь метаданные в скрипт, создаешь пустую БД под новым именем. Потом из старой БД переливаешь данные в новую. Через dump/pump... База большая? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:49 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
DarkMaster, а чем restore/backup не подходит? Он же вроде делает также База порядка 33 Гб. Восстановление из архива идет порядка 4 часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:52 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Взял статистику по БД: авторDatabase header page information: Flags 0 Checksum 12345 Generation 24626070 Page size 16384 ODS version 11.1 Oldest transaction 24580554 Oldest active 24580555 Oldest snapshot 24580555 Next transaction 24582829 Bumped transaction 1 Sequence number 0 Next attachment ID 43227 Implementation ID 16 Shadow count 0 Page buffers 2048 Next header page 0 Database dialect 1 Creation date May 9, 2020 14:22:06 Attributes force write Variable header data: Sweep interval: 0 *END* Force Write включен может еще что-то нужно посмотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 10:57 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub В ходе анализа выяснилось, что по какой-то причине, в генераторе записано значение, которое существенно меньше последнего добавленного ключа и при новой вставке, естественно, появляется задвоение. Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 11:23 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
KreatorXXI Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи? Я тоже думаю, что генератор должен работать безусловно. Но что-то мешает. Надеюсь, что мой вопрос увидят люди, разбирающиеся во внутренних процессах сервера. По поводу непустого значние - восстановление работы с таблицей возникает только после ручного исправления генератора. Т.е. это не ситуация, когда идентификтор уже приходит в записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 11:31 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Скорее всего, без привлечения разработчиков задачу не решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 11:32 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub KreatorXXI Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи? Я тоже думаю, что генератор должен работать безусловно. Но что-то мешает. Надеюсь, что мой вопрос увидят люди, разбирающиеся во внутренних процессах сервера. По поводу непустого значние - восстановление работы с таблицей возникает только после ручного исправления генератора. Т.е. это не ситуация, когда идентификтор уже приходит в записи. страница генератора не сбрасывается на диск. если FW точно включен - то где-то в кешах ос, контроллеров и пр. теряется. при обрывах такого быть не может, только при ресетах. хотя, что там было в 2.0, уже не помню. PS. о. если вместе с серваком стоит еще какая-нибудь джава- то происходило все что угодно, поле отжора всех сокетов, хэндллов или памяти. миннимум два раза на такое соседство нарывались ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 11:35 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub, пробуйте не в боевом режиме, на копии. Добавляете одну запись из своей программы, смотрите результат. И т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:04 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
KreatorXXI delphi_nub, пробуйте не в боевом режиме, на копии. Добавляете одну запись из своей программы, смотрите результат. И т.д. Все работает на рабочей БД. Сотни записей добавляются нормально, но в какой-то момент сбоит. На тестовой БД и в "штучном" запуске такое не ловится - мне не удавалось никак поломать генератор. Думаю, что там максимально все надежно сделано. А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:11 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nubв генераторе записано значение, которое существенно меньше последнего добавленного ключа Сколько это твоё "существенно"? В штуках. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:15 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nub А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы. а что там проверять? ставишь монитор ресурсов и смотришь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:16 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nubСам триггер: При таком триггере получить задвоение - обычное дело если кто-то вставляет записи с готовым ID. Найти его не так уж и трудно, достаточно добавить протоколирование таких случаев в ELSE ветку, вопрос только в твоей квалификации. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:20 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, 1. В штуках? Ну несколько сотен разница может быть - я не вычисляю разницу, но она есть 2. Еще раз повторю - для сотен строк все работает отлично. Чтобы не ходить по кругу - вставка в эту таблицу протокола происходит из хранимой процедуры, которая вызывается из других тригеров других таблицы. В самой хранимой процедуре только одна ветка, где и происходит INSERT Т.е. нет "нескольких" источников данных для этой таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:32 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
pastor delphi_nub А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы. а что там проверять? ставишь монитор ресурсов и смотришь. У нас есть отдельная группа сис. админов, которые занимаются системными вопросами (серверов чуть больше 20) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:34 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
delphi_nubТ.е. нет "нескольких" источников данных для этой таблицы Это ты так думаешь. Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например, доступ к БД по сети или расширение .gdb у файла. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 12:42 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov delphi_nubТ.е. нет "нескольких" источников данных для этой таблицы Это ты так думаешь. Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например, доступ к БД по сети или расширение .gdb у файла. 1. Ошибка возникает при записи в разные таблицы со стороны клиентских систем. Ошибка валится только в таблице логирования. 2. Я руками меняю генератор 3. Со стороны клиентских систем перестают лезть ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 13:22 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например, доступ к БД по сети или расширение .gdb у файла. Генераторы, транзакции - не вижу связи. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 13:26 |
|
GEN_ID дает повторяющееся значение
|
|||
---|---|---|---|
#18+
pastorне вижу связи. Попробуй включить логику: при коммите грязные страницы из кэша сбрасываются на диск, включая страницу генераторов. Генераторы работают исключительно на увеличение. Чтобы возникла описанная ситуация, вставленные данные должны записаться на диск, а генератор - нет. В каком случае это возможно? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2020, 13:31 |
|
|
start [/forum/topic.php?fid=40&msg=39957355&tid=1560352]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 184ms |
0 / 0 |