【问题标题】:Powershell backup script not making weekly backupsPowershell 备份脚本不进行每周备份
【发布时间】:2017-06-13 08:49:55
【问题描述】:

所以我有以下代码应该每天、每周和每月备份每个数据库。每日备份工作正常,但似乎无法创建每周或每月备份。

脚本的数据库连接部分如下所示:

$serverName = "."
$backupDirectory = "\\SERVER\BACKUP"
$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 = "myPAssword"

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

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

脚本的每日和每周部分如下所示:

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})
    {
        if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB")
        {
            $dbName = $database.Name      

            $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"
        }                   
    }
}

我以为它会在星期日创建每周备份,但那没有发生。

【问题讨论】:

  • 打赌最后的每日备份输出是“已跳过 ReportServerTempDB 备份”?如果是这样的话,请继续周日发生的事情..
  • 感谢您的回复,是的,您是正确的,我更改了 dayOfWeek = 2,它似乎只是跳过了每周备份。在每周和每月的工作中删除 if else 块。但它当然也备份了我并不真正想要的 ReportServer 数据库。
  • 好的,那我已经回答了。

标签: sql-server powershell


【解决方案1】:

在你拥有的每日区块中

$dbName = $database.Name      

if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB")
{

但在每周块中,你有

if ($dbName -ne "ReportServer" -and $dbName -ne "ReportServerTempDB")
{
    $dbName = $database.Name      

dbName 在设置之前被检查。如果检查失败,则永远不会为任何数据库设置它。

如果您的代码从保留为“ReportServerTempDB”的每日块值中出来,它将永远不会通过每周块中的if 测试,并且dbName 不会更改,因此不会备份任何内容。

a) 将 $dbName = $database.Name 赋值移到 if 上方

b) 或使用$database.Name directly

c) 或者没有大块的复制粘贴代码,它们必须相同,但最终可能会有所不同。而是将重复的块移动到一个函数并从两个位置调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2017-08-16
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多