Comandos DBCC SHRINKFILE e SHRINKDATABASE podem não funcionar devido a escassamente preenchido texto, ntext ou colunas de imagem

Traduções deste artigo Traduções deste artigo
ID do artigo: 324432 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Os comandos DBCC SHRINKFILE e DBCC SHRINKDATABASE não irão mover dados e reduzir o tamanho do arquivo se o valor EstimatedPages for igual ao valor de MinimumSize é relatado quando o comando é concluído. Devido a consultas de modificação de dados em tabelas com tipos de dados (BLOB) grande objeto binário ( texto , ntext , imagem ), é possível ter várias extensões uniformes alocadas escassamente são preenchidas com dados (por exemplo, 1 apenas de 8 páginas que os controles de extensão está alocado), que fará com que o DBCC SHRINKFILE e DBCC SHRINKDATABASE comandos para o número de EstimatedPages over-estimate e os comandos não executam as operações de redução. Normalmente, em casos onde esse comportamento é encontrado, o tamanho de um backup completo do banco de dados é até 8 vezes menor do que os tamanhos dos arquivos do banco de dados de depois de executar um DBCC SHRINKFILE nos arquivos de banco de dados.

Resolução

Se as tabelas afetadas não tiver estar continuamente online enquanto você corrigir essa situação, você pode usar qualquer uma das seguintes soluções para resolver esse problema:
  • Use uma instrução SELECT INTO para transferir a tabela inteira para uma nova tabela no mesmo banco de dados. Descartar a tabela original e, em seguida, executar uma instrução DBCC SHRINKFILE. Renomear a nova tabela ao nome da tabela original.
  • Use uma instrução SELECT INTO para transferir a tabela inteira para uma nova tabela em um banco de dados diferente. Truncar a tabela original e, em seguida, execute uma instrução DBCC SHRINKFILE. Transferir os dados de volta para a tabela original.
  • Use o programa de cópia em massa para copiar a tabela de no modo nativo. Script da tabela e, em seguida, solte a tabela existente. Execute uma instrução DBCC SHRINKFILE. Criar uma nova tabela e use o programa de cópia em massa para copiar os dados na tabela.
  • Use o DTS (Data Transformation Services) para transferir todo o banco de dados para um novo banco de dados. SQL Server 7.0 Data Transformation Services não pode transferir texto e imagem de dados maiores que 64 KB corretamente. Esse problema não se aplica para a versão SQL Server 2000 Data Transformation Services. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    257425CORRECÇÃO: Transferência de objeto DTS não transferir dados BLOB mais que 64
    Você pode procurar por colunas de texto e imagem que são maiores que 64 KB com a seguinte consulta:
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    se os dados de texto e imagem forem maiores que 64 KB, a transferência trunca os dados e não dispara qualquer erro exceto arquivos de log no DTS. Se você tiver dados de texto ou imagem maior do que 64 KB, use as informações no terceiro item de marcador para as tabelas que possuem dados texto ou imagem. Em seguida, use o DTS para o restante dos itens no banco de dados.
Se o banco de dados deve estar on-line ou o tamanho do banco de dados é muito grande para mover os dados em um arquivo externo ou outro banco de dados, você pode usar o comando DBCC SHRINKFILE com a opção EMPTYFILE. Para usar esta solução alternativa, execute estas etapas:
  1. Se você estiver executando o Microsoft SQL Server 7.0 Service Pack 3, ative sinalizadores de rastreamento 1180 e 1197.
  2. Se você executando o Microsoft SQL Server 7.0 Service Pack 3 Criar 7.00.987 ou posterior, incluindo o Service Pack 4, ative o rastreamento sinalizar 1180.
  3. Se você tiver difundir o banco de dados em vários arquivos para problemas de espaço de unidade ou motivos de desempenho, criar arquivos de 1 ou mais adicionais no banco de dados usando o comando ALTER DATABASE com um tamanho total comparável aos resultados da consulta a seguir.
    select 'size in MB'=ceiling(sum(ei.pg_alloc)/128.000), sfg.groupname
    from extentinfo ei inner join sysfiles sf on ei.[file_id] = sf.fileid and ei.[file_id] != 1
     inner join sysfilegroups sfg on sf.groupid = sfg.groupid
    group by sfg.groupname
    Observação : A consulta anterior usa a tabela que é criada pela consulta na seção "Mais informações" deste artigo. Além disso, os totais de tamanho de arquivo são divididos por grupo de arquivos.

  4. Execute uma consulta de DBCC SHRINKFILE, com a opção EMPTYFILE como o segundo parâmetro, em cada arquivo que tenha preenchido escassamente blob de extensões uniformes estão.
  5. Você pode controlar o andamento do comando DBCC SRHINKFILE criando uma ou mais tabelas com o mesmo esquema como a tabela extentinfo da seção "Mais informações" deste artigo. Em seguida, executar um "INSERT... EXEC import_extentinfo "consulta para preencher os dados para as novas tabelas. Use a seguinte consulta para analisar os resultados:
    select [file_id], 'page count'=sum(pg_alloc), 'min page'=min(page_id), 'max page'=max(page_id) from extentinfo group by [file_id]
    Além disso, você pode usar a seguinte consulta para controlar quando o comando DBCC EXTENTINFO foi executado se as tabelas começam com o mesmo padrão de letras e são criadas quase o tempo que o comando DBCC EXTENTINFO:
    select crdate, [name] from sysobjects where type = 'U' and [name] like 'extent%' order by crdate
  6. Quando a consulta de DBCC SHRINKFILE é concluída, execute um ALTER DATABASE consulta para remover os arquivos antigos do banco de dados.
  7. Você pode remover possivelmente espaço adicional executando uma consulta de DBCC SHRINKFILE com a opção TRUNCATEONLY os arquivos novos que foram criados na etapa 3.
  8. Se você estiver executando o Microsoft SQL Server 7.0, desative os sinalizadores de rastreamento ativadas na etapa 1 ou 2.

