Я не совсем знаю, как сформулировать вопрос, потому что мы еще немного знаем, но я хотел бы спросить раньше, чем позже, потому что это похоже на то, что нельзя пренебрегать.
На этой неделе у нас начались проблемы с нашим сервером базы данных. Кажется, это проблема согласованности данных, и это проявляется в таймаутах даже для очень простых запросов и небольших таблиц. Мы «исправили» проблему, перезапустив сервер ранее на этой неделе, и он ушел, но теперь кажется, что он возвращается и на этот раз на более важных таблицах. Например, я только что провел расследование и смотрю на такой запрос:
SELECT * FROM table WHERE id = 1234
для конкретного идентификатора. Таблица содержит около 30 миллионов строк. Но похоже, что это происходит только для небольшой доли записей. Бьюсь об заклад, когда я перезагружаю сервер или выполняю резервное копирование и восстанавливаю базу данных на другом сервере, все будет хорошо. Но я попытаюсь.
На данный момент я бегу:
DBCC CHECKTABLE ('table', NOINDEX)
но, похоже, он будет работать вечно. Когда мы впервые столкнулись с проблемами, я проверил оскорбительную таблицу, и все было в порядке. Этот новый стол намного больше.
Некоторая справочная техническая информация:
- SQL Server 2008 R2, Windows Server 2008 R2
- AWS / EC2, m2.2xlarge, 32 ГБ ОЗУ, 4 x 1 ТБ RAID 0
- почти нет дискового ввода-вывода, кажется, что большая часть базы данных находится в памяти
- общий размер БД: 100 ГБ
Объемы ELB являются «совершенно новыми». Мы создали их на этой неделе.
Изменить: я просто использовал следующую команду:
SELECT
sqltext.TEXT,
req.session_id,
req.blocking_session_id,
req.wait_type,
req.wait_time,
req.last_wait_type,
req.wait_resource,
req.open_transaction_count,
req.transaction_id,
req.total_elapsed_time
FROM
sys.dm_exec_requests req
CROSS APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
и обнаружил, что мой запрос ожидает общей блокировки (LCK_M_S), где блокирующий сеанс ожидает другой общей блокировки, заблокированной сеансом, который не существует.
Редактировать 2: ОК, сеанс существует (я нашел его с помощью sys.dm_exec_sessions
), но сейчас он, похоже, ничего не делает.
Редактировать 3: я не могу найти ничего интересного о сессии. Я вижу, с какого веб-сервера это происходит, но не более того.
Редактировать 4: Редактировать 4: Мы обнаружили возможную ошибку в нашем коде: функция, которая не проверяла соединение с базой данных. С другой стороны, похоже, что транзакция, которую использовала функция, использовалась для правильного размещения, и в этом случае все блокировки должны были быть удалены. Это все еще не очень ясно для меня, но это, кажется, вероятная причина. Мы собираемся исправить ошибку и следить за ней.
источник