none
DB Backup mit Powershell RRS feed

  • Frage

  • Hallo zusammen,

    ich versuch ein Backup von SQL Server 2008 R2 Express per powershell zu erstellen.

    Hier ist der Script: 

    $dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp 
    	    $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup")
    	    $dbBackup.Action = "Database"
    	    $dbBackup.Database = $DBName
    		$dbBackup.BackupSetDescription = "Full Backup of " + $DBName
    		$dbBackup.MediaDescription = "Disk"
    		$dbBackup.Checksum = "True"
    	    $dbBackup.Devices.AddDevice($BackupPathDB + "\" + $dbname + "_db_" + $dt + ".bak", "File")
    	    $dbBackup.SqlBackup($SQLServer)
    

    Bei kleinere DBs klappt es sehr gut. Bei DB >2GB bekomme ich folgende Fehler:

    Ausnahme beim Aufrufen von "SqlBackup" mit 1 Argument(en):  "Fehler bei Sichern für Server 'SERVER01\INSTANZ'. "

    Bei C:\Scripts\DB\SQLDBBackupFull.ps1:93 Zeichen:25

    +         $dbBackup.SqlBackup <<<< ($SQLServer)

        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException

        + FullyQualifiedErrorId : DotNetMethodException

    Event log von DB Server hat folgende Fehler:

    Fehler: 3041, Schweregrad: 16, Status: 1.

    Und

    BACKUP failed to complete the command BACKUP db_test. Check the backup application log for detailed messages.

    Die Eigenschaft “Timeout für Remoteabfragen”=0.

    Hat jemand schon solche Problem gehabt? Kann man bei Powershell detaillierte Information zu Fehle bekommen?

    Danke

    Freitag, 21. Juni 2013 12:20

Alle Antworten

  • Hallo Andrej,

    Grundsätzlich funktioniert ein Backup per PowerShell / SMO sehr gut; wenn man es manuell über SSMS durchführt, wird auch nichts anderes gemacht. Ich hatte auch mal ein PowerShell Script erstellt: Backup all databases, where the name matches a regex pattern; ist vom Code her gleich.

    Ohne genauere Fehlermeldung ist es wirklich schwer zu sagen, woran es liegt. Die kannst Du aber in PowerShell ganz einfach erhalten, indem Du einen Try / Catch Block verwendest und im Catch die Exception ausgibst, das geht so:

    $dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp 
    $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup")
    $dbBackup.Action = "Database"
    $dbBackup.Database = $DBName
    $dbBackup.BackupSetDescription = "Full Backup of " + $DBName
    $dbBackup.MediaDescription = "Disk"
    $dbBackup.Checksum = "True"
    $dbBackup.Devices.AddDevice($BackupPathDB + "\" + $dbname + "_db_" + $dt + ".bak", "File")
    
    try
    {
    	$dbBackup.SqlBackup($SQLServer)
    }
    catch
    {
    	Write-Host $_.Exception.Message
    }

    Wo ich 2 GB Größe lese, Du versuchst nicht zufällig auf einen USB Stick mit FAT16 zu sichern?

    Olaf Helper

    Blog Xing

    Mittwoch, 26. Juni 2013 06:00
  • Hallo Olaf,

    danke für deine Antwort. Es ist NTFS.

    Deine Code Erweiterung, bringt nicht weiter. Hier ist die Fehler:

    Ausnahme beim Aufrufen von "SqlBackup" mit 1 Argument(en):  "Fehler bei Sichern für Server 'SERVER01\INST01'. "

    Mittwoch, 26. Juni 2013 09:24
  • Kannst Du die Datenbank den manuell übers SSMS / per T-SQL sichern?

    Was gibt die InnerException aus, die ist noch etwas (viel) detailierter:

    catch
    {
        Write-Host $_.Exception.InnerException
    }


    Olaf Helper

    Blog Xing

    Mittwoch, 26. Juni 2013 11:01
  • Per T-SQL geht es. Ca 12 Min.

    Fehler deutet an Timeout:

    Ausnahme beim Aufrufen von "SqlBackup" mit 1 Argument(en):  "Fehler bei Sichern für Server 'SERVER01\INST'. "
    Microsoft.SqlServer.Management.Smo.FailedOperationException: Fehler bei Sichern für Server 'SERVER01\INST'.  --->
     Microsoft.SqlServer.Management.Common.ExecutionFailureException: Ausnahme beim Ausführen einer Transact-SQL-Anweisung o
    der eines Transact-SQL-Batches. ---> System.Data.SqlClient.SqlException: Timeout ist abgelaufen. Das Zeitlimit wurde vor
     dem Beenden des Vorgangs überschritten oder der Server reagiert nicht.
    Die Sicherung oder Wiederherstellung wurde abgebrochen.
    10 Prozent verarbeitet.
    20 Prozent verarbeitet.
    30 Prozent verarbeitet.
    40 Prozent verarbeitet.
       bei Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject,
    DataSet fillDataSet, Boolean catchException)
       bei Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executio
    nType)
       --- Ende der internen Ausnahmestapelüberwachung ---
       bei Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executio
    nType)
       bei Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTyp
    es executionType)
       bei Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queries)
       bei Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(Server server, StringCollection queries)
       bei Microsoft.SqlServer.Management.Smo.Backup.SqlBackup(Server srv)
       --- Ende der internen Ausnahmestapelüberwachung ---
       bei Microsoft.SqlServer.Management.Smo.Backup.SqlBackup(Server srv)
       bei SqlBackup(Object , Object[] )
       bei System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInforma
    tion methodInformation, Object[] originalArguments)

    Mittwoch, 26. Juni 2013 12:02
  • Hallo Andrej,

    das ist merkwürdig, zumal man (meine Wissens) in SMO nirgends für die Managemant-Funktionen ein CommandTimeout angeben kann; Timeout ist immer 0 = unendlich.

    Welche Version von SMO verwendest Du? Vielleicht löst es sich von selbst, wenn Du die aktuellste Version für 2008R2 verwendest, gibt es zum Download im Microsoft® SQL Server® 2008 R2 SP2 Feature Pack


    Olaf Helper

    Blog Xing

    Donnerstag, 27. Juni 2013 06:21
  • Hallo Olaf,

    die Ursache für mein Problem habe ich gefunden. Auf mein SAN ist zu viele IOs, deswegen kommt es bei sichern zu Timeout.

    Aber es soll SQL Server nicht stören.

    Ich nutze Powershell 2.0 und SQL 2008 10.50.2500.0. Wo kann man genauer Version von SMO ermitteln?

     

    Freitag, 28. Juni 2013 07:09
  • Wo kann man genauer Version von SMO ermitteln?

    Rechte Maus auf die DLL => Eigenschaften => Details

    Die DLL liegt z.B für SQL Server 2012 in
    C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll


    Olaf Helper

    Blog Xing

    Freitag, 28. Juni 2013 09:08
  • Rechte Maus auf die DLL => Eigenschaften => Details

    Die DLL liegt z.B für SQL Server 2012 in
    C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll

    10.50.1600.1
    Montag, 1. Juli 2013 11:03