centos 下使用 powershell 备份 pg 数据库

调用 pg_dump 枚举出所有库后进行备份,也可以使用 pg_dumpall 进行全库备份

# 简单一点处理
 $env:PGPASSWORD = "postgres"
 .\pg_runtime\pg_dump.exe -U postgres -h localhost -p 5432 -F t -b -v -f newpaas_backup_1.tar newpaas

 $env:PGPASSWORD = '123456'
 .\pg_runtime\pg_restore.exe -U postgres -h 192.168.0.70 -p 5432 -d paas -v newpaas_backup_1.tar
# 查看进程路径
ps aux | grep postgres

# 查看数据保存路径 
SHOW data_directory;

#查看显示目录占用空间
du -sh ./base # 总空间
du -sh ./base/* # 子目录空间

# 排序,不能加 h 
du -s ./base/* | sort -nr
简易备份方案,将整个 pgdata 目录压缩一下进行备份,比如 
tar -czvf pgdata_144.tar.gz ./pgdata/
然后将密码也保存同目录下
# centos 下
# 切换到 postgres 用户下,这样执行命令不用输入账号、密码
# su -u postgres 

# 启动 powershell
# pwsh 

# 下面代码保存至 ps1 文件并执行
$ErrorActionPreference = "Stop"

# 列出数据库名列表, 原来想使用 ConvertFrom-Csv 使用 csv 格式处理,但在 centos 下使用有问题
$command = 'psql -c "SELECT datname FROM pg_database WHERE datistemplate = false;"' 
$result =  Invoke-Expression $command 
$lines = $result -split "\r|\n"

# 去掉空行
$lines = $lines | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }

# 去掉头尾,第一行是标题, 第二行是 ----, 最后一行是 总数
$dataNames = $lines  | Select-Object -Skip 2 -First ($lines.count - 3)

# 最后一行中有行数, 使用正则取出
$lastLine = $lines | Select-Object -Last 1 
# Rege=x.Match(subjectString, @"\d+");
[int]$len = [regex]::Match($lastLine, '\d+').Value

# 比较一下数据库总数对不对
if($len -ne $dataNames.count){
    throw [System.InvalidOperationException]::new("列出数据库总数不一致  $len != $($databases.count)")
}

Write-Output "数据库总数 $len"

foreach ($dataName in $dataNames) {

    Write-Output "备份库 $dataName"

    $command = "pg_dump  -d $($dataName)  -f $($dataName).sql"
    #Write-Output $command
    Invoke-Expression $command

    Write-Output "备份库 $dataName 完成"
}

Write-Output '处理完成'
上一篇
下一篇