【问题标题】:PostgreSQL copy/transfer data from one database to anotherPostgreSQL 将数据从一个数据库复制/传输到另一个数据库
【发布时间】:2016-07-28 08:03:07
【问题描述】:

我需要将数据从一个表复制到另一个表。这两个表的结构几乎相同,但位于不同的数据库中。

我试过了

INSERT INTO db1.public.table2(
  id,
  name,
  adress,
  lat,
  lng
)
SELECT
  id,
  name,
  adress,
  lat
  lng
FROM db2.public.table2;

我试试这个,我得到错误跨数据库...未实现

【问题讨论】:

标签: sql postgresql copy cross-database


【解决方案1】:

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

CREATE DATABASE new_database TEMPLATE original_database;

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

From the docs:

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

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

然而,重要的是要理解,这不是(还)打算用作通用“复制数据库”工具。

【讨论】:

    【解决方案2】:

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

    psql source_database -c 'COPY table TO stdout' | psql target_database -c 'COPY table FROM stdin'
    

    但这仅适用于 postgres 9.4 或更高版本

    【讨论】:

    • 这很好用。如果您想要对源数据库进行子集化(例如从一个非常大的表中),您可以在管道的源端使用 select 语句来仅传输您想要的行。例如: psql source_database -c 'COPY (SELECT * FROM source_schema.source_table where id > 45303692 and id
    • @voytech,如何为两个连接传递密码?
    • @PrashantParekh 从远程数据库复制到本地数据库时,我这样做是:psql "host=<host> user=<user> database=<database> password=<password>" -c 'COPY(SELECT * FROM source_schema.source_table) TO stdout' | psql local_db_name -c 'COPY local_table FROM stdin'
    • 这对我来说效果很好...但是数据没有被复制...如何也复制数据?
    【解决方案3】:

    这是一项非常简单的任务。只需为此目的使用 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)
    

    如果您需要定期从外部数据库获取数据,最好定义一个服务器和用户映射。然后,您可以使用更短的语句:

    dblink('yourdbname', 'your query')
    

    【讨论】:

    • 感谢您的回答。有用。查询中的第二个 t 是远程数据库中从中获取数据的表。
    • 如果SELECT a, b, c FROM t中有where子句,如何转义单引号?
    • 别忘了加载dblink CREATE EXTENSION dblink;
    猜你喜欢
    • 2017-06-03
    • 2012-04-19
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多