Como encolho a minha base de dados do servidor SQL?

Tenho uma base de dados de aproximadamente 1,9 Gb de tamanho, e o MSDE2000 não permite que o DBs exceda 2 Gb

Preciso encolher este DB (e muitos outros como este em vários locais de clientes).

Encontrei e apaguei muitos milhares de registos que são considerados desnecessários.: estes registos representam uma grande percentagem de algumas das principais (maiores) tabelas da Base de dados. Portanto, é razoável assumir que muito espaço deve agora ser recuperável.

Então agora eu ... é preciso encolher o cadáver para explicar os registos em falta.

  • eu executo {[[0]}...... Sem efeito.
  • Já tentei as várias instalações de Psiquiatria fornecidas no MSSMS.... Ainda sem efeito. Fiz um backup da base de dados e restaurei-a... Ainda sem efeito.

Ainda 1,9 Gb

Porquê?

Qualquer que seja o procedimento que encontre, tem de ser reproduzido numa máquina cliente com acesso a nada além de OSql ou similar.

Author: fthiella, 2009-01-13

15 answers

ALTER DATABASE MyDatabase SET RECOVERY SIMPLE

GO

DBCC SHRINKFILE (MyDatabase_Log, 5)

GO

ALTER DATABASE MyDatabase SET RECOVERY FULL

GO
 87
Author: Dan Herbert, 2011-01-20 16:30:39
Isto pode parecer bizarro, mas funcionou para mim e eu escrevi um programa C# para automatizar isto.

Passo 1: truncar o diário de operações (recuar apenas o diário de operações, activando a opção para remover as transacções inactivas)

Passo 2: Executar um encolhimento de banco de dados, movendo todas as páginas para o início dos arquivos

Passo 3: truncar o diário de operações de novo, à medida que o PASSO 2 adiciona entradas de log

Passo 4: Volte a analisar uma base de dados.

O meu código despojado, que usa a biblioteca DMO SQL, é a seguinte:

SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_NoTruncate);
SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_Default);
 10
Author: Bork Blatt, 2009-01-13 15:16:15
É uma pergunta antiga, mas acabei de a fazer. A resposta realmente curta e correta já é dada e tem o maior número de votos. É assim que se encolhe um diário de operações, e esse foi provavelmente o problema das operações. E quando o diário de operações está fora de controle, muitas vezes precisa ser encolhido para trás, mas cuidado deve ser tomado para evitar futuras situações de um diário crescendo fora de controle. Esta pergunta sobre dba.se isso explica. Basicamente, não deixes. ele começa que grande em primeiro lugar através de um modelo de recuperação adequado, manutenção de log de transação, gerenciamento de transação, etc.

Mas a maior questão na minha mente ao ler esta pergunta sobre encolher o ficheiro de dados (ou mesmo o ficheiro de registo) é porquê?E que coisas más acontecem quando tentamos?Parece que as operações de encolhimento foram feitas. Neste caso, faz sentido , porque as edições MSDE / Express estão limitadas ao tamanho máximo de DB. Mas a resposta certa pode ser olhar para a versão certa para suas necessidades. E se você tropeçar nesta pergunta procurando encolher sua base de dados de produção e esta não é a razão pela qual, você deve perguntar a si mesmo o porquê?Pergunta:

Não quero que alguém procure na web por "como encolher uma base de dados" e pense que é uma coisa fixe ou aceitável.

Encolhimento de arquivos de dados é uma tarefa especial que deve ser reservada para ocasiões especiais. Considere isso quando você encolhe um base de dados, você está efetivamente fragmentando seus índices. Considere que quando você encolhe um banco de dados você está tirando o espaço livre que um banco de dados pode algum dia crescer de volta - efetivamente desperdiçando seu tempo e incorrer no desempenho de uma operação de encolher apenas para ver o DB crescer novamente.

