gpt4 book ai didi

postgresql - 使用 pg_dump 获取数据库快照

转载 作者:行者123 更新时间:2023-11-29 12:33:57 25 4
gpt4 key购买 nike

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

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

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

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

这里是我正在使用的命令

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

最佳答案

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

createdb newdbname
pg_restore --dbname newdbname database.dump

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

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 标志遗漏到 pg_dump

第一个命令是 createdb -h localhost -U localadmin newdb 的简写方式。


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

--
-- 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 进行转储会更好。

关于postgresql - 使用 pg_dump 获取数据库快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com