PostgreSQL将数据从一个数据库复制/传输到另一个数据库

fab*_*vys 7 sql postgresql copy cross-database

我需要将数据从一个表复制到另一个表.这两个表具有几乎相同的结构,但是在不同的数据库中.

我试过了

INSERT INTO db1.public.table2(
  id,
  name,
  adress,
  lat,
  lng
)
SELECT
  id,
  name,
  adress,
  lat
  lng
FROM db2.public.table2;
Run Code Online (Sandbox Code Playgroud)

我尝试这个,我得到错误交叉数据库...没有实现

voy*_*ech 15

这是一项非常简单的任务.只需使用dblink就可以实现此目的:

INSERT INTO t(a, b, c)
SELECT a, b, c FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT a, b, c FROM t') AS x(a integer, b integer, c integer)
Run Code Online (Sandbox Code Playgroud)

如果您需要定期从外部数据库获取数据,那么定义服务器和用户映射是明智的.然后,您可以使用较短的语句:

dblink('yourdbname', 'your query')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答.有用.查询中的第二个t是远程数据库中从中获取数据的表. (2认同)

voy*_*ech 8

还有另一种方法可以做到这一点.如果dblink扩展不可用,则可以使用连接标准输入和输出的管道直接在命令行中复制数据:

psql source_database -c 'COPY table TO stdout' | psql target_database -c 'COPY table FROM stdin'
Run Code Online (Sandbox Code Playgroud)

但这只会在postgres 9.4或更高版本中起作用

  • 这真的很好用。如果您想对源数据库进行子集化(比如从一个非常大的表中),您可以在管道的源端使用一个 select 语句来只传输您想要的行。例如: psql source_database -c 'COPY (SELECT * FROM source_schema.source_table where id > 45303692 and id < 45303792) TO stdout' | psql target_database -c 'COPY table FROM stdin' -- 重要的规定是目标表上的列必须与源表匹配。否则,您必须在源和目标复制语句中明确列名。 (2认同)
  • @PrashantParekh当从远程数据库复制到本地数据库时,我通过以下方式执行此操作:`psql“host=<host> user=<user>database=<database>password=<password>”-c'COPY(SELECT * FROM source_schema.source_table) 至标准输出' | psql local_db_name -c '从标准输入复制本地表'` (2认同)

dpn*_*umo 5

如果您在 psql 会话中使用 postgresql 9.0 或更高版本(也可能是 8.0 或更高版本),您还可以使用:

\n\n
CREATE DATABASE new_database TEMPLATE original_database;\n
Run Code Online (Sandbox Code Playgroud)\n\n

new_database 将是original_database 的克隆,包括表、表模式、编码和数据。

\n\n

来自文档:

\n\n
\n

主要限制是在复制源数据库时,没有其他会话可以连接到源数据库。

\n
\n\n

我建议您通过从新旧数据库表中进行明智的选择来验证克隆实际上是否正确。文档还说:

\n\n
\n

然而,重要的是要理解,这还不是通用的 \xe2\x80\x9cCOPY DATABASE\xe2\x80\x9d 工具。

\n
\n