136 lines
4.1 KiB
PowerShell
136 lines
4.1 KiB
PowerShell
# 完整的导出和下载脚本(Windows PowerShell)
|
||
# 使用方法:.\export-and-download.ps1
|
||
|
||
param(
|
||
[string]$ServerIP = "192.168.58.20",
|
||
[string]$ServerUser = "root",
|
||
[string]$DBHost = "192.168.58.20",
|
||
[string]$DBUser = "gongxiangpan",
|
||
[string]$DBPass = "gongxiangpan123",
|
||
[string]$DBName = "lobechat",
|
||
[string]$Container = "flnxi-material",
|
||
[string]$LocalDir = ".\backups"
|
||
)
|
||
|
||
Write-Host "=========================================="
|
||
Write-Host " PostgreSQL 一键导出下载工具"
|
||
Write-Host "=========================================="
|
||
Write-Host ""
|
||
|
||
# 创建本地备份目录
|
||
if (!(Test-Path $LocalDir)) {
|
||
New-Item -ItemType Directory -Path $LocalDir | Out-Null
|
||
Write-Host "✅ 创建本地目录: $LocalDir"
|
||
}
|
||
|
||
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
||
$RemoteFile = "/tmp/lobechat_backup_$Timestamp.sql"
|
||
$LocalFile = Join-Path $LocalDir "lobechat_backup_$Timestamp.sql"
|
||
|
||
Write-Host "[1/6] 检查容器状态..."
|
||
$CheckContainer = "ssh ${ServerUser}@${ServerIP} 'docker ps | grep $Container'"
|
||
$ContainerRunning = Invoke-Expression $CheckContainer 2>$null
|
||
|
||
if (!$ContainerRunning) {
|
||
Write-Host "❌ 容器未运行: $Container"
|
||
exit 1
|
||
}
|
||
Write-Host "✅ 容器运行中"
|
||
|
||
Write-Host ""
|
||
Write-Host "[2/6] 安装 PostgreSQL 客户端..."
|
||
$InstallCmd = "ssh ${ServerUser}@${ServerIP} 'docker exec -u root $Container apk add --no-cache postgresql-client 2>&1 | grep -q OK && echo SUCCESS || echo ALREADY'"
|
||
Invoke-Expression $InstallCmd | Out-Null
|
||
Write-Host "✅ 客户端就绪"
|
||
|
||
Write-Host ""
|
||
Write-Host "[3/6] 导出数据库..."
|
||
$ExportCmd = @"
|
||
ssh ${ServerUser}@${ServerIP} "docker exec -u root -e PGPASSWORD='$DBPass' $Container pg_dump -h $DBHost -U $DBUser -d $DBName > $RemoteFile && echo SUCCESS || echo FAILED"
|
||
"@
|
||
|
||
$ExportResult = Invoke-Expression $ExportCmd
|
||
|
||
if ($ExportResult -match "FAILED") {
|
||
Write-Host "❌ 导出失败"
|
||
exit 1
|
||
}
|
||
Write-Host "✅ 导出成功"
|
||
|
||
Write-Host ""
|
||
Write-Host "[4/6] 压缩文件..."
|
||
$CompressCmd = "ssh ${ServerUser}@${ServerIP} 'gzip $RemoteFile && echo SUCCESS'"
|
||
$CompressResult = Invoke-Expression $CompressCmd
|
||
|
||
if ($CompressResult -match "SUCCESS") {
|
||
$RemoteFile = "$RemoteFile.gz"
|
||
$LocalFile = "$LocalFile.gz"
|
||
Write-Host "✅ 压缩完成"
|
||
} else {
|
||
Write-Host "⚠️ 压缩跳过(可能已压缩)"
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Host "[5/6] 下载文件..."
|
||
Write-Host " 从: ${ServerUser}@${ServerIP}:${RemoteFile}"
|
||
Write-Host " 到: $LocalFile"
|
||
|
||
scp "${ServerUser}@${ServerIP}:${RemoteFile}" $LocalFile
|
||
|
||
if ($LASTEXITCODE -eq 0) {
|
||
Write-Host "✅ 下载成功"
|
||
} else {
|
||
Write-Host "❌ 下载失败"
|
||
exit 1
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Host "[6/6] 清理远程文件..."
|
||
$CleanCmd = "ssh ${ServerUser}@${ServerIP} 'rm -f $RemoteFile && echo CLEANED'"
|
||
Invoke-Expression $CleanCmd | Out-Null
|
||
Write-Host "✅ 远程文件已清理"
|
||
|
||
Write-Host ""
|
||
Write-Host "=========================================="
|
||
Write-Host " ✅ 全部完成!"
|
||
Write-Host "=========================================="
|
||
Write-Host ""
|
||
|
||
$LocalSize = (Get-Item $LocalFile).Length
|
||
$LocalSizeStr = "{0:N2} MB" -f ($LocalSize / 1MB)
|
||
|
||
Write-Host "📁 备份文件信息:"
|
||
Write-Host " 路径: $LocalFile"
|
||
Write-Host " 大小: $LocalSizeStr"
|
||
Write-Host " 时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
|
||
Write-Host ""
|
||
|
||
if ($LocalFile -match "\.gz$") {
|
||
Write-Host "📦 解压文件:"
|
||
Write-Host " 使用 7-Zip 或 WinRAR 解压"
|
||
Write-Host ""
|
||
}
|
||
|
||
Write-Host "📊 查看备份内容(解压后):"
|
||
Write-Host " Get-Content $($LocalFile -replace '\.gz$','') -Head 50"
|
||
Write-Host ""
|
||
|
||
Write-Host "🔄 恢复数据库:"
|
||
Write-Host " gunzip $LocalFile"
|
||
Write-Host " psql -h $DBHost -U $DBUser -d $DBName -f $($LocalFile -replace '\.gz$','')"
|
||
Write-Host ""
|
||
|
||
Write-Host "📋 所有备份文件:"
|
||
Get-ChildItem $LocalDir -Filter "lobechat_backup_*.sql*" |
|
||
Sort-Object LastWriteTime -Descending |
|
||
Select-Object -First 10 |
|
||
ForEach-Object {
|
||
$size = "{0:N2} MB" -f ($_.Length / 1MB)
|
||
$time = $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm")
|
||
Write-Host " $($_.Name) ($size) - $time"
|
||
}
|
||
Write-Host ""
|
||
|
||
|
||
|