DPM – OffsiteReady Tapes werden angezeigt für defekte/entfernte Library

Eure Library wurde getauscht und ihr habt eine neue bekommen.
Jetzt tauchen im Tape Management Report ständig Bänder auf, die Offsite Ready sind, aber als Location die alte bereits entfernte Library haben. Damit der Tape Report jetzt nur noch  die neuen Tapes aus der neuen Library anzeigt muss einfach nur der entsprechende Eintrag für das entsprechende Tape in der Datenbank geändert werden.

Also Backup der DPM Datenbank ziehen, Management Studio mit erweiterten Rechten starten und folgendes SQL Skript laufen lassen:

Update [DPMDB].[dbo].[tbl_MM_Media] set location=’0′ where BarcodeValue=’CRC045L3′

Die BarcodeValue natürlich mit dem entsprechenden Tape ersetzen.

Damit denkt DPM dass das Tape nicht mehr in der Library ist, sondern offsite.

OffsiteReady Bänder mit Powershell ausgeben

Wir haben von einem unserer Leser eine Frage bekommen. Er möchte die Bänder, die rausgenommen werden können, per Powershell einfach ausgeben anstatt jedes Mal den Tape Report zu bemühen.

Das lässt sich in Powershell mit wenigen Zeilen erledigen:

$Tapes = Get-Tape -DPMLibrary EureLibraryName
$Tapes | Where-Object {$_.isOffsiteReady} | format-table Location, Barcode, isOffsiteReady

In der ersten Zeile füllen wir die Variable $Tapes mit den Tapeinformationen eurer Library. Habt ihr mehr als eine Library, dann benutzt auch hier eine Variable wie z.B. $Libraries und füllt diese mit den Namen eurer Libraries:

$Libraries = Get-DPMLibrary -dpmservername Servername

In der zweiten Zeile oben geben wir dann nur die Tapes aus, die Offsite Ready sind und formatieren sie nach Location, Bezeichnung und OffsiteReady.

Wollt ihr die Ausgabe sortieren, z.B. nach Slots (Location) oder nach Barcode, dann fügt ihr einfach noch eine Pipe gleich nach der Ausgabe mit dem Befehl:

sort-object Spalte

Um also z.B. nach Slots zu sortieren lautet der volle Befehl:

$Tapes | sort-object Location | Where-Object {$_.isOffsiteReady} | format-table Location, Barcode, isOffsiteReady

Unserem Leser ist damit geholfen und es interessiert sicher noch mehr Leser hier.

Schreibt uns was euch interessiert und wir greifen es gerne auf!

Überfällige Bänder aus der Datenbank entfernen (DPM 2010)

Oftmals gibt es das Problem, dass Bänder im Tape Report auftauchen, die eigentlich nicht mehr verwendet werden sollen oder können.
Diese tauchen jedoch bei jedem Report erneut auf und können über die GUI nicht gelöscht werden.

Um die Bänder zu entfernen ist es notwendig sie in der Datenbank zu löschen. Bisher habe ich das SQL Command jedoch nur für die MS DPM 2010  Datenbank verwendet. Über eine Info ob es auch im DPM 2012 klappt würden wir uns freuen.
Bitte denkt immer daran vor Eingriffen in die Datenbank ein Backup zu machen 😉

Um das Command aus zu führen öffnet ihr das SQL Management Studio und verbindet euch auf die SQL DB Meist

localhost\MSDPM2010

Als nächstes Müsst ihr eine neue SQL Abfrage ( SQL Query) erstellen:

New SQL Query

Nun einfach die folgende Abfrage kopieren und entsprechend wie folgt anpassen:

den ´TAPE LABEL NAME´ zwischen den 2 ‚ anpassen mit dem Tape Label Namen den ihr löschen wollt.
Es empfiehlt sich den Namen vorher aus dem DPM Tape Report zu kopieren, damit Fehler vermieden werden.