[[1]eu escrevi sobre este conceito em vários posts de blogs sobre encolhimento de bases de dados. Este chamado "não toques nesse botão de encolher" vem-me à cabeça primeiro. Eu falo sobre esses conceitos delineado aqui-mas também o conceito de" direita-dimensionamento " seu banco de dados. É muito melhor decidir qual o tamanho do seu banco de dados precisa ser, planejar para o crescimento futuro e alocá-lo a essa quantidade. Com a Inicialização instantânea de arquivo disponível no servidor sql 2005 e além para arquivos de dados, o custo dos growths é menor - mas eu ainda prefiro ter uma aplicação inicial adequada - e eu estou muito menos assustado de espaço branco em um banco de dados do que eu estou de encolhimento em geral, sem nenhum pensamento em primeiro lugar. :)
 7
Author: Mike Walsh, 2017-04-13 12:42:39

DBCC SHRINKDATABASE funciona para mim, mas esta é a sua sintaxe completa:

DBCC SHRINKDATABASE ( database_name, [target_percent], [truncate] )

Onde target_percent é a percentagem desejada de espaço livre deixada no ficheiro da base de dados depois de a base de dados ter sido encolhida.

E truncate o parâmetro pode ser:

NOTRUNCATE

Faz com que o espaço de arquivo livre seja mantido nos arquivos da base de dados. Se não for especificado, o espaço de arquivo livre é liberado para o sistema operacional.

TRUNCATEONLY

Faz com que qualquer espaço não utilizado nos ficheiros de dados seja divulgado ao sistema operativo e encolhe o arquivo até a última extensão alocada, reduzindo o tamanho do arquivo sem mover quaisquer dados. Nenhuma tentativa é feita para realocar linhas para páginas não alocadas. o target_ percent é ignorado quando apenas é usado o truncado.

...e sim não_one está certo, encolher a base de dados não é uma boa prática porque, por exemplo:

Encolher em arquivos de dados são excelentes maneiras de introduzir uma fragmentação lógica significativa, porque ele move páginas do final da Gama alocada de um arquivo de banco de dados para algures na frente do ficheiro...

A base de dados encolhida pode ter muitas consequências na base de dados, servidor.... pensa muito antes de o fazeres!

Na web há muitos blogs e artigos sobre isso.
 5
Author: Cicik, 2013-11-16 13:53:56
Resposta tardia, mas pode ser útil para outra pessoa.

Se nem o DBCC ShrinkDatabase/ShrinkFile ou SSMS (Tarefas/encolher/base de dados) não ajudar, existem ferramentas do Quest e do ApexSQL que podem fazer o trabalho, e até mesmo agendar uma encolher periódica se precisar dele.

Usei o último em teste gratuito para fazer isto há algum tempo atrás, seguindo uma breve descrição no final disto. artigo:

Https://solutioncenter.apexsql.com/sql-server-database-shrink-how-and-when-to-schedule-and-perform-shrinking-of-database-files/

Tudo o que precisa de fazer é instalar a cópia de segurança ApexSQL, carregar no botão "encolher a base de dados" na fita principal, seleccionar a base de dados na janela que irá aparecer e carregar em "Terminar".

 5
Author: Andreas Voller, 2017-06-28 09:07:27

Você também vai precisar encolher os arquivos de dados individuais.

No entanto, não é boa ideia encolher as bases de dados. Por exemplo, veja aqui
 4
Author: no_one, 2009-01-13 14:26:55

Deve utilizar:

dbcc shrinkdatabase (MyDB)

Irá encolher o ficheiro de Registo (manter um windows explorer aberto e vê-lo a acontecer).

 4
Author: Eduardo, 2010-01-08 16:13:02

Aqui está outra solução: Use o Assistente de edição de bases de dados para exportar o seu esquema, segurança e dados para scripts sql. Você pode então desligar o seu DB atual e recriá-lo com os scripts.

Parece uma tolice, mas há algumas vantagens. Primeiro, não há hipótese de perder dados. Seu db original (desde que você não delete seu DB ao deixá-lo cair!) is safe, the new DB will be roughly as small as it can be, and you'll have two different instantâneos de sua base de dados atual-um pronto para rodar, um minificado-você pode escolher de fazer backup.
 2
Author: Will, 2009-01-13 14:48:29

" Portanto, é razoável assumir que muito espaço deve agora ser recuperável."

