powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / куда делся идентити?
9 сообщений из 9, страница 1 из 1
куда делся идентити?
    #32066407
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLServer 6.5(SP5a+update) на Win2000 Server rus (SP3)

Вчера, в конце рабочего дня вырубили свет. При шатдауне пауэршут не смог остановит сервис SQLServer по-нормальному.
С утра в логе системы я обнаружил сообщение:

Предыдущее завершение работы системы в 15:36:56 на 10.11.2002 было неожиданным.

И все, больше ничего подозрительного

Посмотрел логи SQLServer при загрузке, вроде ничего такого нет, откат или подтверждение транзакций, не ошибок ничего, обычный лог нормальной загрузки.

Утром случилась такая штука. Есть одно приложение-клиент работающее с базой, так вот при записи в базу вылетает ошибка на клиенте о нарушении уникальности первичного ключа. Отлавливаю трейсом запрос, нахожу табличку, смотрю вроде нормально все, идентити стоит. Пытаюсь добавить запись сам из ЕМ, но такая же фигня. Я и так и сяк, не вставляется и все, ругается на уникальность (значение ключевого поля не указываю), отключаю приращение и явно указываю значение ключевого поля, все нормально. Опять включаю автоинкремент для этой для таблицы, ни чего не вставляется. Позже выясняется, что такая фигня начинается во всех без исключения таблицах с автоинкрементом четырех рабочих баз. Но почему-то несколько баз это стихийное бедствие не коснулось вообще (??). Ну, думаю, хана мне, все стоит. Восстанавливаю на полчаса, час, два, день назад - бесполезно. Потом создаю простую табличку с автоинкрементом, все добавляется без ошибок(??) Минут через 40 опятным путем удалось установить, что после 5-6 попыток вставки ошибка не с того не с сего перестает вылетать и запись добавляется. Короче пришлось проделать это операцию (вставку удаление)для всех таблиц, где был автоинкремент. Теперь все работает. Что это было, я так и не понял. Помогите разобраться, плиз, ну не могу же я все на электриков валить! Что могло с идентити произойти!
...
Рейтинг: 0 / 0
куда делся идентити?
    #32066412
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего не закомитчились корректно транзакции за последние несколько минут, потому счетчик на таблицах не наращивал свое значение, не знаю как в 6.5, а в 7 и 2000 надо было проверить командой dbcc chekident('TableName', noreseed) если последнее значение счетчика и последнее значение столбца не совпадает, то поправить той же командой, только указать reseed.
...
Рейтинг: 0 / 0
куда делся идентити?
    #32066641
Vit.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В доке по Sybase(а MSSQL65 от него недалеко ушел)
описано, что при неудачном шатдауне в идентити-полях
образуются большие дыры по значению("gaps").Это связано с тем, что сервер кеширует блоки значений для
идентити-полей в памяти, а в какой-то системной таблице
(надо бы разобраться в какой) отмечает номер, следующий за максимальным номером в кешированном блоке. У тебя видимо произошел какой-то обратный случай, т.е. в системной таблице осталось "старое" значение,начиная с которого происходит выделение
значений для идентити-столбцов.При открытии БД сервер
считал это "старое" значение и выделил диапазон, пересекающийся с уже имеющимися в базе значениями,
поэтому и ругался на неуникальность ключа.
...
Рейтинг: 0 / 0
куда делся идентити?
    #32066700
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 Genady

нету в 6.5 такого параметра (
а что-то подобное про идентити я в BOL для 6.5 не нашел, там вообще две ссылки на него, одга для одбс, а вторая как его вкючать-отключать

4 Vit

кстати, а что за таблица, я так и думал по началу, что он там хранит эти значения, но почему тогда он все таки заработал, я ведь в таблице ничего не менял
...
Рейтинг: 0 / 0
куда делся идентити?
    #32066964
Vit.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Smile
Вот я порылся и кажись нашел.
Проверь таблицу syscolumns. В ней столбец id ссылается
на таблицу,которой этот столбец принадлежит.
Столбец name - и так все понятно. Столбец autoval
как я понял опытным путем not NULL- для столбцов с идентити(по BOL зарезевирован для внутр.целей) и содержит след.значение для идентити при окончании кешированного диапазона (hex value). Возьми первые 8 байт и конвертни в десятичное значение.У меня MSSQL7 и для пустой таблицы здесь лежит 0x01000000 =1048576 - первые 8 байт.

010000000100000003 -значение с 9-го байта -назначение
не знаю
...
Рейтинг: 0 / 0
куда делся идентити?
    #32066983
Vit.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Smile
Сорри наврал не 8, а 4 первых байта надо взять
...
Рейтинг: 0 / 0
куда делся идентити?
    #32069873
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного с опозданием не все же.

4 Genady
Ваш совет помог, просто я прохлопал параметр checkident у dbcc в BOL
Наверное потому, что был в немного шоковом состоянии в тот момент=)
Жаль, что приходится учиься на своих ошибка


4 Vit.
Ну, я вроде читал, что SQL Server (в том числе и 6.5) как раз таки не вытворяет такие штуки, т.е. при загрузке после некорректной остановки он не прибавляет к текущему идентити какое-то большое значения, для избежания нарушения уникальности. И никаких дыр в таких случаях не делает.

Может я и здесь че прохлопал, но колонки autoval в syscolumns я не нашел, а других полей, значения которых могли бы ассоциироваться с идентити при добавлении записей я не заметил. Может ты имел ввиду не 6.5?


Кто-нибудь может объяснить почему все таки слетел идентити? А зачем тогда журнал и транзакции? Раз есть dbcc checkident, значит SQL Server заранее подразумевает возникновение таких ситуаций?
...
Рейтинг: 0 / 0
куда делся идентити?
    #32070031
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз есть dbcc checkident, значит SQL Server заранее подразумевает возникновение таких ситуаций?
Это просто аварийная ситуация, у меня за 3 года работы с 7.0 было 2 таких ситуации, 1 раз слетел счетчик и 1 раз пришлось перестраивать индексы. Оба раза было как раз именно вследствие отключения питания у серверов, согласитесь, что это все таки не штатная ситуация.
...
Рейтинг: 0 / 0
куда делся идентити?
    #32070407
Vit.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Smile
Я смотрел на 7.0. В 6.5 наверное где-то в другом месте
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / куда делся идентити?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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