7 Replies Latest reply: Jan 8, 2014 10:53 AM by cscott RSS

remove snapshots by count

JSHACHER11 Cyclist
Currently Being Moderated

the following will remove snapshots older than 5 days - how do I do the same with number of snapshots? (keep only 5 snapshots)

 

Get-NaVol vol2 | Get-NaSnapshot | where-object {$_.Created -lt (Get-Date).AddDays(-5)} | remove-nasnapshot -Confirm:$false

 

thanks

  • Re: remove snapshots by count
    cscott NetApp Employee Hall of Fame Sprinter
    Currently Being Moderated

    Joel,

         Here is a quick and dirty way to create an array of snapshots.  They are sorted by date, oldest to newest, then you could use the array to delete the snaps you require -

     

    Connect-NaController $myNetAppNode -Credential $myNetAppCred -HTTP

    $NetAppSnapArray = @(Get-NaSnapshot -TargetName $myNetAppVolume |sort -Property Created | % {Write-Output $_.Name})

     

    to see the snaps add - write-output $NetAppSnapArray

     

    You can then use this array to further manipulate the snaps.  In this example we use it to list out all the snaps(in a text menu) on the volume so we can figure out the snap delta to see how much data a given snapvault or snapmirror has to transfer.  I have attached the entire script if you want to see what I am talking about.

     

    -Scott

    • Re: remove snapshots by count
      JSHACHER11 Cyclist
      Currently Being Moderated

      thanks Scott

       

      how would that give me the number of snapshots in a volume though?

      • Re: remove snapshots by count
        JSHACHER11 Cyclist
        Currently Being Moderated

        it would have to be done with 'measure' somehow

        I get the count with the following:

         

        Get-NaVol vol1 | Get-NaSnapshot | measure

         

        that gives me a 'count' (number of snapshots)

         

         

        count: 5

         

        with this in mind, I need to figure out how to move forward..

        • Re: remove snapshots by count
          JSHACHER11 Cyclist
          Currently Being Moderated

          maybe something like:

           

          {$_.count -gt "3"} | Remove-NaSnapshot

          • Re: remove snapshots by count
            cscott NetApp Employee Hall of Fame Sprinter
            Currently Being Moderated

            Hi Joel,

                 With an array, you have the ability to see how "long" it is.  $SnapNameArray.length will tell you how many snapshots are in the array.  Now if you want to keep five, you would need to build a loop to remove the unwanted snapshots.  Now the issue you would have with what I put up is that the oldest snapshosts are on top, and it is easiest to manipulate the array from the bottom. You can use this -  [array]::Reverse($NetAppSnapArray)

             

            Now, all you have to do is remove the last item in the array using the loop of your choice to call the last snapshot from the array and delete it until the length of the array = 5.

             

            I don't have the exact code, I can try to put something together, but I at least wanted to give you a path to start looking into.

             

            -Scott

          • Re: remove snapshots by count
            cscott NetApp Employee Hall of Fame Sprinter
            Currently Being Moderated

            Joel,

                 This sure isn't pretty, but it works.  This will get the snaps on a given volume in order of created date.  It will then reverse the array order to ensure we get oldest first.  From there, by setting "$i =5"  We say that anything above item 4 in the array(arrays start at 0 so position 4 is the fifth item), remove that.  I recommend testing this somewhere safe just to be sure it works as you expect.

             

            -Scott

             

            Connect-NaController $myNetAppNode -Credential $myNetAppCred -HTTP

            $NetAppSnapArray = @(Get-NaSnapshot -TargetName $myNetAppVolume |sort -Property Created | % {Write-Output $_.Name})

             

             

            [array]::Reverse($NetAppSnapArray)

             

             

            $x = $NetAppSnapArray.length

             

             

            for ($i = 5; $i -lt $x; $i++) {

            Remove-NaSnapshot -TargetName $myNetAppVolume -SnapName $NetAppSnapArray[$i]

            }

More Like This

  • Retrieving data ...

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points