Files
lehuo/infra/backup/restore-mysql.ps1
2026-08-12 14:35:12 +08:00

16 lines
1.2 KiB
PowerShell

param([Parameter(Mandatory=$true)][string]$BackupFile,[Parameter(Mandatory=$true)][string]$TargetDatabase)
$ErrorActionPreference='Stop'
if(-not $env:DATABASE_URL){throw 'DATABASE_URL is required'}
if($TargetDatabase -notmatch '^[A-Za-z0-9_]+$'){throw 'TargetDatabase contains invalid characters'}
$file=(Resolve-Path -LiteralPath $BackupFile).Path
$checksum="$file.sha256"
if(-not(Test-Path -LiteralPath $checksum)){throw 'checksum file is required'}
$expected=(Get-Content -LiteralPath $checksum).Split(' ')[0]
if((Get-FileHash -Algorithm SHA256 -LiteralPath $file).Hash.ToLowerInvariant() -ne $expected){throw 'backup checksum mismatch'}
$uri=[Uri]$env:DATABASE_URL;$credential=$uri.UserInfo.Split(':',2);$env:MYSQL_PWD=[Uri]::UnescapeDataString($credential[1]);$user=[Uri]::UnescapeDataString($credential[0])
& mysql --host $uri.Host --port $uri.Port --user $user --execute "CREATE DATABASE IF NOT EXISTS ``$TargetDatabase`` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
if($LASTEXITCODE -ne 0){throw 'target database creation failed'}
Get-Content -LiteralPath $file -Raw | & mysql --host $uri.Host --port $uri.Port --user $user $TargetDatabase
if($LASTEXITCODE -ne 0){throw 'restore failed'}
Write-Output "Restore completed into $TargetDatabase"