locked
liberando espaço nao utilizado RRS feed

  • Pergunta

  • Pessoal, eu tenho um banco de dados com as seguintes informações:

    NAME data_allocated data_used log_allocated log_used recovery_model_desc
    XXX  817108 450439 1348 94 FULL

    Como posso liberar esse espaço não utilizado para o S.O?
    quarta-feira, 11 de dezembro de 2013 20:27

Respostas

  • Olá,

    Pelos dados passados, você tem espaço sobrando tanto nos arquivos de dados quanto nos arquivos de log, pode ser somente um arquivo .mdf e outro .ldf também.

    A opção mais simples é utilizar o DBCC SHRINKDATABASE, veja o link:

    ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/fc976afd-1edb-4341-bf41-c4a42a69772b.htm

    Para que ele seja mais efetivo é melhor alterar o recovery mode da base para simple, avalie o risco dessa ação previamente.

    []s.


    MarcosGalvani


    sexta-feira, 13 de dezembro de 2013 20:25
  • SaraivaIT,

    Veja este código de exemplo, para encolher o log de todos os seus bancos de dados:

    Use TempDB
    
    If Object_Id('TempDB..#RelacaoBancos') IS NOT NULL
     Begin
      Truncate Table #RelacaoBancos
     End
     Else
     Begin
      Create Table #RelacaoBancos
      (Codigo TinyInt Identity(1,1),
       DatabaseName Varchar(100),
       Space_DataFile Int,
       Space_LogFile Int)
     End
     
    DECLARE @DatabaseName varchar(100), @cmd varchar(1000), @Indice Int
     
    DECLARE cur_SpaceUsed CURSOR FOR
     
    SELECT name FROM MASTER..SYSDATABASES
    WHERE  name NOT IN ('master', 'msdb', 'model', 'tempdb')
    and    status <> 66048
    Order By Name
     
    OPEN cur_SpaceUsed
    FETCH NEXT FROM cur_SpaceUsed
    INTO @DatabaseName
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
       SELECT @cmd =  'SET NOCOUNT ON' + char(10) +
              'USE ' + @DatabaseName + '' + char(10) + 
    
              '
               DECLARE  @SizeDataFile Int, 
                                @SizeLogFile Int
               
               
               Set @SizeDataFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupId >= 1)
               Set @SizeLogFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupID = 0)        
             
               Insert Into TempDB..#RelacaoBancos(DatabaseName, Space_DataFile, Space_LogFile) 
                                  Values('+''''+@DatabaseName+''''+','+'@SizeDataFile'+','+'@SizeLogFile'+')'
    
     Exec(@cmd)
     
     FETCH NEXT FROM cur_SpaceUsed
    
     INTO @DatabaseName
    END
     
    CLOSE cur_SpaceUsed
    DEALLOCATE cur_SpaceUsed
    
    
    Select Upper(DatabaseName) 'Database',
           Space_DataFile As 'Size Data File in MBs',
           Space_LogFile As 'Size Log File in MBs'
    from #RelacaoBancos
    
    --Encolhendo os Arquivos de Log--
    Declare @Comando VarChar(1000),
            @NomeBancodeDados VarChar(100),
            @Contador TinyInt
    
    Set @Contador=1
    
    While @Contador <= (Select Count(*) from #RelacaoBancos)
     Begin
    
      Select @NomeBancodeDados=DatabaseName from #RelacaoBancos
      Where Codigo = @Contador
    
      Set @Comando='USE '+@NomeBancodeDados+' 
    
      ALTER DATABASE '+@NomeBancodeDados+'  
      SET RECOVERY SIMPLE;
    
      DBCC ShrinkDatabase('+@NomeBancodeDados+',10)
    
      DBCC ShrinkFile(1,TruncateOnly);
    
      DBCC ShrinkFile(2,100);
      
      DBCC ShrinkFile(2,TruncateOnly);
    
      ALTER DATABASE '+@NomeBancodeDados+' 
      SET RECOVERY FULL;'+Char(13)
    
      Exec(@Comando)
    
      Set @Contador=@Contador+1
     End


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 20 de dezembro de 2013 13:01
    Moderador

Todas as Respostas

  • Descreva um pouco melhor o seu problema não ficou muito claro que dados são esses que você postou, para liberar espaço em disco existem algumas opções mas tudo depende do cenário em que você precisa de espaço.

    Me avise quanto a sua necessidade e qual o ambiente atual em que precisa liberar espaço.

    quinta-feira, 12 de dezembro de 2013 17:22
  • Saraivait,

    Basicamente o encolhimento do log é o processo que pode atender este tipo de necessidade, mas tem que ser muito bem pensada e analizada em conjunto com o modelo de recuperação do seu banco.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 13 de dezembro de 2013 12:33
    Moderador
  • Olá Saraiva,

    forneça mais dados, descrevendo o status da base (tamanho do arquivo de dados e do transaction log) e qual o tipo de recovery model habilitado no mesmo, para que possamos apresentar as melhores opções para você controlar o crescimento dos arquivos de dados do banco.

    Att,


    Angelo Máximo
    MTA | MCITP | MCT | CCSQLA
    sqlmax@outlook.com
    http://angmaximo.wordpress.com/

    Se a resposta foi útil, não esqueça de classificá-la.


    • Editado Angelo Maximo sexta-feira, 13 de dezembro de 2013 12:38
    sexta-feira, 13 de dezembro de 2013 12:37
  • Olá,

    Pelos dados passados, você tem espaço sobrando tanto nos arquivos de dados quanto nos arquivos de log, pode ser somente um arquivo .mdf e outro .ldf também.

    A opção mais simples é utilizar o DBCC SHRINKDATABASE, veja o link:

    ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/fc976afd-1edb-4341-bf41-c4a42a69772b.htm

    Para que ele seja mais efetivo é melhor alterar o recovery mode da base para simple, avalie o risco dessa ação previamente.

    []s.


    MarcosGalvani


    sexta-feira, 13 de dezembro de 2013 20:25
  • SaraivaIT,

    Veja este código de exemplo, para encolher o log de todos os seus bancos de dados:

    Use TempDB
    
    If Object_Id('TempDB..#RelacaoBancos') IS NOT NULL
     Begin
      Truncate Table #RelacaoBancos
     End
     Else
     Begin
      Create Table #RelacaoBancos
      (Codigo TinyInt Identity(1,1),
       DatabaseName Varchar(100),
       Space_DataFile Int,
       Space_LogFile Int)
     End
     
    DECLARE @DatabaseName varchar(100), @cmd varchar(1000), @Indice Int
     
    DECLARE cur_SpaceUsed CURSOR FOR
     
    SELECT name FROM MASTER..SYSDATABASES
    WHERE  name NOT IN ('master', 'msdb', 'model', 'tempdb')
    and    status <> 66048
    Order By Name
     
    OPEN cur_SpaceUsed
    FETCH NEXT FROM cur_SpaceUsed
    INTO @DatabaseName
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
       SELECT @cmd =  'SET NOCOUNT ON' + char(10) +
              'USE ' + @DatabaseName + '' + char(10) + 
    
              '
               DECLARE  @SizeDataFile Int, 
                                @SizeLogFile Int
               
               
               Set @SizeDataFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupId >= 1)
               Set @SizeLogFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupID = 0)        
             
               Insert Into TempDB..#RelacaoBancos(DatabaseName, Space_DataFile, Space_LogFile) 
                                  Values('+''''+@DatabaseName+''''+','+'@SizeDataFile'+','+'@SizeLogFile'+')'
    
     Exec(@cmd)
     
     FETCH NEXT FROM cur_SpaceUsed
    
     INTO @DatabaseName
    END
     
    CLOSE cur_SpaceUsed
    DEALLOCATE cur_SpaceUsed
    
    
    Select Upper(DatabaseName) 'Database',
           Space_DataFile As 'Size Data File in MBs',
           Space_LogFile As 'Size Log File in MBs'
    from #RelacaoBancos
    
    --Encolhendo os Arquivos de Log--
    Declare @Comando VarChar(1000),
            @NomeBancodeDados VarChar(100),
            @Contador TinyInt
    
    Set @Contador=1
    
    While @Contador <= (Select Count(*) from #RelacaoBancos)
     Begin
    
      Select @NomeBancodeDados=DatabaseName from #RelacaoBancos
      Where Codigo = @Contador
    
      Set @Comando='USE '+@NomeBancodeDados+' 
    
      ALTER DATABASE '+@NomeBancodeDados+'  
      SET RECOVERY SIMPLE;
    
      DBCC ShrinkDatabase('+@NomeBancodeDados+',10)
    
      DBCC ShrinkFile(1,TruncateOnly);
    
      DBCC ShrinkFile(2,100);
      
      DBCC ShrinkFile(2,TruncateOnly);
    
      ALTER DATABASE '+@NomeBancodeDados+' 
      SET RECOVERY FULL;'+Char(13)
    
      Exec(@Comando)
    
      Set @Contador=@Contador+1
     End


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 20 de dezembro de 2013 13:01
    Moderador