Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / GEN_ID дает повторяющееся значение / 25 сообщений из 108, страница 1 из 5
14.05.2020, 09:38
    #39957254
delphi_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GEN_ID дает повторяющееся значение
Всем привет

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

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

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

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

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

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

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

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

а триггер есть при добавлении в таблицу, в котором срабатывает генератор? Или как используется gen_id()? Заодно и версию FB озвучьте. Может даже и скрипт добавления данных в таблицу приведёте?
...
Рейтинг: 0 / 0
14.05.2020, 10:18
    #39957268
delphi_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GEN_ID дает повторяющееся значение
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
14.05.2020, 10:20
    #39957270
delphi_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GEN_ID дает повторяющееся значение
ъъъъъ
delphi_nub,

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

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


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

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

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

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

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

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

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

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

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


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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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


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

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

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

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

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

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


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

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


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

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


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