Mais Informações

Você pode executar a consulta Transact-SQL a seguir da ferramenta qualquer consulta, como o Query Analyzer, se você estiver conectado como um usuário que tem direitos sysadmin . Executar a consulta Transact-SQL no SQL Server para determinar se o comando DBCC SHRINKDATABASE e o DBCC SHRINKFILE comando não é possível reduzir arquivos devido a escassamente preenchida extensões uniformes estão BLOB.

Observação : você deve atualizar a seqüência de caracteres '< nome do banco de dados >' para o nome do banco de dados do problema e coloque o nome entre aspas simples.

use pubs
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
begin 
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10)
   )
end
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
begin
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10),
   avg_used tinyint
   )
end
go
create procedure import_extentinfo as
dbcc extentinfo('<database name>')
go
insert extentinfo exec import_extentinfo
go

select [file_id],obj_id, index_id, ext_size, 'actual extent count'=count(*), 'actual page count'=sum(pg_alloc),
 'possible extent count'=ceiling(sum(pg_alloc)*1.0/ext_size),
 'possible extents / actual extents' = (ceiling(sum(pg_alloc)*1.00/ext_size)*100.00) / count(*)
 from extentinfo where ext_size != 1 and index_id = 255
 group by [file_id],obj_id, index_id, ext_size
 having count(*)-ceiling(sum(pg_alloc)*1.0/ext_size) > 0
 order by obj_id, index_id, [file_id]
Se houver linhas de resultado da última consulta que possuem valores index_id de 255 e o extensão possível / real extensão coluna é menor que 75, esse banco de dados escassamente ter preenchido BLOB extensões e pode ser reduzido em tamanho pelos métodos descritos na seção "Resolução" deste artigo.

Observação : esta consulta depende da funcionalidade de EXTENTINFO DBCC comando. Não use o comando DBCC EXTENTINFO fora nessa situação porque a funcionalidade pode ser alterado ou até mesmo ser removida da versões futuras do Microsoft SQL Server.

Referências

Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
272220CORRECÇÃO: TEXT/IMAGE dados armazenamento espaço não recuperado corretamente
308627CORRECÇÃO: DBCC SHRINKDATABASE ou o DBCC SHRINKFILE pode expandir o banco de dados com texto ou dados de imagem

Propriedades

ID do artigo: 324432 - Última revisão: sexta-feira, 9 de dezembro de 2005 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbprb KB324432 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 324432

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com