powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / GEN_ID дает повторяющееся значение
25 сообщений из 108, страница 1 из 5
GEN_ID дает повторяющееся значение
    #39957254
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

Волей судеб вынужден на работе поддерживать работоспособность старой программы (вообще-то их порядка 10), написанной на Delphi с использованием БД Firebird.
Я в обоих системах имею очень поверхностные знания.

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

Подключений к БД много. Работает с БД не один клиент (порядка 10 разных программ) и есть системы, которые работают 24/7 - фиксируют в журнале разные операции, которые происходят постоянно. Т.е. определить какие клиенты и чьи запросы приводят к такой ситуации - не могу.

Вручную я конечно генератор переопределяю и все опять запускается, но мне такое решение не нравится

Очень надеюсь, что знатоки на форуме смогут мне подсказать - куда копать...

Заранее всем спасибо.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957261
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
delphi_nub,

- проверить, не сломана ли структура базы;
- посмотреть в процедурах/триггерах работу с генераторами.

Наверное, всё.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957262
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub,

а триггер есть при добавлении в таблицу, в котором срабатывает генератор? Или как используется gen_id()? Заодно и версию FB озвучьте. Может даже и скрипт добавления данных в таблицу приведёте?
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957268
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI
delphi_nub,

а триггер есть при добавлении в таблицу, в котором срабатывает генератор? Или как используется gen_id()? Заодно и версию FB озвучьте. Может даже и скрипт добавления данных в таблицу приведёте?


Триггер есть. И все работало до недавнего времени

Версия 2.0 - знаю, что устаревшая, но миграцию боюсь выполнять, т.к. если что-то сломается я сам назад не откачу и поломки не сделаю (собственник нанял аутсерсеров - они разрабатывают новую систему, а эту мне нужно просто поддерживать, чтобы дожили до внедрения новой)

Сам триггер:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SET TERM ^ ;

CREATE OR ALTER TRIGGER DB_LOG_BI FOR DB_LOG
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_DB_LOG_ID,1);
END
^

SET TERM ; ^
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957270
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
delphi_nub,

- проверить, не сломана ли структура базы;
- посмотреть в процедурах/триггерах работу с генераторами.

Наверное, всё.


Каждую неделю делаю бекап/ресторе (это прописано в протоколе обслуживания) - вычищаю, если возникли какие-то артефакты.

Как еще проверить структуру?

Ну и триггер в 99.99% случаев работает правильно, но раз в несколько суток может выбирать ошибку. Руками обновляю генератор и все опять работает в штатном режиме.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957272
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub
Всем привет

Волей судеб вынужден на работе поддерживать работоспособность старой программы (вообще-то их порядка 10), написанной на Delphi с использованием БД Firebird.
Я в обоих системах имею очень поверхностные знания.

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

Подключений к БД много. Работает с БД не один клиент (порядка 10 разных программ) и есть системы, которые работают 24/7 - фиксируют в журнале разные операции, которые происходят постоянно. Т.е. определить какие клиенты и чьи запросы приводят к такой ситуации - не могу.

Вручную я конечно генератор переопределяю и все опять запускается, но мне такое решение не нравится

Очень надеюсь, что знатоки на форуме смогут мне подсказать - куда копать...

Заранее всем спасибо.


Forced write включено?
Были записи о падении службы сервера?
Внеплановые перезагрузки?

Довольно часто встречается при регулярном нажатии кнопки ресет на сервере.
Иногда умирают и индексы PK/FK. Мы лечим переносом данных в чистую эталонную БД.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957274
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pastor


Forced write включено?
Были записи о падении службы сервера?
Внеплановые перезагрузки?

Довольно часто встречается при регулярном нажатии кнопки ресет на сервере.
Иногда умирают и индексы PK/FK. Мы лечим переносом данных в чистую эталонную БД.


Сейчас погуглю, что это за Forced write

Внеплановые перезагрузки возможно бывали (не могу сейчас точно определить)

Но точно бывали принудительные "обрывы" подключений путем удаления всех клиентских процессов - это админы зачем-то сделали. Это могло повлиять?

Можно подробней про перенос данных в чистую БД? Т.е. это не ресторе/бекап, а какой-то отдельный процесс?
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957278
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub,

Извлекаешь метаданные в скрипт, создаешь пустую БД под новым именем. Потом из старой БД переливаешь данные в новую. Через dump/pump...

База большая?
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957280
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster, а чем restore/backup не подходит? Он же вроде делает также

