none
Recriando o arquivo .LDF de uma base para liberar espaço em disco. RRS feed

  • Discussão Geral

  • Recentemente tive um problema na carga de um banco que eu acabara de criar, o SQL Server gerou mais de 120 GB de LOG que consequentemente estava lotando o disco e eu precisava se uma solução já que o Shrink não adiantou praticamente nada.

    A solução seria excluir o arquivo .LDF e criar outro a partir do .MDF onde no final o tamanho do LOG foi de 120 GB para 1 MB.

    Vamos aos passos:

    Passo 1: Desanexe a tabela desejada.

    Passo 2: Renomeie o arquivo de LOG para um outro qualquer.

    Passo 3: Execute o comando abaixo na base Master:

      EXEC sp_attach_single_file_db @dbname= Teste, --NOME DA BASE DESEJADA
          @physname='D:\Data\Teste.mdf' --CAMINHO DO ARQUIVO .MDF

    Passo 4: Confime se o banco está normalizado e posteriormente exclua o arquivo .LDF antigo para liberar espaço em disco.

    Obs: Recomendo usar esse método somente em ambientes de desenvolvimento pois todo o Log será perdido, impossibilitando uma possível recuperação posterior.


    • Editado Luiz B Lira quarta-feira, 20 de fevereiro de 2019 21:13
    quarta-feira, 20 de fevereiro de 2019 21:12

Todas as Respostas

  • Luiz,

    Por o que Shrink não funcionou? Você utilizou o DBCC ShrinkFile ou DBCC ShrinkDatabase?

    Você alterou o modelo de recuperação do banco de dados para Simples antes de realizar os procedimentos de Shrink?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 21 de fevereiro de 2019 11:59
  • Opa Pedro, alterei o Recovery Mode de Full para Simple e utilizei o DBCC ShrinkFile, onde no final só acabou limpado 3% do arquivo.  :/

    quinta-feira, 21 de fevereiro de 2019 13:56
  • Luiz,

    Estranho, talvez você não tenha utilizado a opção TruncateOnly, isso é o segredinho.....

    Veja este exemplo:

    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 | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 21 de fevereiro de 2019 17:23