Encolher um banco de dados abaixo do tamanho inicial


10

Eu tenho um banco de dados de desenvolvimento do SQL Server 2005 que é uma cópia de 30 GB do live. Excluímos alguns dados que não são necessários no dev, o que reduz o espaço no arquivo de dados usado para 20 GB. Portanto, temos cerca de 33% não utilizados.

Preciso recuperar o espaço, o que nos permitirá ter um segundo banco de dados de desenvolvimento no servidor (com base na versão reduzida); no entanto, não posso recuperar o espaço, fiz o seguinte:

  • O tamanho inicial do arquivo SMS2_Dataé 30 GB.

    DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)

    Seguido por

    DBCC SHRINKFILE (N'SMS2_Data' , 19500)

Sem alegria Eu tentei fazer um backup, criando um novo banco de dados com um tamanho inicial baixo e depois restaurando, sem alegria, pois o tamanho inicial é substituído. Também tentei:

ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) 

Este erro, dizendo:

Falha na modificação do arquivo. O tamanho especificado é menor que o tamanho atual.

Eu tentei o 20800 e continuei subindo até 29000 (29GB) e ele ainda não me permitirá alterá-lo.

Ter feito o psiquiatra, em seguida, mudou o modo de recuperação de e FULLpara SIMPLEtrás novamente. Sem alegria

Eu pensei que tinha a ver com alguns TEXTcampos. Temos cerca de 6 em todo o sistema. Então, como teste, larguei todos eles e, em seguida, reduzi o arquivo e ainda não havia alterações.

A única opção que resta é reimportar os dados para outro banco de dados. Isso não é prático, pois teria que ser feito no banco de dados ativo, o que traz muito risco. Captamos semi-regularmente uma cópia do banco de dados ativo e sobrescrevemos o dev / test. Temos algo como 500 mesas. Eu gostaria de uma maneira de fazer isso que não corresse o risco de exportar dados para um novo banco de dados.

Tentei mover os dados para outro arquivo e ele copiou todos, exceto 5% dos dados. Foi isso que me levou a tentar soltar todas as colunas de texto.

O servidor está no modo de compatibilidade 90, mas é o SP2. Eu já fiz as seguintes três vezes: reindexar todas as tabelas, banco de dados de backup, arquivo de redução, banco de dados de redução. Ainda sem alegria.

EXECUTE sp_spaceused retorna:

database_name   database_size   unallocated space
SMS2Tests       31453.94 MB     13903.16 MB

reserved     data         index_size   unused
16545568 KB  10602264 KB  4254360 KB   1688944 KB

Respostas:


3

Como algumas pessoas já mencionaram, você pode criar um novo banco de dados e "copiar" coisas do banco de dados antigo. Esta seria a melhor opção para você. No entanto, notei que você deseja fazê-lo regularmente. Portanto, sua melhor opção é o Redgate Data Compare e o Redgate Compare . Ambos fazem parte do pacote Redgate SqlToolbelt .

Então o que você faz:

  1. Crie um banco de dados vazio com tamanho inicial pequeno.
  2. Use o Redgate Compare para copiar a estrutura, funções etc. do banco de dados antigo
  3. Use o Redgate Data Compare para copiar dados do banco de dados antigo para o novo
  4. Você trabalha no banco de dados do desenvolvedor e, a qualquer momento, faz apenas a comparação de dados e atualiza o banco de dados regularmente, ou, se fizer alguma alteração no db, pode implantar essas alterações usando o Redgate Compare e, em seguida, o Redgate Data Compare.

O que é bom com a Comparação de Dados é que, depois de copiar esses 30 GB de dados (você pode fazê-lo começando apenas em algumas tabelas) depois de um tempo, ele precisa apenas 'recomparar' apenas algumas alterações e não 30 GB de dados. O que significa que ele causará muito menos impacto nos dois bancos de dados do que o copia normalmente.


2

Algumas possibilidades aqui.