Bitte beachtet das es sich hierbei nicht um den Namen auf dem Tape sondern den Tape Label Namen auf dem Tape Report von DPM handelt der entsprechend gelöscht/eingetragen werden muss.

———- START COPY HERE ————-

— overdue tapes
— for clarity, set up the parameter as a variable
declare @paramTapeLabel as nvarchar(256)
set @paramTapeLabel = N’TAPE LABEL NAME‘

— keys
declare @vMediaId as guid
declare @vGlobalMediaId as guid

— if the delete gives trouble, add keyset after cursor
declare cur_label cursor
for select MediaId, GlobalMediaId
from tbl_MM_Media
where label = @paramTapeLabel;

open cur_label
while (0 = 0)
begin
fetch next from cur_label into @vMediaId, @vGlobalMediaId
— test for being done
if @@fetch_status <> 0 break;

print ‚Deleting MediaId = ‚ + cast(@vMediaId as varchar(36))
— do a set of deletes atomically
begin transaction;
delete from tbl_MM_TapeArchiveMedia
where MediaId = @vMediaId;

delete from tbl_MM_MediaMap
where MediaId = @vMediaId;

delete from tbl_MM_ArchiveMedia
where MediaId = @vMediaId;

delete from tbl_MM_Global_ArchiveMedia
where MediaId = @vGlobalMediaId;

delete from tbl_MM_Global_Media
where MediaId = @vGlobalMediaId;

delete from tbl_MM_Media
where current of cur_label;

commit transaction;

end
close cur_label
deallocate cur_label

————– END COPY HERE ———————-

 

Tapereport zeigt keine Expired Tapes mehr an nach Update auf DPM 2012

Die Amerikaner arbeiten ja nicht so viel mit Bändern wie wir Europäer, daher ist ihnen dieser Bug vermutlich einfach nicht aufgefallen. DPM bietet ja einen Report, der einem anzeigt welche Bänder entnommen werden können und welche nun fällig bzw. überfällig sind und in die Library eingelegt werden sollten.

Dieser Report funktioniert nicht mehr korrekt nach einem Update auf DPM 2012. Bei uns hat sich das so geäußert, dass nur Bänder angezeigt wurden, die sich zum Zeitpunkt des Updates in der Tapelibrary befunden haben. Sämtliche Informationen über in der Zukunft ablaufende Tapes fehlten, obwohl wir diese Informationen in der DPM 2012 Datenbank durchaus finden konnten. Wir haben dies Microsoft gemeldet. Allerdings wurde dort bislang keine Lösung gefunden. Also haben wir uns tiefer damit beschäftigt und haben den Fehler gefunden und stellen hier einen Workaround zur Verfügung mit dem man sich behelfen kann, bis Microsoft hierfür einen Fix bereitstellt.

Der Tapereport benutzt einen Datenbankview in der DPM Datenbank mit dem Namen dbo.vw_DPM_Media:

Dieser Datenbankview zeigt bei uns unterschiedliche Ergebnisse, je nachdem ob wie die Datenbank von DPM2010 oder von DPM2012 benutzen. Also haben wir uns angeschaut ob der View sich geändert hat. Allerdings ist dieser gleich in beiden Versionen:

SELECT DISTINCT
 Media.SlotNum + 1 AS MediaSlotNumber, Media.BarcodeValue AS MediaBarcode, Media.Label AS MediaLabel, Media.Location AS IsOnline,
 Library.UserFriendlyName AS LibraryName, dbo.ufn_MM_GetPgLabels(Media.MediaId) AS ProtectedGroupName, MAX(Dataset.ExpiryDate) AS MediaExpiryDate
FROM dbo.tbl_MM_Media AS Media INNER JOIN
 dbo.tbl_MM_ArchiveMedia AS ArchiveMedia ON ArchiveMedia.MediaId = Media.MediaId INNER JOIN
 dbo.tbl_MM_MediaMap AS MediaMap ON MediaMap.MediaId = ArchiveMedia.MediaId INNER JOIN
 dbo.tbl_MM_PhysicalDataset AS Dataset ON Dataset.DatasetId = MediaMap.DatasetId LEFT OUTER JOIN
 dbo.tbl_MM_Library AS Library ON Library.LibraryId = Media.LibraryId
