|
|
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
SQLServer 6.5(SP5a+update) на Win2000 Server rus (SP3) Вчера, в конце рабочего дня вырубили свет. При шатдауне пауэршут не смог остановит сервис SQLServer по-нормальному. С утра в логе системы я обнаружил сообщение: Предыдущее завершение работы системы в 15:36:56 на 10.11.2002 было неожиданным. И все, больше ничего подозрительного Посмотрел логи SQLServer при загрузке, вроде ничего такого нет, откат или подтверждение транзакций, не ошибок ничего, обычный лог нормальной загрузки. Утром случилась такая штука. Есть одно приложение-клиент работающее с базой, так вот при записи в базу вылетает ошибка на клиенте о нарушении уникальности первичного ключа. Отлавливаю трейсом запрос, нахожу табличку, смотрю вроде нормально все, идентити стоит. Пытаюсь добавить запись сам из ЕМ, но такая же фигня. Я и так и сяк, не вставляется и все, ругается на уникальность (значение ключевого поля не указываю), отключаю приращение и явно указываю значение ключевого поля, все нормально. Опять включаю автоинкремент для этой для таблицы, ни чего не вставляется. Позже выясняется, что такая фигня начинается во всех без исключения таблицах с автоинкрементом четырех рабочих баз. Но почему-то несколько баз это стихийное бедствие не коснулось вообще (??). Ну, думаю, хана мне, все стоит. Восстанавливаю на полчаса, час, два, день назад - бесполезно. Потом создаю простую табличку с автоинкрементом, все добавляется без ошибок(??) Минут через 40 опятным путем удалось установить, что после 5-6 попыток вставки ошибка не с того не с сего перестает вылетать и запись добавляется. Короче пришлось проделать это операцию (вставку удаление)для всех таблиц, где был автоинкремент. Теперь все работает. Что это было, я так и не понял. Помогите разобраться, плиз, ну не могу же я все на электриков валить! Что могло с идентити произойти! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 12:38:19 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
Скорее всего не закомитчились корректно транзакции за последние несколько минут, потому счетчик на таблицах не наращивал свое значение, не знаю как в 6.5, а в 7 и 2000 надо было проверить командой dbcc chekident('TableName', noreseed) если последнее значение счетчика и последнее значение столбца не совпадает, то поправить той же командой, только указать reseed. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 12:43:00 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
В доке по Sybase(а MSSQL65 от него недалеко ушел) описано, что при неудачном шатдауне в идентити-полях образуются большие дыры по значению("gaps").Это связано с тем, что сервер кеширует блоки значений для идентити-полей в памяти, а в какой-то системной таблице (надо бы разобраться в какой) отмечает номер, следующий за максимальным номером в кешированном блоке. У тебя видимо произошел какой-то обратный случай, т.е. в системной таблице осталось "старое" значение,начиная с которого происходит выделение значений для идентити-столбцов.При открытии БД сервер считал это "старое" значение и выделил диапазон, пересекающийся с уже имеющимися в базе значениями, поэтому и ругался на неуникальность ключа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 18:17:05 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
4 Genady нету в 6.5 такого параметра ( а что-то подобное про идентити я в BOL для 6.5 не нашел, там вообще две ссылки на него, одга для одбс, а вторая как его вкючать-отключать 4 Vit кстати, а что за таблица, я так и думал по началу, что он там хранит эти значения, но почему тогда он все таки заработал, я ведь в таблице ничего не менял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 23:41:58 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
2 Smile Вот я порылся и кажись нашел. Проверь таблицу syscolumns. В ней столбец id ссылается на таблицу,которой этот столбец принадлежит. Столбец name - и так все понятно. Столбец autoval как я понял опытным путем not NULL- для столбцов с идентити(по BOL зарезевирован для внутр.целей) и содержит след.значение для идентити при окончании кешированного диапазона (hex value). Возьми первые 8 байт и конвертни в десятичное значение.У меня MSSQL7 и для пустой таблицы здесь лежит 0x01000000 =1048576 - первые 8 байт. 010000000100000003 -значение с 9-го байта -назначение не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 14:33:39 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
2 Smile Сорри наврал не 8, а 4 первых байта надо взять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 14:58:41 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
Немного с опозданием не все же. 4 Genady Ваш совет помог, просто я прохлопал параметр checkident у dbcc в BOL Наверное потому, что был в немного шоковом состоянии в тот момент=) Жаль, что приходится учиься на своих ошибка 4 Vit. Ну, я вроде читал, что SQL Server (в том числе и 6.5) как раз таки не вытворяет такие штуки, т.е. при загрузке после некорректной остановки он не прибавляет к текущему идентити какое-то большое значения, для избежания нарушения уникальности. И никаких дыр в таких случаях не делает. Может я и здесь че прохлопал, но колонки autoval в syscolumns я не нашел, а других полей, значения которых могли бы ассоциироваться с идентити при добавлении записей я не заметил. Может ты имел ввиду не 6.5? Кто-нибудь может объяснить почему все таки слетел идентити? А зачем тогда журнал и транзакции? Раз есть dbcc checkident, значит SQL Server заранее подразумевает возникновение таких ситуаций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 23:39:52 |
|
||
|
куда делся идентити?
|
|||
|---|---|---|---|
|
#18+
Раз есть dbcc checkident, значит SQL Server заранее подразумевает возникновение таких ситуаций? Это просто аварийная ситуация, у меня за 3 года работы с 7.0 было 2 таких ситуации, 1 раз слетел счетчик и 1 раз пришлось перестраивать индексы. Оба раза было как раз именно вследствие отключения питания у серверов, согласитесь, что это все таки не штатная ситуация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 11:53:45 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32066412&tid=1818639]: |
0ms |
get settings: |
4ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 181ms |
| total: | 278ms |

| 0 / 0 |
