Назад | Перейти на главную страницу

DBCC: база данных не может быть монопольно заблокирована для выполнения операции

я бегу DBCC CHECKDB ([MyDb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, PHYSICAL_ONLY

И через 20 секунд выходит из строя с ошибкой:

Msg 5030, Sev 16, State 12, Line 1: База данных не может быть монопольно заблокирована для выполнения операции. [SQLSTATE 42000]

Msg 7926, Sev 16, State 1, Line 1: Check statement aborted. Невозможно проверить базу данных, так как не удалось создать моментальный снимок базы данных и заблокировать базу данных или таблицу. См. В электронной документации подробные сведения о том, когда такое поведение ожидается и какие обходные пути существуют. Также см. Предыдущие ошибки для более подробной информации. [SQLSTATE 42000]

База данных - 1 ТБ, SQL Server 2005.

Почему DBCC нужна монопольная блокировка базы данных? Как я могу пройти проверку?

ДОБАВЛЕНО: DBCC запускается успешно, когда я убиваю все подключения к базе данных, а затем запускаю проверки. sp_who2 показывает, что пользователи получают доступ к БД с веб-серверов с помощью поставщика .Net SQLClient.

Служба SQL Server работает под учетной записью Windows, которая является локальным администратором.

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

В активной базе данных очень маловероятно, что CHECKDB сможет получить блокировку базы данных X, необходимую для запуска проверок распределения, поэтому я изменил тайм-аут блокировки, чтобы он составлял всего 20 секунд (IIRC).

Спасибо

Я не уверен в основной причине, которая мешает делать снимки; но ты пробовал бежать DBCC CheckDB с участием Tablock вариант посмотреть, работает ли? (Книги онлайн явно состояния tablock вариант "включает краткосрочную эксклюзивную (X) блокировку базы данных".) Но по крайней мере он не делает снимков, и DBCC CheckDB на этот раз может успешно использовать эту опцию. Другой вариант - это не критическая система, и вы можете позволить себе простои; попробуйте изменить его в однопользовательский режим и снова запустить DBCC ИЛИ восстановить его в другом месте и выполнить DBCC, если у вас есть тестовая среда.

Ты должен пойти к парню Блог Пола Рэндала для всего CheckDB.

Я написал подробный пост в блоге, чтобы избавиться от этой ошибки.

  1. Отключить соединение. (Для этого: File > Disconnect Object Explorer)
  2. Подключить соединение. (Для этого: File > Connect Object Explorer)
  3. Откройте окно «Новый запрос» и выполните следующую команду: use master (Примечание: приведенная выше команда сделает вашу текущую базу данных ведущей, что важно, прежде чем мы выполним следующую последовательность команд.)
  4. Скопируйте и вставьте следующую последовательность команд в окно запроса. Замените слово «MyDatabaseName» именем базы данных, к которой вы пытаетесь получить монопольный доступ.

ALTER DATABASE MyDatabaseName SET SINGLE_USER С НЕМЕДЛЕННЫМ ОТКАТОМ

ALTER DATABASE MyDatabaseName SET SINGLE_USER С ОТКАТОМ ПОСЛЕ 30

ALTER DATABASE MyDatabaseName SET SINGLE_USER WITH NO_WAIT

ALTER DATABASE MyDatabaseName SET MULTI_USER WITH ROLLBACK IMMEDIATE;

Теперь все готово, и теперь вы можете попробовать команду или операцию, которую вы пытались выполнить ранее, которая давала вам Database could not be exclusively locked to perform the operation ошибка.

В итоге я создал снимок и запустил на нем DBCC.

Иногда проблема возникает, когда в скрытом моментальном снимке базы данных заканчивается место. Поскольку он реализован с использованием альтернативных потоков существующих файлов данных, моментальный снимок базы данных занимает пространство из того же места, что и существующие файлы данных. Если проверяемая база данных имеет большую рабочую нагрузку по обновлению, все больше и больше страниц помещаются в моментальный снимок базы данных, что приводит к его увеличению. В ситуации, когда на томах, на которых размещена база данных, не так много места, это может означать, что скрытому моментальному снимку базы данных не хватает места, и DBCC CHECKDB останавливается с ошибкой. Пример этого показан здесь (ошибки могут различаться в зависимости от точной точки, в которой моментальный снимок базы данных исчерпывает пространство):

Попробуйте эту ссылку

http://sqlism.blogspot.com/2014/10/a-database-snapshot-cannot-be-created.html