PostgreSQL copy/transfer 数据从一个数据库到另一个
PostgreSQL copy/transfer data from one database to another
我需要将数据从一个 table 复制到另一个。这两个 table 的结构几乎相同,但在不同的数据库中。
我试过了
INSERT INTO db1.public.table2(
id,
name,
adress,
lat,
lng
)
SELECT
id,
name,
adress,
lat
lng
FROM db2.public.table2;
我试试这个,我得到跨数据库错误...未实现
这是一项非常简单的任务。只需为此目的使用 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')
还有另一种方法。如果 dblink 扩展不可用,可以直接在命令行中复制数据,使用管道连接标准输入和输出:
psql source_database -c 'COPY table TO stdout' | psql target_database -c 'COPY table FROM stdin'
但这只适用于 postgres 9.4 或更高版本
如果您在 psql 会话中使用 postgresql 9.0 或更高版本(可能是 8.0 或更高版本),您还可以使用:
CREATE DATABASE new_database TEMPLATE original_database;
new_database 将是 original_database 的克隆,包括 tables、table 架构、编码和数据。
The principal limitation is that no other sessions can be connected to the source database while it is being copied.
我建议您通过从新旧数据库 table 中进行明智的选择来验证克隆实际上是否正确。文档还说:
It is important to understand, however, that this is not (yet) intended as a general-purpose “COPY DATABASE” facility.
我需要将数据从一个 table 复制到另一个。这两个 table 的结构几乎相同,但在不同的数据库中。
我试过了
INSERT INTO db1.public.table2(
id,
name,
adress,
lat,
lng
)
SELECT
id,
name,
adress,
lat
lng
FROM db2.public.table2;
我试试这个,我得到跨数据库错误...未实现
这是一项非常简单的任务。只需为此目的使用 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')
还有另一种方法。如果 dblink 扩展不可用,可以直接在命令行中复制数据,使用管道连接标准输入和输出:
psql source_database -c 'COPY table TO stdout' | psql target_database -c 'COPY table FROM stdin'
但这只适用于 postgres 9.4 或更高版本
如果您在 psql 会话中使用 postgresql 9.0 或更高版本(可能是 8.0 或更高版本),您还可以使用:
CREATE DATABASE new_database TEMPLATE original_database;
new_database 将是 original_database 的克隆,包括 tables、table 架构、编码和数据。
The principal limitation is that no other sessions can be connected to the source database while it is being copied.
我建议您通过从新旧数据库 table 中进行明智的选择来验证克隆实际上是否正确。文档还说:
It is important to understand, however, that this is not (yet) intended as a general-purpose “COPY DATABASE” facility.