Acabei criando um instantâneo e executando o DBCC nele.
Eu corro DBCC CHECKDB ([MyDb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, PHYSICAL_ONLY
E após 20 segundos, ele falha com um erro:
Msg 5030, Sev 16, State 12, Line 1 : The database could not be exclusively locked to perform the operation. [SQLSTATE 42000]
Msg 7926, Sev 16, State 1, Line 1 : Check statement aborted. The database could not be checked as a database snapshot could not be created and the database or table could not be locked. See Books Online for details of when this behavior is expected and what workarounds exist. Also see previous errors for more details. [SQLSTATE 42000]
O banco de dados é de 1 TB, SQL Server 2005.
Por que o DBCC precisa de um bloqueio de banco de dados exclusivo? Como posso fazer o cheque?
ADICIONADO: O DBCC é executado com êxito quando eu mato todas as conexões com o banco de dados e, em seguida, executo verificações. sp_who2 mostra usuários acessando DB a partir de servidores da web usando o provedor .Net SQLClient
O serviço do SQL Server é executado na conta do Windows, que é o administrador local.
O mais provável é que a conta do serviço SQL não tenha permissões para criar os arquivos de instantâneo necessários.
Em um banco de dados ativo, é muito improvável que o CHECKDB consiga obter o bloqueio do banco de dados X necessário para que as verificações de alocação sejam executadas, motivo pelo qual alterei o tempo limite de bloqueio para ele em apenas 20 segundos (IIRC).
Obrigado
Não tenho certeza da causa raiz que está impedindo os instantâneos que estão sendo tirados; mas você tentou executar a opção DBCC CheckDB
with Tablock
para ver se funciona? ( Livros on-line explicitamente informam tablock
option "inclui um bloqueio exclusivo de curto prazo (X) no banco de dados." ) Mas, pelo menos, ele não tira instantâneos e o DBCC CheckDB pode ser bem-sucedido desta vez com essa opção. A outra opção é que este não é um sistema crítico e você pode perder tempo; tente alterá-lo para o modo de usuário único e execute o DBCC novamente OU restaure-o em outro local e faça o DBCC se você tiver um ambiente de teste.
Seu amigo deve ser Blog de Paul Randal para todos coisas CheckDB.
Escrevi uma postagem detalhada no blog para me livrar de esse erro.
File > Disconnect Object Explorer
) File > Connect Object Explorer
) use master
(Nota: O comando Above fará com que seu banco de dados atual seja master, o que é importante antes de executarmos a seguinte seqüência de comandos.) ALTER DATABASE MyDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE MyDatabaseName SET SINGLE_USER WITH ROLLBACK AFTER 30
ALTER DATABASE MyDatabaseName SET SINGLE_USER WITH NO_WAIT
ALTER DATABASE MyDatabaseName SET MULTI_USER WITH ROLLBACK IMMEDIATE;
Agora você terminou e agora pode tentar o comando ou a operação que estava tentando executar anteriormente, o que estava causando Database could not be exclusively locked to perform the operation
error.
Às vezes, surge um problema quando o instantâneo do banco de dados oculto fica sem espaço. Como é implementado usando fluxos alternativos dos arquivos de dados existentes, o instantâneo do banco de dados consome espaço do mesmo local dos arquivos de dados existentes. Se o banco de dados que está sendo verificado tiver uma carga de trabalho de atualização pesada, mais e mais páginas serão enviadas para o instantâneo do banco de dados, fazendo com que ele cresça. Em uma situação em que os volumes que hospedam o banco de dados não têm muito espaço, isso pode significar que o instantâneo do banco de dados oculto fica sem espaço e o DBCC CHECKDB pára com um erro. Um exemplo disso é mostrado aqui (os erros podem variar dependendo do ponto exato em que o snapshot do banco de dados fica sem espaço):
Tente este link
Tags sql-server-2005 dbcc