Primeiro de tudo, você está no SQL 2005 SP3 ou posterior? Alguns relataram problemas com SHRINKFILE em versões anteriores (consulte http://www.sqlservercentral.com/Forums/Topic981292-146-6.aspx#bm985164 )

Em segundo lugar, você pode verificar se o banco de dados está definido para compatibilidade com o modo 90 e não com o modo 80? Aparentemente, isso foi um problema no SQL 2000, mas a restrição foi levantada no SQL 2005. Se o banco de dados ainda estiver definido para a compatibilidade no modo 80, isso ainda poderá ser um problema.

Em terceiro lugar, isso pode ser um problema com os dados LOB (texto, ntext, varchar (max)). Veja o excelente artigo de Paul Randall aqui

Suponho que você entenda o que o SHRINKing realmente faz e que isso possa afetar negativamente seu desempenho:

  • SHRINK funciona movendo cegamente as páginas do final do arquivo para o início
  • Como tal, ele pode fragmentar terrivelmente índices, o que pode causar problemas significativos de desempenho
  • Por ser uma operação intensiva em dados, o encolhimento pode levar um tempo significativo

Normalmente, eu recomendaria acompanhar o psiquiatra com uma reindexação completa (que recuperará parte do espaço que foi liberado), mas não parece que você é capaz de chegar a esse ponto.

Se você observar seu SPID reduzido no monitor de atividades, ele parece estar fazendo alguma coisa? (Os contadores de E / S e CPU são alterados) Ou está bloqueado? A única outra coisa em que consigo pensar é se houver outra atividade no banco de dados, bloqueando o encolhimento. Verifique se nenhum outro spids ativo está usando o banco de dados no momento.

Mudar para o modo de recuperação simples durante esse processo também é uma boa idéia, para evitar que o log cresça demais.


1

SHRINKDATABASE apenas reduzirá o banco de dados (na melhor das hipóteses) para seu MinSize, de modo que não o ajudará.

Quando você tenta reduzir o arquivo através da interface do usuário do SSMS usando os padrões, ele usa 'DBCC SHRINKFILE (N'MyDB', 0, TRUNCATEONLY) '. Esse comando apenas reduzirá o arquivo (na melhor das hipóteses) até a última extensão alocada.

Se você deseja reduzir o arquivo abaixo do MinSize, basta alterar o parâmetro DBCC SHRINKFILEde 0 para o tamanho em que deseja tentar reduzir o arquivo em MBs. Um número diferente de zero informará SHRINKFILE para reduzir o arquivo para esse tamanho, se possível. Portanto DBCC SHRINKFILE('MyDB', 300, TRUNCATEONLY), o arquivo será reduzido para 300 MB se o banco de dados tiver espaço.

Você pode ver o MinSize executando o seguinte:

DBCC TRACEON(3604)
go
DBCC PAGE('MyDB', 1, 0, 3) with tableresults
go

MinSize em MBs é calculado desta maneira: (MinSize * 8) / 1024


0

Se você realmente quer fazer isso:

  • definido para recuperar o modo para simples
  • estar ciente de: DBCC SHRINKDATABASE (MyDatabase, TRUNCATEONLY);

0

Se você tiver, digamos, 2.0003 (mb) de dados reais no banco de dados, "SIZE = 20000" seria muito pequeno. Tente com 21000 ou 25000, veja se isso funciona. (E lembre-se, 1 GB = 1024 MB.)


0

Tentar

DBCC SHRINKDATABASE (N'SMS2_Data' , 0)

Eu usei isso em um banco de dados SQL 2005 que tenho aqui e o espaço alocado para o arquivo de dados passou de 10,2 GB para 3 GB.

Fyi, esse é um processo demorado e levou pouco mais de 19 minutos para o meu banco de dados.


ps Apenas verificado e o modelo de recuperação para o meu banco de dados está definido como simples.

Isso não fez nenhuma diferença, tenho certeza de que é o mesmo que é feito através do front end.

0

Suponho que você tenha um único arquivo de banco de dados com o nome lógico SMS2_Data. Você também tem um ou mais arquivos de log de transações no banco de dados.

Você tem um desafio que não pode ser corrigido na cópia atual do banco de dados. A informação importante que você declara é que o 'tamanho original do arquivo de banco de dados é de 30 GB'. Infelizmente, este arquivo não pode ser reduzido em tamanho menor que o tamanho original.

Como você já experimentou, SHRINKDB e SHRINKFILE não estão dando o que você deseja. Esses comandos seguem a regra não pode encolher menor que o tamanho original. Portanto, você só pode reduzir um banco de dados ao tamanho original e não menor.

O backup e a restauração do banco de dados em um banco de dados menor e existente também não funciona. Quando você faz uma restauração do banco de dados, os arquivos do banco de dados são restaurados para os tamanhos dos arquivos como estavam durante o backup. E, o modelo de recuperação (simples, completo etc.) não tem relevância para esse problema.

E, um último ponto de más notícias. Você pode adicionar outros arquivos de banco de dados menores ao banco de dados, transferir todos os dados do arquivo de 30 GB e soltá-lo. Infelizmente, isso também não funcionará porque você não pode excluir o arquivo inicial do banco de dados.

Portanto, a melhor solução é copiar os dados para outro banco de dados. Você tem algumas opções aqui e talvez já esteja ciente delas. A primeira etapa é criar um novo banco de dados com um tamanho menor que o tamanho dos dados. Em seguida, você pode expandir o tamanho do banco de dados para o tamanho necessário.

Você pode considerar o SSIS como uma maneira de transferir os dados de um banco de dados para outro. Você encontrará uma tarefa de cópia de banco de dados que o ajudará. Você pode usar as seguintes etapas:

  1. Crie um novo banco de dados com um tamanho menor que o banco de dados de origem
  2. Configure o pacote SSIS com a tarefa do banco de dados de transferência. Defina a tarefa para usar a transferência online.
  3. Execute o pacote SSIS.
  4. O pacote SSIS pode alterar o tamanho do banco de dados para corresponder ao tamanho do banco de dados de origem. Reduza esse banco de dados, porque ele tem um tamanho de arquivo original menor.

Veja informações adicionais sobre a tarefa do banco de dados de transferência SSIS .


0

Algum espaço não utilizado no banco de dados é normal.
Se você tiver muitos registros grandes (digamos, cadeias longas), pode haver muito espaço não utilizado nas páginas de dados (porque um registro geralmente não é dividido entre as páginas).
Outra coisa é um fator de preenchimento - inicialmente, os índices agrupados não são criados 100% completos para evitar divisões de página (uma operação cara) nas inserções subsequentes.
Se muitos dados foram excluídos do banco de dados, o espaço anteriormente ocupado por esses dados não será recuperado automaticamente - ele permanecerá alocado para a tabela.

Tente chamar DBCC DBREINDEX (table_name, '', 100)todas as tabelas do seu banco de dados - ele reconstruirá todos os índices com fator de preenchimento de 100%, para que os dados sejam colocados da maneira mais compacta possível. Em seguida, tente reduzir o banco de dados novamente.


0

Descobri que reduzir um banco de dados do SQL Server pode ser problemático. Parece que você precisa fazer uma rotina de música e dança.

Este é o processo pelo qual eu costumo passar:

Backup Shrink database Backup Shrink log e arquivos de banco de dados separadamente. Backup Repita até que finalmente encolha.

Eu tive que fazer esse processo algumas vezes até três vezes para finalmente funcionar. Tivemos um banco de dados com mais de 68 GB de tamanho, com algo em 98% de espaço não utilizado. Passou por essa rotina de música e dança várias vezes, mas finalmente diminuiu para menos de 1 GB.


0

Eu teria tentado reduzir o tamanho inicial do arquivo mdf para 29.000 MB primeiro, depois para 28.000 detectando o golpe.

Não é razoável esperar reduzir 30% no tamanho do arquivo do banco de dados excluindo 30% dos dados.

Você pode estimar quanto espaço não utilizado em seu banco de dados,

execute sp_spaceused

no contexto do seu banco de dados (use yourdatabaename;)
Você pode postar o resultado de sua execução?


Atualização:
postei minha pergunta relacionada:


Isso não funcionou muito bem. 13903,16mb de espaço não alocado. Índice não utilizado 1688944 KB
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.