Конфликт блокировок одной таблицы в БД 1С 8.1 после падения и восстановления

daixiao
Дата: 19.02.2010 12:41:48
Из-за перебоев с питанием перезагрузился сервер во время работы пользователей и база данных 1С на SQL 2005 ушла в suspect. Восстановить получилось только через dbcc checkdb с allow_data_loss.
Бекапов, как всегда, в самый нужный момент не было. Времени на полное тестирование/исправление средствами самой 1С не хватило. Запустил в работу сразу после checkdb и 1с-овской проверки на физическую/логическую целостность.

Сейчас наблюдается странная штука с регистром партий товаров.
При попытке проведения/удаления документов, использующих этот регистр выдаются сообщения об ошибках навроде такого: "Конфликт блокировок при выполнении транзакции: Microsoft OLE DB Provider for SQL Server: Lock request time out period exceeded. HRESULT=80040E31, SQLSrvr: Error state=38, Severity=10, native=1222, line=1"

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

Решил, что проблема может быть в индексах.
Т.к. соответствующие таблицы регистра - _AccumReg6498 и _AccumRegTotals6518, попробовал сделать dbcc dbreindex (alter index) для каждой.
Таблица самого регистра _AccumReg6498 (~350тыс.записей) переиндексировалась за 10 минут.
А вот таблица итогов _AccumRegTotals6518 (~500тыс.записей) висит уже больше часа. В мониторе активности процесс с alter index светится в состоянии suspected.

База сейчас в работе, отключить, оттестировать нормально не могу. Нужно что-то делать с этими блокировками, а в голову уже ничего не идет.

В MS SQL практически не разбираюсь ;o) Потому, если что упустил - спрашивайте.
WarAnt
Дата: 19.02.2010 13:43:00
daixiao,

таймаут увеличьте и статистику обновите
daixiao
Дата: 19.02.2010 16:02:23
Статистику - ладно, обновлю.
А таймаут тут не причем.

Дело в том, что это не результат нормальной работы блокировок.
Сообщение об ошибке выходит даже если в базе только один пользователь, причем и в консоли 1с, и SQL видно, что соединение только одно.

Я даже сервисы и того, и другого перезапускал, все одно - даже единственное соединение с БД не может никак изменить эту таблицу, получая ошибку, приведенную выше.
daixiao
Дата: 19.02.2010 16:04:51
daixiao
...даже единственное соединение с БД не может никак изменить эту таблицу, получая ошибку, приведенную выше.

Скорее не "изменить", а "установить свою блокировку" для изменения не может.
Igor Glushaev
Дата: 19.02.2010 18:34:47
daixiao,

Без отключения 1С тут скорее всего сделать ничего не получиться...
А вот после остановки базы могу предложить два варианта:
Первый - средствами 1С делаем выгрузку и загрузку во вновь созданную базу.
Второй - проблемный индекс пересоздаем с средствами MS SQL (смотрим индекс, грохаем его и создаем по новой с тем же именем и полями)

PS: Если честно, то я бы лучше более серьезно задумался над резервным копированием...
daixiao
Дата: 19.02.2010 20:02:35
Наконец-то есть возможность остановить сервис 1С.)
Мне стало еще веселее.
Закрыл все соединения к базам. Попытался остановить сервис sql, не получилось. В процессах sqlservr.exe грузит четверть (25%, один "виртуальный" проц.) ресурсов процессора, время жизни грузящего потока (thread) - больше десяти часов (со времени прошлого рестарта службы). Убил процесс принудительно.
Запустил сервис. База постояла чуть в режиме In recovery и перешла в нормальную работу. Примерно через минуту процесс sql опять занял 25% ресурсов. 1С не запускал, база на сервере - одна, ни одно приложение соединение к скулю не инициировало. При попытке сделать детач базы сервер пишет, что:
"Detach database failed for Server '1CSERV'. (Microsoft.SqlServer.Smo)
Cannot detach the database 'UT' because it is currently in use. (Microsoft SQL Server, Error: 3703)".
При попытке сделать копию или бекап базы скуль зависает, соединение повисает в suspended.

Старый проверенный способ с выгрузкой-загрузкой я теперь уже конечно попробую. Но есть опасение, что выгрузка вылетит с ошибкой или тоже зависнет.
Что творится с базой? Как определить, что пытается сделать sql? Да и вообще, что такого можно сделать, чтоб все заработало? :)
daixiao
Дата: 19.02.2010 20:09:11
Ну точно. При попытке выгрузки с помощью 1С получаю ошибку: "Конфликт блокировок".)
daixiao
Дата: 19.02.2010 20:46:12
Оказывается блокирует GHOST CLEANUP.
Видимо натыкается на поврежденную страницу и зависает.
Указал в параметрах запуска trace-флаг 661. Вроде что-то выгружается, посмотрим, что будет.
daixiao
Дата: 19.02.2010 22:15:30
Вот от мусорщика я и поимел столько проблем. Если бы я знал о его существовании, то восстановил бы базу за какой-то час, а не за сутки.