я бегу 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.
Я написал подробный пост в блоге, чтобы избавиться от этой ошибки.
File > Disconnect Object Explorer
)File > Connect Object Explorer
)use master
(Примечание: приведенная выше команда сделает вашу текущую базу данных ведущей, что важно, прежде чем мы выполним следующую последовательность команд.)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