База порядка 33 Гб. Восстановление из архива идет порядка 4 часов.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957283
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Взял статистику по БД:
автор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 включен
может еще что-то нужно посмотреть?
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957309
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub

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

Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи?
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957314
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI

Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи?


Я тоже думаю, что генератор должен работать безусловно. Но что-то мешает. Надеюсь, что мой вопрос увидят люди, разбирающиеся во внутренних процессах сервера.

По поводу непустого значние - восстановление работы с таблицей возникает только после ручного исправления генератора. Т.е. это не ситуация, когда идентификтор уже приходит в записи.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957317
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего, без привлечения разработчиков задачу не решить.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957320
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub
KreatorXXI

Надо проверить вот этот момент. Значение генератора не может быть меньше, если правильно срабатывает Ваш триггер. Даже если вставка не прошла, значение генератора всё равно изменяется (вроде так, гуру подправят). Может быть уже ID не нулевой при вставке записи?


Я тоже думаю, что генератор должен работать безусловно. Но что-то мешает. Надеюсь, что мой вопрос увидят люди, разбирающиеся во внутренних процессах сервера.

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


страница генератора не сбрасывается на диск.
если FW точно включен - то где-то в кешах ос, контроллеров и пр. теряется.

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

PS. о. если вместе с серваком стоит еще какая-нибудь джава- то происходило все что угодно, поле отжора всех сокетов, хэндллов или памяти.
миннимум два раза на такое соседство нарывались
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957336
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub,

пробуйте не в боевом режиме, на копии. Добавляете одну запись из своей программы, смотрите результат. И т.д.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957341
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI
delphi_nub,

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


Все работает на рабочей БД. Сотни записей добавляются нормально, но в какой-то момент сбоит.
На тестовой БД и в "штучном" запуске такое не ловится - мне не удавалось никак поломать генератор. Думаю, что там максимально все надежно сделано.

А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957348
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nubв генераторе записано значение, которое существенно меньше последнего добавленного ключа

Сколько это твоё "существенно"? В штуках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957349
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nub

А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы.


а что там проверять? ставишь монитор ресурсов и смотришь.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957355
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nubСам триггер:

При таком триггере получить задвоение - обычное дело если кто-то вставляет записи с
готовым ID. Найти его не так уж и трудно, достаточно добавить протоколирование таких
случаев в ELSE ветку, вопрос только в твоей квалификации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957360
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

1. В штуках? Ну несколько сотен разница может быть - я не вычисляю разницу, но она есть
2. Еще раз повторю - для сотен строк все работает отлично.

Чтобы не ходить по кругу - вставка в эту таблицу протокола происходит из хранимой процедуры, которая вызывается из других тригеров других таблицы.
В самой хранимой процедуре только одна ветка, где и происходит INSERT

Т.е. нет "нескольких" источников данных для этой таблицы
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957361
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pastor
delphi_nub

А вот идею pastor с системными накладками нужно проверять - уже направил админам запросы.


а что там проверять? ставишь монитор ресурсов и смотришь.


У нас есть отдельная группа сис. админов, которые занимаются системными вопросами (серверов чуть больше 20)
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957367
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delphi_nubТ.е. нет "нескольких" источников данных для этой таблицы

Это ты так думаешь.

Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и
соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например,
доступ к БД по сети или расширение .gdb у файла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957382
delphi_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

delphi_nubТ.е. нет "нескольких" источников данных для этой таблицы

Это ты так думаешь.

Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и
соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например,
доступ к БД по сети или расширение .gdb у файла.


1. Ошибка возникает при записи в разные таблицы со стороны клиентских систем. Ошибка валится только в таблице логирования.
2. Я руками меняю генератор
3. Со стороны клиентских систем перестают лезть ошибки
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957386
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Если бы страница генераторов не записалась на диск при резком рестарте или крэше, то и
соответствующая транзакция бы обломилась и была откачена. Тут что-то другое. Например,
доступ к БД по сети или расширение .gdb у файла.


Генераторы, транзакции - не вижу связи.
...
Рейтинг: 0 / 0
GEN_ID дает повторяющееся значение
    #39957389
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastorне вижу связи.

Попробуй включить логику: при коммите грязные страницы из кэша сбрасываются на диск,
включая страницу генераторов. Генераторы работают исключительно на увеличение. Чтобы
возникла описанная ситуация, вставленные данные должны записаться на диск, а генератор -
нет. В каком случае это возможно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 1 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / GEN_ID дает повторяющееся значение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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