Comandos DBCC SHRINKFILE e SHRINKDATABASE poderão não funcionar devido a sparsely preenchido texto, ntext ou imagem colunas

Traduções de Artigos Traduções de Artigos
Artigo: 324432 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Os comandos DBCC SHRINKFILE e DBCC SHRINKDATABASE não irão mover dados e reduzir o tamanho do ficheiro se o valor de EstimatedPages igual ao valor MinimumSize é comunicado quando o comando é concluído. Devido a consultas de modificação de dados em tabelas com tipos de dados de objectos grandes binários (BLOB) ( texto , ntext , imagem ), é possível efectuar muitas uniformes extensões atribuídas que sparsely estão preenchidas com dados (por exemplo, 1 apenas de 8 páginas que os controlos de extensão está atribuída), que fará com que o DBCC SHRINKFILE e DBCC SHRINKDATABASE comandos para o número de EstimatedPages over-estimate e os comandos não efectuam as operações de redução. Normalmente, nos casos onde este comportamento é detectado, o tamanho de uma cópia de segurança da base de dados é 8 vezes menor do que os tamanhos dos ficheiros da base de dados depois de executar DBCC SHRINKFILE nos ficheiros da base de dados.

Resolução

Se as tabelas afectadas não tem de estar online continuamente enquanto corrigir esta situação, pode utilizar qualquer uma das seguintes medidas para resolver este problema:
  • Utilize uma instrução SELECT INTO para transferir toda a tabela para uma nova tabela na mesma base de dados. Abandonar a tabela original e, em seguida, executa uma declaração DBCC SHRINKFILE. Mude o nome à nova tabela para o nome da tabela original.
  • Utilize uma instrução SELECT INTO para transferir toda a tabela para uma nova tabela numa base de dados diferente. Truncar tabela original e, em seguida, execute uma instrução DBCC SHRINKFILE. Transferir os dados novamente para a tabela original.
  • Utilize o programa de cópia em massa para copiar a tabela de no modo nativo. Script fora da tabela e, em seguida, abandonar a tabela existente. Execute uma instrução DBCC SHRINKFILE. Crie uma nova tabela e, em seguida, utilizar o programa de cópia em massa para copiar os dados novamente para a tabela.
  • Utilize Data Transformation Services (DTS) para transferir toda à base de dados para uma nova base de dados. Serviços de transformação de dados do SQL Server 7.0 não poderá transferir texto e imagem de dados mais do que 64 KB correctamente. Este problema não se aplica à versão do SQL Server 2000 do serviços de transformação de dados. Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
    257425CORRECÇÃO: DTS objecto transferência não transferir dados BLOB superior A 64
    Pode procurar colunas de texto e imagem que são maiores do que 64 KB com a seguinte consulta:
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    se os dados de texto e imagem forem superiores a 64 KB, a transferência trunca os dados e não acciona qualquer erro excepto de DTS ficheiros de registo. Se tiver texto ou imagem dados superiores a 64 KB, utilize as informações no terceiro item com marcas para as tabelas com dados de texto ou imagem. Em seguida, utilize DTS para o resto dos itens na base de dados.
Se a base de dados têm de estar online ou o tamanho da base de dados é demasiado grande para se mover os dados para um ficheiro externo ou outra base de dados, pode utilizar o comando DBCC SHRINKFILE com a opção EMPTYFILE. Para utilizar esta solução alternativa, siga estes passos:
  1. Se estiver a executar o Microsoft SQL Server 7.0 Service Pack 3, Active o rastreio sinalizadores 1180 e 1197.
  2. Se o Microsoft SQL Server 7.0 Service Pack 3 cria 7.00.987 ou posterior, incluindo o Service Pack 4, activar o rastreio sinalizar 1180.
  3. Se tiver duas a base de dados ao longo de vários ficheiros para problemas de espaço de unidade ou motivos de desempenho, criar ficheiros de 1 ou mais adicionais na base de dados utilizando o comando ALTER DATABASE com um tamanho total idêntico aos resultados da consulta seguinte.
    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
    Nota : A consulta precedente utiliza a tabela é criada a consulta na secção "Mais informação" deste artigo. Além disso, os totais de tamanho de ficheiro são divididos por filegroup.

  4. Execute uma consulta DBCC SHRINKFILE, com a opção EMPTYFILE como o segundo parâmetro, em cada ficheiro que tenha sparsely preenchida extensões uniforme blob.
  5. Pode controlar o progresso dos comandos DBCC SRHINKFILE criando uma ou mais tabelas com o mesmo esquema, a tabela extentinfo da secção "Mais informação" deste artigo. Execute um "INSERT... EXECUÇÃO import_extentinfo "consulta para povoar os dados às novas tabelas. Utilize 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, pode utilizar 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 perto da hora, 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ído, execute um ALTER DATABASE consulta para remover os ficheiros antigos da base de dados.
  7. Pode, possivelmente, remover espaço adicional, executando uma consulta de DBCC SHRINKFILE com a opção TRUNCATEONLY as novos ficheiros que foram criados no passo 3.
  8. Se estiver a executar o Microsoft SQL Server 7.0, desactive os sinalizadores de rastreio activada no passo 1 ou 2.

Mais Informação

É possível executar a seguinte consulta Transact-SQL a partir de qualquer ferramenta de consulta, como Query Analyzer, se tiver sessão iniciada como um utilizador com direitos de sysadmin . Executar a consulta Transact-SQL no SQL Server para determinar se o comando DBCC SHRINKDATABASE e o DBCC SHRINKFILE comandos não é possível diminuir ficheiros devido sparsely preenchida extensões uniformes BLOB.

Nota : É necessário actualizar a cadeia '< nome de base de dados >' para o nome da base de dados e escrever 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 visualizar linhas de resultados da última consulta que têm valores index_id de 255 e o extensão possível / real extensão coluna é menor que 75, esta base de dados ter preenchido sparsely BLOB extensões e pode ser reduzido de tamanho, os métodos descritos na secção "Resolução" deste artigo.

Nota : esta consulta depende da funcionalidade de EXTENTINFO DBCC comandos. Não utilize o comando DBCC EXTENTINFO fora nesta situação porque a funcionalidade pode ser alterada ou mesmo ser removida da futuras versões do Microsoft SQL Server.

Referências

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

Propriedades

Artigo: 324432 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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