powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Violation of PRIMARY KEY constraint
19 сообщений из 19, страница 1 из 1
Violation of PRIMARY KEY constraint
    #40094017
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый.

Может у кого было, я уже не знаю куда копать.

Microsoft SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) Mar 19 2021 19:41:38 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )

Есть таблица target. На ней кластер и PK(field1 int, field2 int, field3 int, field4 int, field5 varchar(255))

Есть джоб.
Он выполняет селект, в нем парсинг и помещает данные во временную #tmp.

И финальная часть:
Код: sql
1.
2.
3.
4.
5.
6.
insert target (field1, field2, field3, field4, field5, ...)
select field1, field2, field3, field4, field5, min(), max() etc
from #tmp src
where not exists (select 1 from target tgt where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)
group by field1, field2, field3, field4, field5



И эта тривиальная конструкция когда раз в день, когда десяток раз в день выдает ошибку "Violation of PRIMARY KEY constraint 'pk_target'. Cannot insert duplicate key in object target". Джоб единственный и только он заполняет эту таблицу. Коллейт- такой же, стринга- только английские символы.
Этот сервак сейчас включили в always on кластер и с этого же момента начались эти чудеса. На пассивной ноде джоб не отрабатает.
Запихнул в catch сохранение данных из #tmp. После ошибки- в target обнаружил запись на которой происходило задвоение. Т.е. не работает "not exists (select 1 from target".
И такие ошибки появились еще других запросах. Этот самый простой и наглядный.

Какие еще могут быть идеи?
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094020
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drakest,

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @t1 table (id int, col varchar(10))
declare @t2 table (id int, col varchar(10))

insert @t1 select 1, 'qqq' union all select 2, null
insert @t2 select 1, 'qqq' union all select 2, null

select * from @t1 t1 where not exists (select top 1 1 from @t2 t2 where t1.id = t2.id and t1.col = t2.col)
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094025
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL,

в моем примере сравнение идет по PK, там нет null
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094038
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest
День добрый.

Может у кого было, я уже не знаю куда копать.

Microsoft SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) Mar 19 2021 19:41:38 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )

Есть таблица target. На ней кластер и PK(field1 int, field2 int, field3 int, field4 int, field5 varchar(255))

Есть джоб.
Он выполняет селект, в нем парсинг и помещает данные во временную #tmp.

И финальная часть:
Код: sql
1.
2.
3.
4.
5.
6.
insert target (field1, field2, field3, field4, field5, ...)
select field1, field2, field3, field4, field5, min(), max() etc
from #tmp src
where not exists (select 1 from target tgt where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)
group by field1, field2, field3, field4, field5



И эта тривиальная конструкция когда раз в день, когда десяток раз в день выдает ошибку "Violation of PRIMARY KEY constraint 'pk_target'. Cannot insert duplicate key in object target". Джоб единственный и только он заполняет эту таблицу. Коллейт- такой же, стринга- только английские символы.
Этот сервак сейчас включили в always on кластер и с этого же момента начались эти чудеса. На пассивной ноде джоб не отрабатает.
Запихнул в catch сохранение данных из #tmp. После ошибки- в target обнаружил запись на которой происходило задвоение. Т.е. не работает "not exists (select 1 from target".
И такие ошибки появились еще других запросах. Этот самый простой и наглядный.

Какие еще могут быть идеи?


