【问题标题】:How do I backup my mssql database using powershell如何使用 powershell 备份我的 mssql 数据库
【发布时间】:2015-05-17 07:32:02
【问题描述】:

每当我运行我的 powershell 脚本来备份我的数据库时,我都会不断收到此错误。我似乎无法弄清楚问题是什么。任何帮助将不胜感激。

Exception calling "SqlBackup" with "1" argument(s): "Backup failed for Server 'MyServer'. "
At C:\Users\hp1\Desktop\scripts\backup.ps1:28 char:5
+     $smoBackup.SqlBackup($server)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FailedOperationException

我的powershell脚本如下所示:

param(
    $serverName,
    $backupDirectory,
    $daysToStoreBackups
)

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $serverName
$dbs = $server.Databases
foreach ($database in $dbs | where { $_.IsSystemObject -eq $False })
{
    if($db.Name -ne "tempdb") #We don't want to backup the tempdb database 
     {
    $dbName = $database.Name

    $timestamp = Get-Date -format yyyy-MM-dd-HHmmss
    $targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + ".bak"

    $smoBackup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup")
    $smoBackup.Action = "Database"
    $smoBackup.BackupSetDescription = "Full Backup of " + $dbName
    $smoBackup.BackupSetName = $dbName + " Backup"
    $smoBackup.Database = $dbName
    $smoBackup.MediaDescription = "Disk"
    $smoBackup.Devices.AddDevice($targetPath, "File")
    $smoBackup.SqlBackup($server)
    }
    #"backed up $dbName ($serverName) to $targetPath"
}

Get-ChildItem "$backupDirectory\*.bak" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreBackups)} |% {Remove-Item $_ -force }
"removed all previous backups older than $daysToStoreBackups days"

【问题讨论】:

  • PowerShell 没有比这更好的错误处理了吗?为什么所有 SMO 都是垃圾而不是简单的 Backup-SqlDatabase

标签: sql-server powershell powershell-2.0 database-backups


【解决方案1】:

我发现了问题。它与 SQL Server 服务帐户的目标文件夹的权限有关。备份时的一个常见问题是检查 SQL Server 服务帐户是否具有访问目标的正确权限。 PowerShell 只是将 T-SQL 提交给 SQL Server 执行,因此运行脚本的帐户必须具有必要的权限。一旦我给它读/写一切都很好

【讨论】:

  • 在一般情况下,您可以通过分解异常来进一步检查错误。幸运的是,Powershell 将所有异常都存储在 $Error 变量中。我喜欢做的一件事是在这样的脚本失败后立即使用 $e = $error[0]; $e.Exception.InnerException 并继续链接对 InnerException 的调用,直到我得到有意义的东西或直到我用完为止。
  • 另外,如果您正在更改保存备份文件的共享网络文件夹 ($backupDirectory) 的权限,请不要忘记重新启动您的电脑,否则您将继续收到如下错误:Microsoft.SqlServer.Management.Smo .FailedOperationException:服务器“MYSERV”的备份失败。 ---> Microsoft.Sql Server.Management.Common.ExecutionFailureException:执行 Transact-SQL 语句或批处理时发生异常。 ---> System.Data.SqlClient.SqlException:无法打开备份设备“\\FOLDER\foldernew\baza_2017_06_07_03_41.bak”。操作系统错误 5(访问被拒绝。)
【解决方案2】:

mkdir D:\kings Invoke-Sqlcmd -Query "备份数据库尼拉姆赛奈杜 到磁盘='D:\kings\Neelammss.BAK'" -ServerInstance MSWORK-PC -Database Neelamsainaidu

【讨论】:

  • 请详细一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2010-10-25
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多