Fragensteller
DB Backup mit Powershell

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
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 -
Hallo,
bist Du hier weitergekommen?
Gruss,
RaulRaul Talmaciu, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
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) -
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 -
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?
-