使用pg_dump拍摄数据库快照

Dan*_*ley 1 postgresql

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

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

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

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

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

pg_dump -C -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin template1
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 5

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

createdb newdbname
pg_restore --dbname newdbname database.dump
Run Code Online (Sandbox Code Playgroud)

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

createdb newdbname
psql -f database_dump.sql newdbname
Run Code Online (Sandbox Code Playgroud)

如果您正在从远程主机流式传输转储,则只需忽略-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
Run Code Online (Sandbox Code Playgroud)

请注意,省略了该-C标志pg_dump

第一个命令只是写的长途之路createdb -h localhost -U localadmin newdb


更新:如果您坚持使用pg_dump带有-C标志的created,sed那么只要您非常小心,就可以只进行转储。在文件的开头,仅应有四行(一个注释)引用数据库名称。对于使用Pg 9.1的数据库名称“ 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
Run Code Online (Sandbox Code Playgroud)

可以使用三个非常特定的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/'
Run Code Online (Sandbox Code Playgroud)

这应该是不得已的办法;最好不转储就转储-C