none
Ручная очистка логов базы RRS feed

  • Общие обсуждения

  • Всем привет
    Exchange 2010 sp1(server 2008R2)
    После сбоя на MailBox сервере не работает бэкап, тем самым дал накопится большому количеству логово базы. Теперь бекап не проходит из-за нехватки места на диске(на который будет ложится бекап). Расширить место технический невозможно. Мной было принято решение, очистить логи в ручную и повторно настроить бекап.

    Хотел бы уточнить последовательности действий.

    1. Необходимо отмонтировать базу
    2. Найти последний лог файл который залился в базу "eseutil /mk "...\E00.chk""
    3. Перенести уже не активны логи на другой диск
    4. Примонтировать базу обратно. 

    Правильно ли я всё описал?
    Есть ли какие то подводные камни о которых надо знать?
    И надо ли ещё после демонтирования базы останавливать службу "microsoft exchange information store"?


    4 декабря 2015 г. 8:49

Все ответы

  • Включите Circular Logging на БД и подождите, логи сами соберутся в БД.
    4 декабря 2015 г. 8:55
  • Microsoft не рекомендует включать данную опцию в продакшене. Ведение журнала логов является технической необходимостью для адекватной работы дополнительных надстроек базы. При включении Circular Logging не уверен что дополнительные надстроки будут нормально работать.

    Спасибо за совет, но я склоняюсь к ручной очистке логов.

    4 декабря 2015 г. 9:31
  • Вы соберите их, а потом отключите. Это лучше, чем вручную ошибок каких нибудь наделать.
    4 декабря 2015 г. 9:33
  • Microsoft не рекомендует включать данную опцию в продакшене. Ведение журнала логов является технической необходимостью для адекватной работы дополнительных надстроек базы. При включении Circular Logging не уверен что дополнительные надстроки будут нормально работать.

    Спасибо за совет, но я склоняюсь к ручной очистке логов.

    И у вас неправильная информация кстати по поводу этой опции:

    Microsoft: Без полного набора файлов журнала транзакций нельзя восстановить данные, созданные после последнего полного резервного копирования. Поэтому в обычной производственной среде не рекомендуется использовать циклическое ведение журнала

    4 декабря 2015 г. 9:57
  • можно.

    вообще вручную можно удалить "середину" логов. то есть первые хх файлов оставляешь, и последние хх файлов оставляешь, середину хххх удаляешь. база смонтируется.

    после чего ставишь циклическое логирование и перемонтируешь базу. остальные логи почистятся.

    логи нужны для ВОССТАНОВЛЕНИЯ базы.

    При регулярных бэкапах логи автоматически регулярно усекаются.

    4 декабря 2015 г. 15:02
  • Очистил логи, бекап стартовал. По окончанию закончился со статусом "completed with warning ".

    В событиях нашел ошибку "9782"

    Exchange VSS Writer (instance 99e2fc60-368d-4281-8920-dd270e1e2206:1) has completed the backup of database 'DB' with errors. The backup did not complete successfully, and no log files were truncated for this database.

    В чём возможная проблема? Буду очень благодарен за помощь.

    8 декабря 2015 г. 14:33
  • У меня постоянно такая петрушка происходит. А баз много. И *.log очень много .

    Придумал скрипт который "eseutil /mk "...\E00.chk"" узнает последний .log в базу и удаляет предыдущие.

    Все это налету, не нужно ничего отмонтировать примонтировать.

    14 декабря 2015 г. 7:01
  • А поделится скриптом можете?
    25 октября 2016 г. 12:02
  • cls
    add-pssnapin microsoft.exchange.management.powershell.e2010
    Import-Module ActiveDirectory
    Get-pssnapin -registered | add-pssnapin
    $dat11=get-date

    Write-Host (get-date)
    $vu=0
    $buffer=3



    Get-MailboxDatabase | where { `
    $_.logfolderpath -like "*" `
    -and $_.logfolderpath -notlike "*archive*" `
    -and $_.logfolderpath -notlike "*\Mailbox Database 1400914400*" `
    -and $_.logfolderpath -notlike "*\ttt*" `
    -and $_.logfolderpath -notlike "*\mb2*" `
    } | `

    foreach {">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
    #$_.log
    #$inf=Get-MailboxDatabaseCopyStatus $_.name | where {$_.CopyQueueLength -ne 0 -or $_.ReplayQueueLength -ne 0} | ft -AutoSize
    $mmax=0
    $inf=Get-MailboxDatabaseCopyStatus $_.name 
    $inf | ft -AutoSize
    $inf | foreach {if ($_.CopyQueueLength -gt $mmax) {$mmax=$_.CopyQueueLength}  }
     #$inf.CopyQueueLength
    $mmax
    if ($mmax -lt 5) {
    $p=$_.logfolderPath.PathName+"\"

    $nn=(dir $p*.chk).name
    $prefix=""
    $prefix=$nn -split ".chk"
    $prefix=$prefix[0]

    $строкаВывода=""
    $mm=eseutil /mk $p$nn
        foreach ($m in $mm)
        {
            #Write-Host "==="  $m
            if ($m -match '(\s)(Checkpoint: \(0x)(.+)(,.+,)(.+$)')
            {
                   $строкаВывода=$строкаВывода+ $p + $nn + " " + $m 
                   $p1=$matches[3]
            }
        }
    #break
    $строкаВывода
    $строкаВывода=""
    $ku=0
    $knu=0
    $времяПоследнего=0
    $Bufer=$buffer; $mask1=$prefix+".log"
    $aa=Get-ChildItem $p*.log -Exclude @("*tmp.log",$mask1) | sort LastWriteTime -Descending #| select -First 10
    #$aa=Get-ChildItem $p*.log | sort LastWriteTime -Descending #| select -First 10
    #break

    foreach ($a in $aa)
    {
        $knu++
     
     #Write-Host "->" $a.name ( [datetime]$a.LastWriteTime)
     #$vvv="->"+$p+$a.name +" "+([datetime]$a.LastWriteTime)
     
        if ($a.name -like "*$p1.log")
        {
            #Write-Host "MAIDEN " $a.name ( [datetime]$a.LastWriteTime)
            #$vvv=$vvv+ "nAIDEN !  -> " + $p1 + " + bufer " + $bufer
            #Write-Host ")_)_)_)_)_"
            $времяПоследнего=([datetime]$a.LastWriteTime).ticks 
            $строкаВывода=$строкаВывода+" naiDEN "+$a.name +" "+( [datetime]$a.LastWriteTime)+" "  +$времяПоследнего
            $времяПоследнего=([datetime]$a.LastWriteTime).ticks 
        }
     } # naiiiLu 
     Write-Host "! " $строкаВывода -BackgroundColor blue
     #break



     
     $aa=$aa | sort lastwritetime 
     #break
     $доНайденого=0
     foreach ($a in $aa)
     {
       $времяТекущего=([datetime]$a.LastWriteTime).ticks 
       if (($времяПоследнего - $времяТекущего) -gt 0)
       {$доНайденого++}
     }
     if ($mmax -gt $buffer){$buffer=$mmax}
     Write-Host $доНайденого '=$доНайденого'
     $доНайденого=$доНайденого-$buffer
     Write-Host $доНайденого '=$доНайденого-$buffer'
     
     foreach ($a in $aa)
     {
     
     #$строкаВывода=
     $строкаВывода=$a.VersionInfo.FileName +" "+ ( [datetime]$a.LastWriteTime)+" "+([datetime]$a.LastWriteTime).ticks #+" UDALEN "#+""
            
     #Write-Host $a.name -NoNewline
        if ($времяПоследнего -ne 0)    
        {
            $времяТекущего=0
            $времяТекущего=([datetime]$a.LastWriteTime).ticks
            #$времяПоследнего - $времяТекущего
            #$Bufer--
            if (($времяПоследнего - $времяТекущего) -gt 0)    
            {
                 $доНайденого--
               # Write-Host "bolshe" -NoNewline
             
                if ($доНайденого -gt 0 )
                { 
                $строкаВывода=$строкаВывода+" UDALEN "#+""
            
                 Remove-Item $a.FullName #-WhatIf
                }
                $ku++
                $knu--
            }
        }
        if ($времяПоследнего -eq $времяТекущего){Write-Host $строкаВывода -ForegroundColor White -BackgroundColor "Black"}
        else {Write-Host $строкаВывода}
    }
    "------------------"
    $строкаВывода=" BceGo "+$aa.count+"`n"+"     udaleno "+$ku+"  HE YDaLEHo "+$knu
    #$строкаВывода=$строкаВывода+" BceGo "+$aa.count+"`n"+"     udaleno "+$ku+"  HE YDaLEHo "+$knu
    $vu=$vu+$ku
    Write-Host $строкаВывода
    }
    "------------------"
    $строкаВывода=""
    Write-Host $строкаВывода

    }
    "================VSEGO UDALIT=" + $vu
    (get-date)-$dat11




    13 декабря 2016 г. 7:16