使用pg_dump拍摄数据库的快照

时间:2012-10-18 00:30:07

标签: postgresql

我正在尝试设置一个脚本,将数据库的副本从一台服务器转移到另一台服务器。

感谢这篇文章Copying PostgreSQL database to another server我找到了一种方法。

但我需要做的是在复制过程中更改数据库的名称。 我曾考虑使用sed并进行简单的文本替换。但我担心这会破坏数据库。

有没有人知道这样做的正确方法?

这里要求的是我正在使用的命令

pg_dump -C -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin template1

1 个答案:

答案 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/' 转储就好了。