关于postgresql:使用pg_dump拍摄数据库的快照

Using pg_dump to take a snapshot of a database

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

感谢这篇文章将PostgreSQL数据库复制到另一台服务器,我找到了一种方法。

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

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

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

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

只需还原到其他数据库。对于来自pg_dump的自定义格式的pg_restore -Fc转储:

1
2
createdb newdbname
pg_restore --dbname newdbname database.dump

对于使用pg_dump-C选项创建的SQL格式转储:

1
2
createdb newdbname
psql -f database_dump.sql newdbname

如果您从远程主机流式传输转储,只需省略-f database_dump.sql,因为转储数据来自stdin。

您无法在与还原相同的命令中轻松CREATE DATABASE,因为您需要连接到不同的数据库(如template1)才能创建新数据库。所以在你的例子中你可能会:

1
2
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的简单方法。

更新:如果您遇到使用-C标志创建的pg_dump,只要您非常小心,您确实只能sed转储。在文件的开头应该只有四行(一个注释)引用数据库名称。对于使用Pg 9.1的pg_dump -C转储的数据库名称"regress":

1
2
3
4
5
6
7
8
9
10
--
-- 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命令。不过,不要只是对数据库名称进行全局查找和替换。

1
2
3
4
5
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/'

这应该是最后的手段;不用-C转储就好多了。