Peço Desculpa se percebi mal a pergunta, mas tens a certeza que é a base de dados e não os ficheiros de registo que estão a usar o espaço? Verifique para ver em que modelo de recuperação o banco de dados está. É provável que esteja na totalidade, o que significa que o ficheiro de Registo nunca está truncado. Se você não precisar de um registro completo de cada transação, você deve ser capaz de mudar para simples, que irá truncar os logs. Você pode encolher o banco de dados durante o processo. Assumindo que as coisas correm bem, o processo parece:

    Faz Backup da base de dados!
  1. mudança para uma simples recuperação
  2. encolhe db (db com o botão direito, escolha todas as tarefas > encolhe db- > configure para 10% de espaço livre)
  3. Verifique se o espaço foi recuperado, se não tiver de fazer uma cópia de segurança completa

Se isso não funcionar( ou receber uma mensagem a dizer "o ficheiro de registo está cheio" quando tentar mudar os modos de recuperação), tente isto:

  1. Apoio
  2. desligar todas as ligações ao db
  3. desligar db (botão direito > desligar ou botão direito > Todas as tarefas > desligar)
  4. apaga o ficheiro log (ldf)
  5. recolocar o db
  6. muda o modo de recuperação

Etc.

 2
Author: Tom, 2010-01-08 16:24:40

Eu me deparei com este post, mesmo que eu precisava encolhê-lo na versão MSSQL 2012, que é pouco mais complicado desde 2000 ou 2005 versões. Depois de ler sobre todos os riscos e questões relacionadas a esta questão, acabei por testar. Resumindo, os melhores resultados que obtive foram da utilização do estúdio de gestão de servidores MS SQL .

Right-Click the DB -> TASKS -> SHRINK -> FILES -> select the LOG file
 1
Author: Milan, 2014-07-23 18:11:16

Você também tem que modificar o tamanho mínimo dos dados e arquivos de log. A DBCC SHRINKDATABASE irá diminuir os dados dentro de os ficheiros que já atribuiu. Para encolher um arquivo para um tamanho menor que o seu tamanho mínimo, use DBCC SHRINKFILE e especifique o novo tamanho.

 0
Author: Otávio Décio, 2009-01-13 14:16:12

Apague os dados, certifique-se de que o modelo de Recuperação é simples, em seguida, skrink (tanto encolher banco de dados ou encolher arquivos funciona). Se o arquivo de dados ainda for muito grande, e você usar heaps para armazenar dados -- isto é, sem índice agrupado em tabelas grandes -- então você pode ter esse problema em relação a excluir dados de heaps: http://support.microsoft.com/kb/913399

 0
Author: onupdatecascade, 2009-08-19 18:04:20
Fiz isto recentemente. Estava a tentar fazer uma versão compacta da minha base de dados para testes na estrada, mas não consegui que encolhesse, por mais linhas que apagasse. Eventualmente, depois de muitos outros comandos neste tópico, eu descobri que meus índices agrupados não estavam sendo reconstruídos depois de apagar linhas. Reconstruir os meus índices fez-me encolher correctamente.
 0
Author: Greg Fleming, 2011-07-11 19:00:45

Não sei se isto seria prático, e dependendo do tamanho da base de dados, número de tabelas e outras complexidades, mas eu:

  1. desfragmentar a unidade física
  2. Criar uma nova base de dados de acordo com as minhas necessidades, espaço, crescimento percentual, etc
  3. use a tarefa simples do ssms para importar todas as tabelas do antigo db para o novo db
  4. script out the indexes for all tables on the old database, and then recriate the indexes on the new database. expandir conforme necessário para chaves estrangeiras, etc.
  5. mudar o nome das bases de dados conforme necessário, confirmar o sucesso, apagar o antigo
 0
Author: Rico, 2015-09-01 15:01:15
Acho que pode remover todo o seu registo com a mudança de recuperação completa para simples. Carregue com o botão direito na sua base de dados e seleccione Properties e seleccione Options e altere
  • Recovery mode a Simple
  • Containment type a None

Switching from full to simple

 0
Author: Amir, 2017-12-31 23:22:14