WHERE (Dataset.LifeStatus = 1 OR
 Dataset.LifeStatus = 2) AND (Dataset.Vault = 1 OR
 Dataset.Vault = 3 OR
 Dataset.Vault = 4 OR
 Dataset.Vault = 5) AND (dbo.ufn_MM_IsOffsiteReadyTape(Media.MediaId) = 1)
GROUP BY Media.SlotNum, Media.BarcodeValue, Media.Label, Media.Location, Library.UserFriendlyName, dbo.ufn_MM_GetPgLabels(Media.MediaId)

Also sind wir noch einen Schritt tiefer gegangen und haben uns die Funktionen dazu angeschaut und sind dabei fündig geworden. Die Funktion dbo.ufn_MM_IsOffsiteReadyTape ist nicht vollständig übernommen werden. Die Funktion findet sich in beiden Datenbanken unter Functions -> Scalar-valued Function:

Diese Funktion sieht in DPM 2012 so aus:

USE [DPMDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[ufn_MM_IsOffsiteReadyTape](@MediaId Guid)
RETURNS bit
AS
BEGIN
 DECLARE @IsOffsiteReady bit;

 SELECT @IsOffsiteReady = OffsiteReady
 FROM tbl_MM_ArchiveMedia
 WHERE MediaId = @MediaId

 RETURN @IsOffsiteReady;
END

während sie in der vorherigen Version DPM 2010 deutlich länger ist und wie man am Code sieht auch deutlich mehr macht:

USE [DPMDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[ufn_MM_IsOffsiteReadyTape](@MediaId Guid)
RETURNS bit
AS
BEGIN
 DECLARE @OptimizeTapeUsage bit
 DECLARE @CurrentDateTime DateTime
 DECLARE @WritePeriodRatio float
 DECLARE @IsOffsiteReady bit
SET @CurrentDateTime = GetUTCDate()
 SET @IsOffsiteReady = 0;
SELECT @OptimizeTapeUsage = CAST(CAST (PropertyValue as NVarChar(10))as bit)
 FROM dbo.tbl_DLS_GlobalSetting
 WHERE PropertyName = N'OptimizeTapeUsage'
IF(@OptimizeTapeUsage IS NULL)
 BEGIN
 SET @OptimizeTapeUsage = 0
 END
 ELSE
 BEGIN
 SELECT @WritePeriodRatio = CAST(CAST (PropertyValue as NVarChar(256))as float)
 FROM dbo.tbl_DLS_GlobalSetting
 WHERE PropertyName = N'TapeWritePeriodRatio'
...... gekürzt (vollständige Version -> siehe DPM2010 DB) .......
 WHERE Media.MediaId = @MediaId AND
 (Dataset.LifeStatus = 1 OR Dataset.LifeStatus = 2) AND -- 0=BeingCreated, 1=Created, 2=Reclaimed, 3=Invalid, 4=intermediate
 (Dataset.Vault = 1 OR Dataset.Vault = 3 OR Dataset.Vault = 4 OR Dataset.Vault = 5) --1 = offsite, 3 = offsite1, 4 = offsite2, 5 = offsite3
 )
 BEGIN
 SET @IsOffsiteReady = 1
 END
 END
 RETURN @IsOffsiteReady;
END

Workaround ist also einfach die Funktion aus der DPM 2010 Datenbank kopieren und damit die Funktion in der DPM 2012 Datenbank überschreiben.

Anschließend zeigt der Datenbankview dbo.vw_DPM_Media wieder korrekte Ergebnisse und da dieser die Basis des Tapereports ist, wird auch im Tapereport wieder die richtigen Bänder angezeigt.

Wer Hilfe braucht beim Umsetzen: einfach melden.