2017-06-16 116 views
0

我有以下脚本:SQL Server备份脚本(PowerShell中)的作品2016服务器上,但不是2012

$serverName = "." 
$backupDirectory = "\\backup\server1" 
$daysToStoreDailyBackups = 7 
$daysToStoreWeeklyBackups = 28 
$monthsToStoreMonthlyBackups = 3 

[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 

$mySrvConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection 
$mySrvConn.ServerInstance=$serverName 
$mySrvConn.LoginSecure = $false 
$mySrvConn.Login = "sa" 
$mySrvConn.Password = "myPass" 

$server = new-object Microsoft.SqlServer.Management.SMO.Server($mySrvConn) 

$dbs = $server.Databases 
$startDate = (Get-Date) 
"$startDate" 

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

foreach ($database in $dbs | where {$_.IsSystemObject -eq $False}) 
{ 
    $dbName = $database.Name  

    if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB") 
    { 
     $timestamp = Get-Date -format yyyy-MM-dd-HHmmss 
     $targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + "_daily.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"  
    } 
    else 
    { 
     "$dbName backup skipped" 
    } 
} 

if([Int] (Get-Date).DayOfWeek -eq 0) 
{ 
    Get-ChildItem "$backupDirectory\*_weekly.bak" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreWeeklyBackups)} |% {Remove-Item $_ -force } 
    "removed all previous daily backups older than $daysToStoreWeeklyBackups days" 

    foreach ($database in $dbs | where { $_.IsSystemObject -eq $False}) 
    { 
     $dbName = $database.Name 

     if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB") 
     {  
      $timestamp = Get-Date -format yyyy-MM-dd-HHmmss 
      $targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + "_weekly.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" 
     } 
     else 
     { 
      "$dbName backup skipped" 
     }     
    } 
} 

if([Int] (Get-Date).Day -eq 1) 
{ 
    Get-ChildItem "$backupDirectory\*_monthly.bak" |? { $_.lastwritetime -le (Get-Date).AddMonths(-$monthsToStoreMonthlyBackups)} |% {Remove-Item $_ -force } 
    "removed all previous monthly backups older than $monthsToStoreMonthlyBackups days" 

    foreach ($database in $dbs | where { $_.IsSystemObject -eq $False}) 
    { 
     $dbName = $database.Name 

     if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB") 
     { 
      $timestamp = Get-Date -format yyyy-MM-dd-HHmmss 
      $targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + "_monthly.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" 
     } 
     else 
     { 
      "$dbName backup skipped" 
     }    
    } 
} 

这工作完全在我的服务器(运行服务器2016),其他(正在运行的服务器2012的一个)它没有,它给我以下错误:

Exception calling "SqlBackup" with "1" argument(s): "Backup failed for Server 'Server1'. " 
At C:\Users\Administrator\Documents\Scripts\sqlFullBackup.ps1:43 char:9 
+   $smoBackup.SqlBackup($server) 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FailedOperationException 

任何想法如何解决这个问题?

在此先感谢

---编辑-----------------------------

运行时

$error[0] | fl -force 

我得到如下:

System.Data.SqlClient.SqlException: Cannot open backup device '\\ServerAddress\Folder\file_2017-06-17-110451_daily.bak'. Operating system error 5(Access is denied.). 

回答

1

我测试脚本的SQL Server 2012和成功备份到本地文件夹。

你的脚本工作正常。

尝试(测试)备份到服务器上的本地文件夹。

确保:

  • 您安装的Microsoft SQL Server 2012(与SMO)的Microsoft Windows PowerShell的扩展。 有关详细信息,请阅读我的答案:What do I need to execute a SQL Server PowerShell module

  • 您的服务器具有对共享文件夹“\\ backup \ server1”的访问权限。 在服务器2012,设置MSSQLSERVER帐户对共享文件夹 “\\备份\ server1的” 许可R/W

编辑:

从您的评论中,脚本是以做工精细本地文件夹。 所以,问题是共享文件夹的设置。

在工作组环境

如果你的SQL Server 2012在工作组环境下工作:

  • 创建两个SQL使用相同的密码相同的窗口用户帐户(例如, 'sql2012')服务器2012和备份服务器(使用计算机管理器)。

  • 将此帐户(sql2012 /密码)设置为运行sql服务的帐户(使用Sql Server配置管理器工具)。

  • 在备份服务器设置权限的共享文件夹,完全R/W的帐户sql2012

在域环境中

  • 使用域帐户的帐户运行sql服务(使用Sql Server Configuration Manager工具)

  • 在备份服务器集共享文件夹Full R/W中的权限授予该域帐户。

+0

呀它的工作原理到本地文件夹,我不能添加MSSQLSERVER作为许可作为备份服务器不具有SQL Server安装 –

+0

什么环境中的服务器2012年的工作:工作组或域?是SQL服务器服务帐户是内置帐户或用户帐户(从Sql Server配置管理器)? –

+0

啊,非常感谢你的工作。它在一个工作组上,改变了SQL配置管理器中的帐户的功能。 –

相关问题