none
DPM освобождение места после удаление защищаемого обекта RRS feed

  • Вопрос

  • Добрый день!
    Есть DPM 2012 R2 на win 2012 R2.

    Архивирую достаточно большое количество баз SQL. Периодически эти базы удаляются, но место на диске не освобождается.

    Судя по этой теме https://social.technet.microsoft.com/Forums/ru-RU/e69b7866-96ac-42f9-ba6e-8c551835766f/-?forum=msdpmru это и не предусмотрено.

    Место постепенно съедается, и через какое-то время у меня под бекапы будет уходить десятки Тб, чего не хотелось бы.

    Собственно 2 вопроса:

    1. Вдруг появился какой-нибудь костыль для очистки спустя 1,5 года, может кто поделится.

    2. И изменилось ли поведение в DPM 2016?

    23 марта 2017 г. 8:20

Ответы

  • Приветствую,

    Можно поступить следующим образом.

    1. Удалить SQL базы из группы "Inactive Protection".

    2. Если они были в режиме co-lacated, то проверить скриптом какие группы можно сжать.

    #begin script
    
    #----------------
    
    param([string] $DPMServerName) 
    
    if(!$args[0]) 
    { 
        if(!$DPMServerName) 
        { 
        Write-Host "Enter " -NoNewline  -foreground Green
        Write-Host "DPM Name Server" -foreground Yellow #-Backgroundcolor DarkRed
        $DPMServerName = Read-Host
        } 
    } 
    else 
    { 
        if(("-?","-help") -contains $args[0]) 
        { 
            write-host Usage:: 
            write-host FindShrinkableSpace.ps1 -DPMServerName [dpmserver] 
            write-host Help:: 
            write-host Finds the shrinkable space for all volumes protected on the specified DPM server. 
            write-host 
            exit 0 
        } 
    
        else 
        { 
            write-host "Usage -? for Help" 
            exit 1 
        } 
    } 
    
    $dsListAfterCalculatingShrink = @{} 
    
    $dpmServer = Connect-DPMServer $DPMServerName 
    if (!$dpmServer) 
    { 
        Write-Error "Unable to connect to $DpmServerName" 
        exit 1 
    } 
    
    $pgList = Get-ProtectionGroup -DPMServerName $DPMServerName 
    if ($pgList -ne $null) 
    { 
        foreach ($pg in $pgList) 
        { 
            $dsList = Get-Datasource -ProtectionGroup $pg 
            foreach ($ds in $dsList) 
            { 
                # If we have already stored a datasource for this physical replica, skip this DS and continue (since it will be the same) 
                if ($dsListAfterCalculatingShrink.ContainsKey($ds.AssociatedReplica.PhysicalReplicaId)) 
                { 
                    continue 
                } 
    
                $currentSizeInGb = [System.Math]::Round(($ds.ShadowCopyAreaSize * 1.0) / (1024.0 * 1024.0 * 1024.0), 2); 
                $shrinkableSizeInGb = 0; 
    
                #Clear errors, check for any exception during 'CalculateShrinkThresholds' operation 
                $prevErrorActionPreference = $ErrorActionPreference; 
                $ErrorActionPreference = "SilentlyContinue"; 
                $Error.Clear() 
                $ds2 = Get-DatasourceDiskAllocation -dataSource $ds -CalculateShrinkThresholds 
                if ($?) 
                { 
                    $shrinkableSizeInGb = [System.Math]::Round((($ds.ShadowCopyAreaSize - $ds2[0].ShadowCopySizeAfterMaxShrink) * 1.0 ) / (1024.0 * 1024.0 * 1024.0), 2); 
                } 
                $ErrorActionPreference = $prevErrorActionPreference; 
    
                # Add details about this datasource to a hashmap; 
                $dsListAfterCalculatingShrink[$ds.AssociatedReplica.PhysicalReplicaId] = 
                    @{Name = $ds.ToString("s", $null); ScSizeInGb = $currentSizeInGb; ShrinkableSizeInGb = $shrinkableSizeInGb } 
            } 
        } 
    } 
    
    # Sort the datasources in descending order of how much it can be shrunk 
    $dsListAfterCalculatingShrinkSorted = $dsListAfterCalculatingShrink.values | sort { $_.ShrinkableSizeInGb } -desc 
    
    # Print results 
    #write-output (" {0} {1} {2}" -f "Datasource".PadRight(100),"SC-Size(GB)".PadLeft(11),"CanBeShrunkBy(GB)".PadLeft(11)) 
    write-host -ForegroundColor Cyan (" {0} {1} {2}" -f "Datasource".PadRight(100),"SC-Size(GB)".PadLeft(11),"CanBeShrunkBy(GB)".PadLeft(11)) 
    write-host -ForegroundColor Cyan ------------------------------------------------------------------------------------------------------------------------------------ 
    foreach ($ds in $dsListAfterCalculatingShrinkSorted) 
    { 
        write-output (" {0} {1} {2}" -f $ds.Name.PadRight(100), $ds.ScSizeInGb.ToString().PadLeft(11), $ds.ShrinkableSizeInGb.ToString().PadLeft(11)) 
    }
    
    #end script
    
    #-----------
    

    3. Через оснастку управления дисками (disk management) найти наиболее свободные диски (free %) и проверить скриптом, что данные диски не используются в DPM.

    $FindPath = "vol_298ef3dd-b90c-4b6d-9463-046d30ddd497"
    $AllDS = Get-DPMDataSource
    ForEach ($DS in $AllDS) { 
        $Paths = $DS.ProtectableObjectLoadPath
        ForEach ($Path in $Paths) {
            $Array = $Path.GetEnumerator()
            ForEach ($Item in $Array) {
                If ($Item.Value -match $FindPath) {
                    Write-Host $Item.Key " --> " $Item.Value
                }
            }
        }
     }

    Проверено, работает! :)

    Полезные ссылки:


    Have a nice day !!!
    DPM 2012 R2: Remove Recovery Points
    DPM blog
    System Center
    Hyper-V

    • Помечено в качестве ответа LiOH 20 апреля 2017 г. 14:31
    19 апреля 2017 г. 14:27
    Модератор

