如何将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
相关产品推荐
相关产品推荐

