param( [Parameter(Mandatory=$true)] [string]$SqlInstance ) # # backup.ps1 # # TODO: Update cleanup time based on backup type $instanceName = $SqlInstance.Split('\')[1] $directory = "C:\Rubrik\$instanceName" $fullBackupDay = 'Thursday' $checkCluster = $false $logFile = "C:\Rubrik\backup-$instanceName.log" $fullFlag = $directory + "\last_full.flag" $diffFlag = $directory + "\last_diff.flag" $today = (Get-Date).Date function FlagTakenToday($flagPath) { if (Test-Path $flagPath) { $flagDate = (Get-Content $flagPath | Out-String).Trim() return ($flagDate -eq $today.ToString("yyyy-MM-dd")) } return $false } function Write-Log($message) { $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logEntry = "$timestamp $message" Add-Content -Path $logFile -Value $logEntry Write-Host $logEntry } # Check if directory exists and is a symbolic link if (-not (Test-Path $directory)) { Write-Log "ERROR: Directory '$directory' does not exist. Exiting script." exit 1 } $directoryInfo = Get-Item $directory if (-not ($directoryInfo.Attributes -band [System.IO.FileAttributes]::ReparsePoint)) { Write-Log "ERROR: Directory '$directory' is not a symbolic link. Exiting script." exit 1 } Write-Log "INFO: Directory '$directory' exists and is a symbolic link. Target: $($directoryInfo.Target). Proceeding." if ($checkCluster) { # Check if SQL instance is running locally $localNode = $env:COMPUTERNAME $clusterInstance = Get-ClusterResource | Where-Object { $_.ResourceType -eq "SQL Server" -and $_.Name -eq "SQL Server ($instanceName)" } if ($clusterInstance) { $ownerNode = $clusterInstance.OwnerNode.Name if ($ownerNode -ne $localNode) { Write-Log "SQL instance '$SqlInstance' is not running on local node '$localNode'. Exiting script." exit 1 } else { Write-Log "SQL instance '$SqlInstance' is running on local node '$localNode'. Proceeding." } } else { Write-Log "ERROR: SQL instance '$SqlInstance' not found in cluster resources." exit 1 } } else { Write-Log "INFO: Cluster check is disabled. Proceeding without verification." } if ((Get-Date).DayOfWeek -eq $fullBackupDay) { if (-not (FlagTakenToday $fullFlag)) { $backupType = "FULL" $cleanupTime = 168 Set-Content $fullFlag $today.ToString("yyyy-MM-dd") Write-Log "Selected FULL backup. Flag updated." } else { $backupType = "LOG" $cleanupTime = 24 Write-Log "FULL backup already taken today. Selected LOG backup." } } else { if (-not (FlagTakenToday $diffFlag)) { $backupType = "DIFF" $cleanupTime = 168 Set-Content $diffFlag $today.ToString("yyyy-MM-dd") Write-Log "Selected DIFF backup. Flag updated." } else { $backupType = "LOG" $cleanupTime = 24 Write-Log "DIFF backup already taken today. Selected LOG backup." } } $query = "EXECUTE [dbo].[DatabaseBackup] @Databases = 'ALL_DATABASES', @Directory = '$directory', @BackupType = '$backupType', @Verify = 'N', @CleanupTime = $cleanupTime, @CheckSum = 'Y', @LogToTable = 'Y'" Write-Log "Executing backup type: $backupType" $sqlcmdOutput = & sqlcmd -S $SqlInstance -Q $query 2>&1 $sqlcmdExitCode = $LASTEXITCODE if ($sqlcmdExitCode -eq 0) { foreach ($line in $sqlcmdOutput) { Write-Log $line } Write-Log "$backupType Backup execution completed." } else { Write-Log "ERROR: Backup execution failed. Exit code: $sqlcmdExitCode. Output: $sqlcmdOutput" }