Ну щас нам расскажут сказку "Т.е. не работает "not exists (select 1 from target".
Ты не понимаешь как оно работает.
Чудес не бывает.
Зато бывает параллельная вставка.

Варианты:
1.
Код: sql
1.
2.
3.
4.
5.
6.
insert target with(tablockx, holdlock) (field1, field2, field3, field4, field5, ...)
select field1, field2, field3, field4, field5, min(), max() etc
from #tmp src
group by field1, field2, field3, field4, field5
having not exists (select 1 from target tgt where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)



2.
Код: sql
1.
2.
3.
4.
ALTER TABLE target DROP CONSTRAINT [pk_target]
GO
ALTER TABLE target add PRIMARY KEY (...) WITH (IGNORE_DUP_KEY = ON);
GO
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094049
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Код: sql
1.
insert target with(tablockx, holdlock)



Зачем таблок то сразу?

xlock, rowlock на селект вполне достаточно



Код: sql
1.
2.
3.
4.
5.
6.
insert target (field1, field2, field3, field4, field5, ...)
select field1, field2, field3, field4, field5, min(), max() etc
from #tmp src
group by field1, field2, field3, field4, field5
having not exists (select 1 from target tgt with(xlock, rowlock, forceseek, holdlock)  where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094051
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
aleks222
Код: sql
1.
insert target with(tablockx, holdlock)



Зачем таблок то сразу?

xlock, rowlock на селект вполне достаточно



Код: sql
1.
2.
3.
4.
5.
6.
insert target (field1, field2, field3, field4, field5, ...)
select field1, field2, field3, field4, field5, min(), max() etc
from #tmp src
group by field1, field2, field3, field4, field5
having not exists (select 1 from target tgt with(xlock, rowlock, forceseek, holdlock)  where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)



Очень миленько так... пытаться блокировать несуществующие строки.
Сервер будет в восхищении.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094052
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Очень миленько так... пытаться блокировать несуществующие строки.


Для этого и указывается holdlock, что является синонимом SERIALIZABLE

Для несуществующих строк будет наложена range блокировка
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094055
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest,

В таком виде гарантируется отсутствие дубликатов, только на TIL serializable.
Поэтому перепишите так
Код: sql
1.
2.
not exists (select 1 from target tgt with (updlock, serializable) where tgt.field1=src.feild1 and tgt.field2=src.feild2 and tgt.field3=src.feild3 and
tgt.field4=src.feild4 and tgt.field5=src.feild5)


Либо перепишите через merge, но тоже с serializable
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094062
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
drakest,

В таком виде гарантируется отсутствие дубликатов, только на TIL serializable.


Спасибо, попробую. Но это подразумевает, что писателей все же несколько.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094069
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest,

Ну либо несколько писателей, либо дубликаты в исходных данных. Третьего не дано.
Хотя еще триггер может так гадить.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094076
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
либо дубликаты в исходных данных.


Там group by по ключу
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094114
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собрали аудит- нашелся второй писатель.
И этот второй писатель- засветился под учеткой агента который на read only ноде крутится.
Текущая RO нода- старый сервер, на след.неделе окончательный переезд будет и отключение старого. Джобы на нем не поотключали, но почему они не обламываются и выполняются на активной ноде?
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094116
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest
собрали аудит- нашелся второй писатель.
И этот второй писатель- засветился под учеткой агента который на read only ноде крутится.
Текущая RO нода- старый сервер, на след.неделе окончательный переезд будет и отключение старого. Джобы на нем не поотключали, но почему они не обламываются и выполняются на активной ноде?


Дык нефиг имя сервера явно указывать.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094302
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, кто сможет пояснить, каким образом job работающий на пассивной ноде в anways on ag умудряется работать по активной ноде?
Агенты на разных нодах под разными учетками- поэтому удалось идентифицировать автора инсертов.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094315
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest
Коллеги, кто сможет пояснить, каким образом job работающий на пассивной ноде в anways on ag умудряется работать по активной ноде?
Агенты на разных нодах под разными учетками- поэтому удалось идентифицировать автора инсертов.


1. Джоб выполняет какое-нибудь внешнее приложение или ssis пакет, и в нем указан коннект к определённой ноде, или вообще к listener-у


2. В Джобе крутится бесконечный цикл (что-то вроде while 1=1 begin --do smth waitfor ... end)

В момент переключения активной ноды AG группы SQL SERVER может не "отстрелить" коннекты, а перенести их на новую активную ноду, если эти коннекты находятся в состоянии, походящим для такого переноса.

коннект в момент waitfor ... без открытых транзакций вполне подходит для переноса.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094333
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, как-то можно отследить событие переключения?
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094360
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakest
Коллеги, кто сможет пояснить, каким образом job работающий на пассивной ноде в anways on ag умудряется работать по активной ноде?
Агенты на разных нодах под разными учетками- поэтому удалось идентифицировать автора инсертов.


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


ЗЫ. Ващето, MS SQL Agent - обычное приложение, работающее с тем источником данных, который указан в настройках.
А AlwayOn - хрень, которая должна прикидываться ОДНИМ сервером и, внутре себя, работать на активной ноде.
Медитация на эту тему ведет к неизбежному просветлению.

ЗЗЫ. Про "непрерываемый коннект" - я лучше помолчу. А то меня забанят.
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094374
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex


1. Джоб выполняет какое-нибудь внешнее приложение или ssis пакет, и в нем указан коннект к определённой ноде, или вообще к listener-у

нет, в данном случае джоб дергает хп. Она без линков, в рамках одного инстанса раз в 15минут ищет свежие данные.

msLex

2. В Джобе крутится бесконечный цикл (что-то вроде while 1=1 begin --do smth waitfor ... end)

В момент переключения активной ноды AG группы SQL SERVER может не "отстрелить" коннекты, а перенести их на новую активную ноду, если эти коннекты находятся в состоянии, походящим для такого переноса.

коннект в момент waitfor ... без открытых транзакций вполне подходит для переноса.


Теоретически, может быть в момент переключения джоб работал... Но за 2 недели уже бы и пора "протухнуть" ему.

В любом случае, спасибо за идеи
...
Рейтинг: 0 / 0
Violation of PRIMARY KEY constraint
    #40094377
drakest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Интересно, как-то можно отследить событие переключения?


Мы на новом сервере подобавляли в джобы первый шаг, чтоб они стопились на пассивной ноде.
На этом не стали, т.к. в понедельник он перестанет существовать. За что и поплатились временем
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Violation of PRIMARY KEY constraint
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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