You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过LAN在工作站挂载盘实现PostgreSQL pg_dump备份的方案咨询

针对你的几个问题,我来一步步拆解解决方案,都是生产环境里常用的思路:

一、脚本部署位置的选择

两种部署方式都可行,核心看你的网络环境和权限配置:

  • 部署在服务器上:如果服务器能通过局域网挂载工作站的Dragonfly卷(比如用NFS、SMB协议共享挂载),这种方式更高效——直接在服务器端生成备份文件写入挂载卷,避免跨网络传输大体积备份数据。但需要确保服务器对挂载卷有写入权限,同时PostgreSQL的adminuser能正常执行pg_dump。
  • 部署在工作站上:就是你当前尝试的方式,从工作站远程连接服务器的PostgreSQL拉取备份,写入本地挂载卷。这种方式不需要服务器挂载外部存储,但要解决两个核心问题:一是工作站用户对/volumes/Dragonfly/PG_backups/有写入权限,二是远程连接PostgreSQL的密码安全问题。
二、解决pg_dump的密码安全问题(避免明文)

PostgreSQL官方推荐的安全方案是使用.pgpass文件,完全不需要在脚本里明文写密码:

  1. 在运行脚本的用户(工作站或服务器的登录用户)主目录下创建.pgpass文件,格式如下:
    serverbox.local:5432:dbname:adminuser:你的数据库密码
    
    字段说明:主机名:端口:数据库名:用户名:密码,默认端口5432可以省略,但建议写全保证兼容性。
  2. 必须严格设置该文件的权限为0600(否则PostgreSQL会直接忽略这个文件):
    chmod 0600 ~/.pgpass
    
  3. 之后再运行pg_dump命令,会自动读取.pgpass里的密码,不需要加-w参数(加了也不影响,会优先用文件中的密码)。
三、修复当前脚本的权限和语法问题

你当前的脚本把变量定义和命令写在一行,虽然语法合法但可读性差,权限问题大概率是运行脚本的用户没有/volumes/Dragonfly/PG_backups/的写入权限:

  1. 先检查目录权限:
    ls -ld /volumes/Dragonfly/PG_backups/
    
    确保运行脚本的用户(比如你的工作站用户名)有w权限。如果没有,可以修改目录权限:
    # 把目录权限给到你的用户
    sudo chown -R 你的用户名:你的用户组 /volumes/Dragonfly/PG_backups/
    # 或者开放组写入权限(如果你的用户在对应组里)
    sudo chmod g+w /volumes/Dragonfly/PG_backups/
    
  2. 优化后的脚本写法(更清晰且易维护):
    #!/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的备选方案

如果挂载卷的权限问题不好解决,或者挂载卷偶尔会断开,这种方案更可靠:

  1. 服务器本地备份+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
      

    优势:即使挂载卷临时不可用,本地备份依然保留,等挂载恢复后再同步。

  2. 工作站本地临时备份+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:42