Para que serve
O DBCC é um comando do servidor SQL que verifica a integridade do banco de dados com a possibilidade de correção ou não.
Muitas vezes quando ocorre um erro de integridade no sql server ele continua funcionando 'aparentemente perfeitamente'
porque o erro não é muitas vezes percebido nem pelo próprio SQL e se for percebido ele anota o erro no sistema para
que o administrador tome providências mas o serviço SQL Server continua funcionando, muitas vezes, sem que ninguém
perceba. Contudo quanto mais tempo demorarmos para corrigir o erro menor a chance de recuperar do erro.
No SQL muitas das funcionalidades são feitas umas apontando para outras. Por exemplo, as páginas de dados são apontadas
inicialmente pela definição da tabela e depois cada página aponta para sua antecessora e a sua sucessora. O erro
ocorre quando por uma falha esse 'apontamento' está errado, ou seja, por exemplo, a página apontada ( cluster do disco )
sequer é uma página de dados SQL.
A manutenção que este comando pode dar é pequena e só serve para pequenos erros de disco.
Ele gera um arquivo de LOG com as mensagens sobre as verificações efetuadas. Portanto ao final de um DBCC o analista precisará procurar pelas mensagens
de erro no seu final e, em caso de erro, tomar as devidas providências para seu conserto.
Note que quando um banco de dados estiver corrompido a última coisa que o sql server fará é deixar a tabela indisponível.
Portanto nem sempre uma tabela DISPONÍVEL é obrigatóriamente uma tabela ÍNTEGRA, perfeita.
Ele consegue verificar a estrutura dos arquivos, procurar erros ou inconsistências na estrutura do servidor SQL. Caso o erro seja relativamente
pequeno ele pode corrigir o erro e salvar muito trabalho seu. Senão, provavelmente, você terá que recorrer ao restore de um backup.
Pontos a observar
Como ele verifica a estrutura dos dados do servidor SQL ele é pesado e exige que seja executado em horários de pouca ou nenhuma alteração no banco
de dados porque qualquer alteração ele precisaria reiniciar o processo de verificação.
Portanto, ele sempre causa um grande impacto na performance e por esse motivo deve ser feito ou off-line ou em horários mais tranquilos.
Nas versões anteriores do SQL Server - DBCC significava "Database Consistency Checker", agora tem outros nomes mas as mesmas funcionalidades se
é que novas não foram incorporadas a ele.
Os DBCCs que você deve conhecer
Verificando todos os bancos de dados da instância
--exec isp_CheckServerForCorruption
Create Procedure isp_CheckServerForCorruption
AS
Begin
Declare @DBName sysname,@Message varchar(255)
Declare curDatabases cursor
for select [name] from master..sysdatabases
Open curDatabases
fetch next from curDatabases into @DBName
While @@FETCH_STATUS = 0 Begin
Set @Message = '*****BEGIN Processing ' + @DBNAME + '********'
print @Message
declare @SQL varchar(255)
Set @SQL = 'DBCC CHECKDB(' + @DBName + ') with PHYSICAL_ONLY'
EXEC (@SQL)
Set @Message = '*****END Processing ' + @DBNAME + '********'
print @Message
fetch next from curDatabases into @DBName
End
Close curDatabases
Deallocate curDatabases
End
Compactando um banco de dados
Sabemos que o SQL Server pode expandir os bancos de dados caso seja necessário e haja espaço em disco.
Contudo quando ele comprime o espaço ocupado quando um grande número de dados é eliminado de um banco de dados ?
Resposta: Nunca. O SQL Server NUNCA comprime o banco de dados e o motivo é simples, é um processo muito pesado e quando é executado deixa a tabela fora do ar,
com acesso restrito a leitura no máximo.
Existe até uma opção de auto-shrink ( auto - compactação ) da tabela ou banco de dados mas não é ativada porque é muito pesada, carrega demais as tarefas
de manutenção do servidor.
USE Banco_Dados
GO
DBCC SHRINKFILE(Banco_Dados_log, 1)
BACKUP LOG Banco_Dados WITH TRUNCATE_ONLY
DBCC SHRINKFILE(Banco_Dados_log, 1)
GO
Reparando banco de dados admitindo possível perda de dados
Nas opções de reparo de banco de dados temos 2 opções : Uma sem perda de dados e outra com possível perda de dados. Primeiro a gente tenta a sem perda de dados
e se não conseguir corrigir o problema a gente parte para a segunda solução : com perda de dados.
Eu mesmo já restaurei tabelas corrompidas dando um select para obter os dados até um certo ponto ( que é até o ponto que a tabela estava corrompida ) e dei
um outro select com a opção 'DESC' para pegar do fim ao inicio ( que seria o ponto de corrupção da tabela). Com isto consegui recuperar todos os dados
de uma tabela corrompida.
ALTER DATABASE Banco_Dados
SET single_user WITH ROLLBACK IMMEDIATE;
go
DBCC checkdb ('Banco_Dados', repair_allow_data_loss);
go
Reparando banco de dados
Neste caso estaremos reparando o banco de dados sem perda de dados. Se for possível o DBCC fará isso.
--RECONSTROI_BASE
exec sp_detach_db INFO_FATURAMENTO
exec sp_resetstatus INFO_FATURAMENTO
DBCC DBRECOVER (INFO_FATURAMENTO, ignoreerrors)
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
GO
BEGIN TRANSACTION
UPDATE sysdatabases SET status = 32768 WHERE name=' INFO_FATURAMENTO'
COMMIT TRANSACTION
GO
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
GO
--Reconstroi o log
DBCC REBUILD_LOG(' TAB_FATURAMENTO','E:\MSSQL\Data\INFO_FATURAMENTO_Log_new.LDF')
DBCC CHECKDB('INFO_FATURAMENTO')
EXEC sp_dboption 'INFO_FATURAMENTO','dbo use only', false
GO
EXEC sp_dboption 'INFO_FATURAMENTO','single user', true
GO
DBCC CHECKDB('INFO_FATURAMENTO', REPAIR_FAST)
DBCC CHECKDB('INFO_FATURAMENTO', REPAIR_ALLOW_DATA_LOSS)
EXEC sp_dboption 'INFO_FATURAMENTO','single user', false
--testando recuperação
use INFO_FATURAMENTO
select * from TAB_FATURAMENTO
Desframentando os índices das bases de dados-Reconstruindo os indices
Dentro das atividades diárias de manutenção do servidor além do DBCC das bases de dados é recomendado desfragmentar a base de dados para melhorar a performance
de acesso aos seus dados.
--Re-indexes the specified database
CREATE PROCEDURE usp_DefragDatabase
-- Não usaremos sysname porque seu tamanho é insuficiente.
-- sysname possui 128 caracteres e por isso usaremos ele.
@dbname nvarchar(256)
AS
BEGIN
-- Sempre coloque o nome da base de dados entre colchetes
DECLARE @quoteddbname nvarchar(256)
set @quoteddbname = quotename( @dbname )
EXEC('
USE '+ @quoteddbname +'
DECLARE @sTableName sysname
DECLARE PKMS_Tables CURSOR LOCAL FOR
select table_name from information_schema.tables
where table_type = ''base table'' order by 1
OPEN PKMS_Tables
FETCH NEXT FROM PKMS_Tables INTO @sTableName
WHILE @@FETCH_STATUS = 0
BEGIN
select @sTablename = quotename(@sTablename, ''[]'')
EXEC('' DBCC DBREINDEX ( ''+@sTableName+'') WITH NO_INFOMSGS'')
FETCH NEXT FROM PKMS_Tables INTO @sTableName
END
CLOSE PKMS_Tables')
END
GO
DBCC - Comandos Não Documentados
O DBCC está em constante evolução e por esse motivo há muitos recursos que ainda não foram documentados. Sendo assim, em caso de necessidade
você poderá utilizar os recursos abaixo para resolver os problemas dos bancos de dados.
Lembre-se que os comandos DBCC podem afetar o desempenho do sistema e / ou forçar bloqueios no nível da tabela.
Não há garantia de que esses comandos permanecerão disponíveis ou mesmo que funcionarão em qualquer versão futura do SQL Server porque ainda estão
em fase experimental de utilização. Alguns podem continuar, outros desaparecerão para dar lugar a um melhor e alguns desaparecerão porque
outro melhor foi colocado em seu lugar.
DBCC activecursors [(spid)]
DBCC addextendedproc (function_name, dll_name)
DBCC addinstance (objectname, instancename)
DBCC adduserobject (name)
DBCC auditevent (eventclass, eventsubclass, success, loginname, rolename, dbusername, loginid)
DBCC autopilot (typeid, dbid, tabid, indid, pages [,flag])
DBCC balancefactor (variance_percent)
DBCC bufcount [(number_of_buffers)]
DBCC buffer ( {'dbname' | dbid} [, objid [, number [, printopt={0|1|2} ] [, dirty | io | kept | rlock | ioerr | hashed ]]])
DBCC bytes ( startaddress, length )
DBCC cachestats
DBCC callfulltext
DBCC checkdbts (dbid, newTimestamp)]
DBCC checkprimaryfile ( {'FileName'} [, opt={0|1|2|3} ])
DBCC cacheprofile [( {actionid} [, bucketid])
DBCC clearspacecaches ('database_name'|database_id, 'table_name'|table_id, 'index_name'|index_id)
DBCC collectstats (on | off)
DBCC config
DBCC cursorstats ([spid [,'clear']])
DBCC dbinfo [('dbname')]
DBCC dbrecover (dbname [, IgnoreErrors])
DBCC dbreindexall (db_name/db_id, type_bitmap)
DBCC dbrepair ('dbname', DROPDB [, NOINIT])
DBCC dbtable [({'dbname' | dbid})]
DBCC debugbreak
DBCC deleteinstance (objectname, instancename)
DBCC des [( {'dbname' | dbid} [, {'objname' | objid} ])]
DBCC detachdb [( 'dbname' )]
DBCC dropextendedproc (function_name)
DBCC dropuserobject ('object_name')
DBCC dumptrigger ({'BREAK', {0 | 1}} | 'DISPLAY' | {'SET', exception_number} | {'CLEAR', exception_number})
DBCC errorlog
DBCC extentinfo [({'database_name'| dbid | 0} [,{'table_name' | table_id} [, {'index_name' | index_id | -1}]])]
DBCC fileheader [( {'dbname' | dbid} [, fileid])
DBCC fixallocation [({'ADD' | 'REMOVE'}, {'PAGE' | 'SINGLEPAGE' | 'EXTENT' | 'MIXEDEXTENT'} , filenum, pagenum [, objectid, indid])
DBCC flush ('data' | 'log', dbid)
DBCC flushprocindb (database)
DBCC freeze_io (db)
DBCC getvalue (name)
DBCC icecapquery ('dbname', stored_proc_name [, #_times_to_icecap (-1 infinite, 0 turns off)])
Use 'dbcc icecapquery (printlist)' to see list of SP's to profile.
Use 'dbcc icecapquery (icecapall)' to profile all SP's.
DBCC incrementinstance (objectname, countername, instancename, value)
DBCC ind ( { 'dbname' | dbid }, { 'objname' | objid }, { indid | 0 | -1 | -2 } )
DBCC invalidate_textptr (textptr)
DBCC invalidate_textptr_objid (objid)
DBCC iotrace ( { 'dbname' | dbid | 0 | -1 } , { fileid | 0 }, bufsize, [ { numIOs | -1 } [, { timeout (sec) | -1 } [, printopt={ 0 | 1 }]]] )
DBCC latch ( address [, 'owners'] [, 'stackdumps'])
DBCC lock ([{'DUMPTABLE' | 'DUMPSTATS' | 'RESETSTATS' | 'HASH'}] | [{'STALLREPORTTHESHOLD', stallthreshold}])
DBCC lockobjectschema ('object_name')
DBCC log ([dbid[,{0|1|2|3|4}[,['lsn','[0x]x:y:z']|['numrecs',num]|['xdesid','x:y'] | ['extent','x:y']|['pageid','x:y']|['objid',{x,'y'}]|['logrecs', {'lop'|op}...]|['output',x,['filename','x']]...]]])
DBCC loginfo [({'database_name' | dbid})]
DBCC matview ({'PERSIST' | 'ENDPERSIST' | 'FREE' | 'USE' | 'ENDUSE'})
DBCC memobjlist [(memory object)]
DBCC memorymap
DBCC memorystatus
DBCC memospy
DBCC memusage ([IDS | NAMES], [Number of rows to output])
DBCC monitorevents ('sink' [, 'filter-expression'])
DBCC newalloc - please use checkalloc instead
DBCC no_textptr (table_id , max_inline)
DBCC page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ][, cache={0|1} ])
DBCC perflog
DBCC perfmon
DBCC pglinkage (dbid, startfile, startpg, number, printopt={0|1|2} , targetfile, targetpg, order={1|0})
DBCC procbuf [({'dbname' | dbid}[, {'objname' | objid} [, nbufs[, printopt = { 0 | 1 } ]]] )]
DBCC prtipage (dbid, objid, indexid [, [{{level, 0} | {filenum, pagenum}}] [,printopt]])
DBCC pss [(uid[, spid[, printopt = { 1 | 0 }]] )]
DBCC readpage ({ dbid, 'dbname' }, fileid, pageid , formatstr [, printopt = { 0 | 1} ])
DBCC rebuild_log (dbname [, filename])
DBCC renamecolumn (object_name, old_name, new_name)
DBCC resource
DBCC row_lock (dbid, tableid, set) - Not Needed
DBCC ruleoff ({ rulenum | rulestring } [, { rulenum | rulestring } ]+)
DBCC ruleon ( rulenum | rulestring } [, { rulenum | rulestring } ]+)
DBCC setcpuweight (weight)
DBCC setinstance (objectname, countername, instancename, value)
DBCC setioweight (weight)
DBCC showdbaffinity
DBCC showfilestats [(file_num)]
DBCC showoffrules
DBCC showonrules
DBCC showtableaffinity (table)
DBCC showtext ('dbname', {textpointer | {fileid, pageid, slotid[,option]}})
DBCC showweights
DBCC sqlmgrstats
DBCC stackdump [( {uid[, spid[, ecid]} | {threadId, 'THREADID'}] )]
DBCC tab ( dbid, objid )
DBCC tape_control {'query' | 'release'}[,('\\.\tape')]
DBCC tec [( uid[, spid[, ecid]] )]
DBCC textall [({'database_name'|database_id}[, 'FULL' | FAST] )]
DBCC textalloc ({'table_name'|table_id}[, 'FULL' | FAST])
DBCC thaw_io (db)
DBCC upgradedb (db)
DBCC usagegovernor (command, value)
DBCC useplan [(number_of_plan)]
DBCC wakeup (spid)
DBCC writepage ({ dbid, 'dbname' }, fileid, pageid, offset, length, data)