1

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

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

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

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

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

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

1 回答 1

5

只需恢复到不同的数据库。对于来自的自定义格式pg_restore-Fc转储:pg_dump

createdb newdbname
pg_restore --dbname newdbname database.dump

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

createdb newdbname
psql -f database_dump.sql newdbname

如果您从远程主机流式传输转储,只需省略-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标志 to pg_dump

第一个命令只是普通的书写方式createdb -h localhost -U localadmin newdb


更新:如果你坚持使用标志pg_dump创建,只要你非常小心,你确实可以只转储。文件开头应该只有四行(一行注释)引用数据库名称。对于使用 Pg 9.1 转储的数据库名称“regress” :-Csedpg_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/'

这应该是最后的手段;没有-C.

于 2012-10-18T00:35:08.857 回答