111 lines
3.5 KiB
PowerShell
111 lines
3.5 KiB
PowerShell
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"
|
|
}
|
|
|