Все ответы

  • Приветствую,

    Можно поступить следующим образом.

    1. Удалить SQL базы из группы "Inactive Protection".

    2. Если они были в режиме co-lacated, то проверить скриптом какие группы можно сжать.

    #begin script
    
    #----------------
    
    param([string] $DPMServerName) 
    
    if(!$args[0]) 
    { 
        if(!$DPMServerName) 
        { 
        Write-Host "Enter " -NoNewline  -foreground Green
        Write-Host "DPM Name Server" -foreground Yellow #-Backgroundcolor DarkRed
        $DPMServerName = Read-Host
        } 
    } 
    else 
    { 
        if(("-?","-help") -contains $args[0]) 
        { 
            write-host Usage:: 
            write-host FindShrinkableSpace.ps1 -DPMServerName [dpmserver] 
            write-host Help:: 
            write-host Finds the shrinkable space for all volumes protected on the specified DPM server. 
            write-host 
            exit 0 
        } 
    
        else 
        { 
            write-host "Usage -? for Help" 
            exit 1 
        } 
    } 
    
    $dsListAfterCalculatingShrink = @{} 
    
    $dpmServer = Connect-DPMServer $DPMServerName 
    if (!$dpmServer) 
    { 
        Write-Error "Unable to connect to $DpmServerName" 
        exit 1 
    } 
    
    $pgList = Get-ProtectionGroup -DPMServerName $DPMServerName 
    if ($pgList -ne $null) 
    { 
        foreach ($pg in $pgList) 
        { 
            $dsList = Get-Datasource -ProtectionGroup $pg 
            foreach ($ds in $dsList) 
            { 
                # If we have already stored a datasource for this physical replica, skip this DS and continue (since it will be the same) 
                if ($dsListAfterCalculatingShrink.ContainsKey($ds.AssociatedReplica.PhysicalReplicaId)) 
                { 
                    continue 
                } 
    
                $currentSizeInGb = [System.Math]::Round(($ds.ShadowCopyAreaSize * 1.0) / (1024.0 * 1024.0 * 1024.0), 2); 
                $shrinkableSizeInGb = 0; 
    
                #Clear errors, check for any exception during 'CalculateShrinkThresholds' operation 
                $prevErrorActionPreference = $ErrorActionPreference; 
                $ErrorActionPreference = "SilentlyContinue"; 
                $Error.Clear() 
                $ds2 = Get-DatasourceDiskAllocation -dataSource $ds -CalculateShrinkThresholds 
                if ($?) 
                { 
                    $shrinkableSizeInGb = [System.Math]::Round((($ds.ShadowCopyAreaSize - $ds2[0].ShadowCopySizeAfterMaxShrink) * 1.0 ) / (1024.0 * 1024.0 * 1024.0), 2); 
                } 
                $ErrorActionPreference = $prevErrorActionPreference; 
    
                # Add details about this datasource to a hashmap; 
                $dsListAfterCalculatingShrink[$ds.AssociatedReplica.PhysicalReplicaId] = 
                    @{Name = $ds.ToString("s", $null); ScSizeInGb = $currentSizeInGb; ShrinkableSizeInGb = $shrinkableSizeInGb } 
            } 
        } 
    } 
    
    # Sort the datasources in descending order of how much it can be shrunk 
    $dsListAfterCalculatingShrinkSorted = $dsListAfterCalculatingShrink.values | sort { $_.ShrinkableSizeInGb } -desc 
    
    # Print results 
    #write-output (" {0} {1} {2}" -f "Datasource".PadRight(100),"SC-Size(GB)".PadLeft(11),"CanBeShrunkBy(GB)".PadLeft(11)) 
    write-host -ForegroundColor Cyan (" {0} {1} {2}" -f "Datasource".PadRight(100),"SC-Size(GB)".PadLeft(11),"CanBeShrunkBy(GB)".PadLeft(11)) 
    write-host -ForegroundColor Cyan ------------------------------------------------------------------------------------------------------------------------------------ 
    foreach ($ds in $dsListAfterCalculatingShrinkSorted) 
    { 
        write-output (" {0} {1} {2}" -f $ds.Name.PadRight(100), $ds.ScSizeInGb.ToString().PadLeft(11), $ds.ShrinkableSizeInGb.ToString().PadLeft(11)) 
    }
    
    #end script
    
    #-----------
    

    3. Через оснастку управления дисками (disk management) найти наиболее свободные диски (free %) и проверить скриптом, что данные диски не используются в DPM.

    $FindPath = "vol_298ef3dd-b90c-4b6d-9463-046d30ddd497"
    $AllDS = Get-DPMDataSource
    ForEach ($DS in $AllDS) { 
        $Paths = $DS.ProtectableObjectLoadPath
        ForEach ($Path in $Paths) {
            $Array = $Path.GetEnumerator()
            ForEach ($Item in $Array) {
                If ($Item.Value -match $FindPath) {
                    Write-Host $Item.Key " --> " $Item.Value
                }
            }
        }
     }

    Проверено, работает! :)

    Полезные ссылки:


    Have a nice day !!!
    DPM 2012 R2: Remove Recovery Points
    DPM blog
    System Center
    Hyper-V

    • Помечено в качестве ответа LiOH 20 апреля 2017 г. 14:31
    19 апреля 2017 г. 14:27
    Модератор
  • Добрый вечер, Евгений!

    Не так-то всё тривиально получается...

    Спасибо за скрипты. Как протестирую - отпишусь.

    Еще несколько вопросов:

    Как часто надо эти скрипты применять? Удалил базу - прогнал скрипты? Или раз в пол года предпочтительнее? Ну или как с местом не прижмёт :) 

    После выполнения этих скриптов я увижу реальный прирост свободного места на дисках в оснастке DPM?

    19 апреля 2017 г. 15:28
  • LiOH, хорошие (правильные) вопросы :)

    1. "Как часто надо эти скрипты применять? Удалил базу - прогнал скрипты? Или раз в пол года предпочтительнее? Ну или как с местом не прижмёт :) "

    Т.к. в DPM пуле диски динамические и у каждой группы защиты есть свое расписание, согласно которому нужно хранить копии, то для того, чтобы избежать фрагментации и, как следствие, падения производительности DPM пула, стоит выполнять скрипты редко. Например, удалили базу данных, которая должна была храниться 30 дней, стоит выждать 31 день и после этого прогнать оба скрипта: первый чтобы уменьшить recovery point volume (replica НЕ уменьшиться), второй - чтобы удалить неиспользуемые диски DPM-ом.

    2. "После выполнения этих скриптов я увижу реальный прирост свободного места на дисках в оснастке DPM?"

    да, увидете. Если у вас диски большого объема (например, от 5 TB и выше), то может потребуется перезагрузить DPM для перерасчета места средствами ОС (можно выключить/включить диск из оснастки управления дисками (diskmgmt.msc))


    Have a nice day !!!
    DPM 2012 R2: Remove Recovery Points
    DPM blog
    System Center
    Hyper-V

    20 апреля 2017 г. 7:58
    Модератор