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

如何将PostgreSQL数据库克隆到其他主机并指定新名称?

解决PostgreSQL数据库克隆后名称不变的问题

我来帮你搞定这个问题!你遇到的核心原因是pg_restore的-C参数在搞鬼——这个参数会让pg_restore自动执行pg_dump生成的CREATE DATABASE语句,也就是生产库的旧名称users-production,直接覆盖了你手动创建的users-sandbox。

下面是修正后的完整操作步骤:

步骤1:设置环境变量(可选但方便)

PRODUCTION_HOST=111.111.11.111
SANDBOX_HOST=222.222.22.222

步骤2:在沙箱主机创建目标数据库

echo "Creating database on sandbox"
psql -h ${SANDBOX_HOST} -U postgres -c "CREATE DATABASE \"users-sandbox\";"

步骤3:导出生产库并恢复到新数据库(关键:去掉-C参数)

pg_dump -h ${PRODUCTION_HOST} -U postgres -d users-production -F c -b -v | \
pg_restore -c -h ${SANDBOX_HOST} -U postgres -d users-sandbox -v

额外优化建议

如果生产库包含沙箱环境不存在的自定义角色或权限,建议加上--no-owner和--no-privileges参数,避免恢复时出现权限错误:

pg_dump -h ${PRODUCTION_HOST} -U postgres -d users-production -F c -b -v | \
pg_restore -c --no-owner --no-privileges -h ${SANDBOX_HOST} -U postgres -d users-sandbox -v

为什么原来的命令不行?

你之前的命令里同时使用了-C和-d users-sandbox:

  • -C会让pg_restore先执行dump文件里的CREATE DATABASE users-production;语句,在沙箱主机创建旧名称的数据库
  • 然后自动切换到这个旧数据库进行恢复,完全忽略了你指定的users-sandbox

去掉-C后,pg_restore会直接连接到你已经创建好的users-sandbox数据库,把生产库的数据导入进去,这样就能得到你想要的新名称数据库了。

内容的提问来源于stack exchange,提问作者dina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:27:37