我正在尝试设置一个脚本,将数据库的副本从一台服务器转移到另一台服务器。
感谢这篇文章Copying PostgreSQL database to another server我找到了一种方法。
但我需要做的是在复制过程中更改数据库的名称。 我曾考虑使用sed并进行简单的文本替换。但我担心这会破坏数据库。
有没有人知道这样做的正确方法?
这里要求的是我正在使用的命令
pg_dump -C -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin template1
答案 0 :(得分:4)
只需还原到其他数据库即可。对于来自pg_restore
自定义格式的-Fc
pg_dump
次转储:
createdb newdbname
pg_restore --dbname newdbname database.dump
对于使用-C
的{{1}}选项创建的非的SQL格式转储:
pg_dump
如果要从远程主机传输转储,只需省略createdb newdbname
psql -f database_dump.sql newdbname
,因为转储数据来自stdin。
您无法轻松-f database_dump.sql
在与还原相同的命令中,因为您需要连接到其他数据库(如CREATE DATABASE
)才能创建新数据库。所以在你的例子中你可能会:
template1
请注意psql -h localhost -U localadmin template1 -c 'CREATE DATABASE newdb;'
pg_dump -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin newdb
标记遗漏给-C
。
第一个命令只是编写pg_dump
的简单方法。
更新:如果您遇到使用createdb -h localhost -U localadmin newdb
标记创建的pg_dump
,只要您有,您就可以-C
转储非常小心。在文件的开头应该只有四行(一个注释)引用数据库名称。对于使用Pg 9.1 sed
转储的数据库名称“regress”:
pg_dump -C
这可以非常安全地转换为三个(如果要重写注释,则为四个)非常具体的--
-- Name: regress; Type: DATABASE; Schema: -; Owner: craig
--
CREATE DATABASE regress WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
ALTER DATABASE regress OWNER TO craig;
\connect regress
命令。但是不只是对数据库名称进行全局查找和替换。
sed
这应该是最后的手段;不用sed \
-e 's/^CREATE DATABASE regress/CREATE DATABASE newdbname/' \
-e 's/^ALTER DATABASE regress/ALTER DATABASE newdbname/' \
-e 's/^\\connect regress/\\connect newdbname/' \
-e 's/^--Name: regress/--Name: newdbname/'
转储就好了。