2017-06-16 35 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配置管理器中的帳戶的功能。 –

相關問題