Files
DBAdmin/toolbox/s3_backup_transfer.ps1
T
Paweł Domański c0149d6ea7 Jul 2, 2026, 7:45 AM
2026-07-02 05:45:53 +00:00

78 lines
3.4 KiB
PowerShell

<#
.SYNOPSIS
Skrypt do bezpiecznego przenoszenia backupów SQL na S3 przy użyciu rclone.
.DESCRIPTION
Używa operacji 'rclone move', aby najpierw bezpiecznie skopiować pliki na S3,
zweryfikować je, a następnie usunąć z lokalnego dysku serwera.
W przypadku błędu raportuje zdarzenie do Windows Event Log.
#>
$ErrorActionPreference = "Stop"
# ========================================================
# KONFIGURACJA
# ========================================================
$RcloneExePath = "C:\ProgramData\chocolatey\bin\rclone.exe" # Zmień na właściwą ścieżkę do rclone.exe
$SourceDir = "C:\SQLBackups" # Katalog główny z backupami baz danych
$S3Destination = "s3-backup-remote:nazwa-twojego-bucketa/SQLBackups/$(env:COMPUTERNAME)"
$LogDir = "C:\DBAdmin\logs"
$LogFile = Join-Path $LogDir "rclone_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
# Upewnij się, że katalog logów istnieje
if (-not (Test-Path $LogDir)) {
New-Item -Path $LogDir -ItemType Directory -Force | Out-Null
}
# ========================================================
# URUCHOMIENIE TRANSFERU
# ========================================================
Write-Host "Rozpoczynam proces bezpiecznego przenoszenia backupów z $SourceDir do $S3Destination..."
# Parametry zapewniające niezawodność:
# move - Przenosi (kopiuje, weryfikuje, kasuje oryginał)
# --checksum - Bezwzględnie weryfikuje sumy kontrolne po skopiowaniu
# --retries 5 - Przy błędzie sieci ponawia do 5 razy
# --retries-sleep 15s - Oczekiwanie między powtórzeniami
# --delete-empty-src-dirs - Usuwa foldery, z których opróżniono wszystkie backupy
$RcloneArgs = @(
"move", $SourceDir, $S3Destination,
"--checksum",
"--retries", "5",
"--retries-sleep", "15s",
"--delete-empty-src-dirs",
"--log-file=$LogFile",
"--log-level=INFO"
)
# Uruchomienie rclone
& $RcloneExePath $RcloneArgs
$RcloneExitCode = $LASTEXITCODE
# ========================================================
# WERYFIKACJA I ALERTOWANIE
# ========================================================
# Rejestracja źródła w EventLog, jeśli nie istnieje (wymaga praw admina przy pierwszym uruchomieniu)
$EventSource = "SQLBackupToS3"
if (-not [System.Diagnostics.EventLog]::SourceExists($EventSource)) {
try {
New-EventLog -LogName Application -Source $EventSource
} catch {
Write-Warning "Nie udało się utworzyć źródła zdarzeń. Prawdopodobnie brak uprawnień administratora."
}
}
if ($RcloneExitCode -eq 0) {
$successMsg = "Pomyślnie przeniesiono backupy SQL na S3. Log: $LogFile"
Write-Host $successMsg -ForegroundColor Green
try { Write-EventLog -LogName Application -Source $EventSource -EntryType Information -EventId 1000 -Message $successMsg } catch {}
} else {
$errorMsg = "BŁĄD KRYTYCZNY: Nie udało się przenieść wszystkich backupów SQL na S3. Kod wyjścia rclone: $RcloneExitCode. Szczegóły sprawdź w logu: $LogFile"
Write-Host $errorMsg -ForegroundColor Red
try { Write-EventLog -LogName Application -Source $EventSource -EntryType Error -EventId 1001 -Message $errorMsg } catch {}
# [Opcjonalnie] Tutaj możesz dodać skrypt wysyłający maila lub webhook (Teams/Slack):
# Invoke-RestMethod -Uri "WEBHOOK_URL" -Method Post -Body (@{text=$errorMsg} | ConvertTo-Json)
}