调用 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 '处理完成'