Netapp: Löschen von SnapShots per Powershell Scripting

By | 14. September 2013

Nachdem ich auf ein undokumentiertes Feature beim „lun move“ gestoßen bin, möchte ich an dieser ein kleines Powershell Scriptchen bereitstellen, welches Euch das Löschen von Snapshots nach einem bestimmten Alter erleichtern soll.

Doch beginnen wir am Anfang. Wegen einer SnapVault implementierung in eine bestehende SnapManager Sharepoint Umgebung musste ich das Design der Netapp etwas verändern. Da der SnapManager SQL gerne eine qtree SnapVault Beziehung möchte war also folgendes zu machen:

qtree create /vol/volume1/qtree
lun move /vol/volume1/LUN1.lun /vol/volume1/qtree/LUN1.lun

Lun move funktioniert im laufenden Betrieb und unterbrechungsfrei!

Damit liegen sämtliche LUNs nun in einem Qtree. Was ich bis dahin nicht wusste. Beim lun move werden sämtliche Snapshot Metadaten verworfen. Eure SnapShots sind zwar noch da, können aber von den SnapManager Produkten nicht mehr erkannt werden.

Das ist in zweierlei Hinsicht schlecht. Zum Einen könnt ihr nicht mal eben mit einem SnapManger Daten wiederherstellen, zum Anderen schert sich der SnapManager einen feuchten Kehricht um Eure eingestellte Retentiontime für Snapshots. Da der SnapManager alle SnapShots vor dem „lun move“ nicht mehr sieht, wird er sie auch nicht nach Vorgabe Eurer Retentiontime löschen. Die Snapshots würden also für immer und Ewig in der Netapp verbeleiben und ziemlich viel Platz verbrauchen.

Ihr habt hier 2 Möglichkeiten:

  1. Ihr löscht jeden veralteten Snapshot per Hand. Und damit meine ich in der Console per snap delete, was je nach Größe der Umgebung und Anzahl von Volumes eine ziemliche Scheißarbeit sein kann.
  2. Ihr benutzt ein Script um Eure alten Snapshots zu löschen.

Voraussetzung ist ein installiertes Netapp Powershell Toolkit.

In diesem Beispiel wollen wir alle SnapShots finden und löschen, die älter als 30 Tage sind.

In der Powershell:

$30days = (get-date).adddays(-30)

Hiermit legen wir unsere Variable für die Anzahl der Tage fest.

connect-nacontroller MeineNetapp -Credential DerSchmitz -HTTP

Wir conntecten uns auf unsere Netapp. In dem Fall heißt das System MeineNetapp, als Benutzernamen nehmen wir DerSchmitz und verbinden uns über das HTTP Protokoll.

Dann lassen wir uns alle SnapShots anzeigen, die älter als 30 Tage sind und mit dem Wert „sql“ beginnen. Dabei ist es egal in welchem Volume oder Aggregat die Snapshots liegen. Es wird alles ausgelesen.

Get-Navol | Get-NaSnapshot | where-object
{ $_.name -like "sql*" -and $_.created -lt $30days }

Die Ausgabe sollte dann so aussehen:

 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
 snapshot sqlinfo__SQLSERVER01_08-08-2013_00.00.44__weekly

Danach wollen wir den ganzen Kram noch löschen und setzen hinter unser Statement einfach ein | remove-nasnapshot

Get-Navol | Get-NaSnapshot | where-object
{ $_.name -like "sql*" -and $_.created -lt $30days } | remove-nasnapshot

Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlsnap__SQLSERVER01_08-08-2013_00.00.44__weekly 
Deleting snapshot sqlinfo__SQLSERVER01_08-08-2013_00.00.44__weekly

Und schon sollten die verwaisten Snapshots aus der Netapp verschwinden.

Wenn ihr Fragen habt, schreibt mich einfach über die Kommentarfunktion an. Schöne Grüße und frohes Schaffen.

DerSchmitz

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.