通过LAN在工作站挂载盘实现PostgreSQL pg_dump备份的方案咨询
针对你的几个问题,我来一步步拆解解决方案,都是生产环境里常用的思路:
一、脚本部署位置的选择
两种部署方式都可行,核心看你的网络环境和权限配置:
- 部署在服务器上:如果服务器能通过局域网挂载工作站的
Dragonfly卷(比如用NFS、SMB协议共享挂载),这种方式更高效——直接在服务器端生成备份文件写入挂载卷,避免跨网络传输大体积备份数据。但需要确保服务器对挂载卷有写入权限,同时PostgreSQL的adminuser能正常执行pg_dump。 - 部署在工作站上:就是你当前尝试的方式,从工作站远程连接服务器的PostgreSQL拉取备份,写入本地挂载卷。这种方式不需要服务器挂载外部存储,但要解决两个核心问题:一是工作站用户对
/volumes/Dragonfly/PG_backups/有写入权限,二是远程连接PostgreSQL的密码安全问题。
二、解决pg_dump的密码安全问题(避免明文)
PostgreSQL官方推荐的安全方案是使用.pgpass文件,完全不需要在脚本里明文写密码:
- 在运行脚本的用户(工作站或服务器的登录用户)主目录下创建
.pgpass文件,格式如下:
字段说明:serverbox.local:5432:dbname:adminuser:你的数据库密码主机名:端口:数据库名:用户名:密码,默认端口5432可以省略,但建议写全保证兼容性。 - 必须严格设置该文件的权限为
0600(否则PostgreSQL会直接忽略这个文件):chmod 0600 ~/.pgpass - 之后再运行
pg_dump命令,会自动读取.pgpass里的密码,不需要加-w参数(加了也不影响,会优先用文件中的密码)。
三、修复当前脚本的权限和语法问题
你当前的脚本把变量定义和命令写在一行,虽然语法合法但可读性差,权限问题大概率是运行脚本的用户没有/volumes/Dragonfly/PG_backups/的写入权限:
- 先检查目录权限:
确保运行脚本的用户(比如你的工作站用户名)有ls -ld /volumes/Dragonfly/PG_backups/w权限。如果没有,可以修改目录权限:# 把目录权限给到你的用户 sudo chown -R 你的用户名:你的用户组 /volumes/Dragonfly/PG_backups/ # 或者开放组写入权限(如果你的用户在对应组里) sudo chmod g+w /volumes/Dragonfly/PG_backups/ - 优化后的脚本写法(更清晰且易维护):
#!/bin/bash # 定义备份目录和文件名 BACKUP_DIR="/volumes/Dragonfly/PG_backups" BACKUP_FILE="${BACKUP_DIR}/serverbox_PG_mydomain5myusername_$(date +%Y_%m_%d_%H_%M).sql" # 执行备份,自动读取.pgpass中的密码 pg_dump -h serverbox.local -U adminuser dbname > "${BACKUP_FILE}" # 可选:检查备份是否成功 if [ $? -eq 0 ]; then echo "备份成功:${BACKUP_FILE}" else echo "备份失败!" exit 1 fi
四、先本地备份再rsync的备选方案
如果挂载卷的权限问题不好解决,或者挂载卷偶尔会断开,这种方案更可靠:
服务器本地备份+rsync同步到工作站挂载卷
- 在服务器上创建本地临时备份目录(比如
/var/backups/postgresql/),确保adminuser或postgres用户有写入权限。 - 服务器端脚本示例:
#!/bin/bash LOCAL_BACKUP_DIR="/var/backups/postgresql" LOCAL_BACKUP_FILE="${LOCAL_BACKUP_DIR}/serverbox_PG_mydomain5myusername_$(date +%Y_%m_%d_%H_%M).sql" # 先备份到服务器本地 pg_dump -U adminuser dbname > "${LOCAL_BACKUP_FILE}" # 用rsync同步到工作站挂载卷(需要服务器能访问工作站的IP,且工作站开启rsync服务或允许SSH连接) rsync -avz "${LOCAL_BACKUP_FILE}" 你的工作站用户名@工作站IP:/volumes/Dragonfly/PG_backups/ # 可选:删除7天前的本地旧备份,节省空间 find "${LOCAL_BACKUP_DIR}" -name "*.sql" -mtime +7 -delete
优势:即使挂载卷临时不可用,本地备份依然保留,等挂载恢复后再同步。
- 在服务器上创建本地临时备份目录(比如
工作站本地临时备份+rsync到挂载卷
- 先把备份存到工作站本地磁盘(比如
~/temp_backups/),确保有足够空间,再同步到挂载卷:#!/bin/bash TEMP_DIR="~/temp_backups" BACKUP_DIR="/volumes/Dragonfly/PG_backups" BACKUP_FILE="serverbox_PG_mydomain5myusername_$(date +%Y_%m_%d_%H_%M).sql" # 先备份到本地临时目录 pg_dump -h serverbox.local -U adminuser dbname > "${TEMP_DIR}/${BACKUP_FILE}" # 同步到挂载卷 rsync -avz "${TEMP_DIR}/${BACKUP_FILE}" "${BACKUP_DIR}/" # 可选:删除临时文件 rm "${TEMP_DIR}/${BACKUP_FILE}"
优势:适合挂载卷权限严格或临时挂载的场景,避免备份过程中因挂载断开导致失败。
- 先把备份存到工作站本地磁盘(比如
内容的提问来源于stack exchange,提问作者Rich_F
相关产品推荐
相关产品推荐

