AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 358
Accepted
jcolebrand
jcolebrand
Asked: 2011-01-07 10:04:39 +0800 CST2011-01-07 10:04:39 +0800 CST 2011-01-07 10:04:39 +0800 CST

Como reduzo todos os arquivos rapidamente para todos os bancos de dados?

  • 772

No SQL Server (2008 neste caso), como posso reduzir rapidamente todos os arquivos, log e dados, para todos os bancos de dados em uma instância? Eu poderia passar pelo SSMS e clicar com o botão direito em cada um e escolher Tarefas -> Encolher, mas estou procurando algo mais rápido.

Eu criei scripts de alguns scripts "Criar banco de dados" e esqueci que eles tinham tamanhos de balão para padrões e não precisam de muito espaço reservado para esses arquivos neste projeto.

sql-server sql-server-2008
  • 8 8 respostas
  • 141736 Views

8 respostas

  • Voted
  1. Best Answer
    Larry Coleman
    2011-01-07T10:55:09+08:002011-01-07T10:55:09+08:00

    Quando você faz "Tasks -> Shrink" na GUI, ele realmente emite um DBCC SHRINKDATABASEcomando nos bastidores. Tente. Quando a caixa de diálogo aparecer, não clique no botão "OK". Em vez disso, clique no botão "Script". Você verá o comando em uma janela de consulta. Combine isso com uma consulta em sys.databases (deixe de fora master e msdb), e você pode fazer um script para reduzir todos os bancos de dados.

    Por exemplo (retirado do comentário de jcolebrand):

    SELECT 
          'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
        + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
        + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
    FROM 
             sys.master_files mf 
        JOIN sys.databases d 
            ON mf.database_id = d.database_id 
    WHERE d.database_id > 4;
    

    Copie a saída dessa consulta e execute-a para reduzir todos os seus arquivos.

    • 67
  2. CoderHawk
    2011-01-07T23:35:17+08:002011-01-07T23:35:17+08:00

    Que tal uma única linha de instrução sql?

    Por favor, leia esta postagem de blog muito interessante antes de executar a seguinte instrução sql.

    EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'
    
    • 27
  3. Thomas Kejser
    2014-01-06T09:28:44+08:002014-01-06T09:28:44+08:00

    DBCC SHRINKDB (e seu primo SHRINKFILE) são extremamente lentos, porque há muita execução de thread único acontecendo nesse código.

    Uma maneira muito mais rápida de reduzir um arquivo de banco de dados é esta:

    • Alocar um novo grupo de arquivos ao banco de dados
    • Torne este grupo de arquivos tão grande quanto necessário (use sp_spaceusedpara determinar o tamanho)
    • Reconstrua todos os índices para este novo grupo de arquivos
    • Solte o grupo de arquivos antigo

    Como as reconstruções de índice são maciçamente paralelas, essa técnica geralmente resulta em uma redução muito mais rápida do banco de dados. Claro, isso requer que você tenha um pouco de espaço extra para o novo grupo de arquivos enquanto o processo está em andamento. No entanto, você só precisa de espaço suficiente no novo grupo de arquivos para manter o maior grupo de arquivos na instância (já que você estará recuperando espaço à medida que avança).

    Essa técnica também tem o benefício adicional de desfragmentar seus índices no processo.

    • 15
  4. Frankachela
    2013-02-15T07:56:51+08:002013-02-15T07:56:51+08:00

    Aumentei um pouco a query para encolher apenas o LOG conforme solicitado:

    set nocount on  
    SELECT 
          'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
        + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
        + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
    FROM 
             sys.master_files mf 
        JOIN sys.databases d 
            ON mf.database_id = d.database_id 
    WHERE d.database_id > 4 and mf.type_desc = 'LOG'
    
    • 14
  5. Muhammad Sharjeel Ahsan
    2013-01-04T14:31:20+08:002013-01-04T14:31:20+08:00

    O código abaixo, obtenha uma lista de bancos de dados que não são do sistema, defina o banco de dados como somente leitura e reduza o arquivo. Eu mantive esse código em algumas caixas do SQL Server usando o SQL Agent Job, onde o espaço é sempre um problema. Na noite de sábado/domingo todas as semanas, ele começa a ser executado e reduz todos os bancos de dados em poucas horas (dependendo do tamanho dos bancos de dados).

    declare @db varchar(255)
    declare c cursor for
    select name from sys.databases where is_read_only=0 and state=0
      and name not in ('master','model','tempdb','msdb')
    open c
    fetch c into @db
    while @@fetch_status=0
    begin
      exec SP_dboption @db,'trunc. log on chkpt.','true' 
      DBCC shrinkdatabase (@db)
      fetch next from c into @db
    end
    close c
    deallocate c
    
    • 2
  6. Anup Kulkarni
    2019-03-27T00:00:21+08:002019-03-27T00:00:21+08:00

    Podemos repetir SHRINKDBe SHRINKFILEpara todos os bancos de dados dinamicamente:

    while @DBID<=@MaxDBID
    begin
      -- Used Dynamic SQL for all databases.
      Set @SQL ='Use '+@DBName+ ' '+Char(10)
      Set @SQL += 'DBCC SHRINKFILE('+@Filename+',5)' +Char(10)
      Set @SQL += 'DBCC SHRINKDATABASE('+@DBName+')'+Char(10)
    
      --#6 Increment DBid for looping over all databases
      Set @DBID = @DBID+1
      Select @DBName = DBName, @Filename=DBFileName from #DBNames where [dbid] = @DBID and type_Desc = 'LOG'
      Print (@SQL)
      Exec (@SQL)
    end
    

    Você pode encontrar detalhes neste artigo .

    • 1
  7. Emrah Saglam
    2018-02-07T22:20:55+08:002018-02-07T22:20:55+08:00

    Reduza todos os arquivos de log, exceto master, model, msdb:

    EXEC sp_MSforeachdb '
    DECLARE @sqlcommand nvarchar (500)
    IF ''?'' NOT IN (''master'', ''model'', ''msdb'')
    BEGIN
    USE [?]
    SELECT @sqlcommand = ''DBCC SHRINKFILE (N'''''' + 
    name
    FROM [sys].[database_files]
    WHERE type_desc = ''LOG''
    SELECT @sqlcommand = @sqlcommand + '''''' , 0)''
    EXEC sp_executesql @sqlcommand
    END'
    
    • 0
  8. Alistair
    2019-03-07T06:09:55+08:002019-03-07T06:09:55+08:00

    Este estende a resposta acima, usando um cursor para percorrer as instruções SQL uma a uma. Não é tão curto quanto a resposta de Emrah, mas permite lógica adicional dentro do loop while dentro do cursor.

    SELECT 
        'USE [' 
        + databases.name + N']' 
        + CHAR(13) 
        + CHAR(10) 
        + 'DBCC SHRINKFILE (N''' 
        + masterFiles.name 
        + N''' , 0, TRUNCATEONLY)' 
        + CHAR(13) 
        + CHAR(10) 
        + CHAR(13) 
        + CHAR(10)                                                                  AS sqlCommand
    INTO
        #shrinkCommands
    FROM 
        [sys].[master_files] masterFiles 
        INNER JOIN [sys].[databases] databases ON masterFiles.database_id = databases.database_id 
    WHERE 
        databases.database_id > 4; -- Exclude system DBs
    
    
    DECLARE iterationCursor CURSOR
    
    FOR
        SELECT 
            sqlCommand 
        FROM 
            #shrinkCommands
    
    OPEN iterationCursor
    
    DECLARE @sqlStatement varchar(max)
    
    FETCH NEXT FROM iterationCursor INTO @sqlStatement
    
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        EXEC(@sqlStatement)
        FETCH NEXT FROM iterationCursor INTO @sqlStatement
    END
    
    -- Clean up
    CLOSE iterationCursor
    DEALLOCATE iterationCursor
    DROP TABLE #shrinkCommands
    
    • 0

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve