在 Postgresql 9.1 中将古代数据从一个数据库表归档到另一个数据库表?

Posted

技术标签:

【中文标题】在 Postgresql 9.1 中将古代数据从一个数据库表归档到另一个数据库表?【英文标题】:Archive ancient data from one database table to another database table in Postgresql 9.1? 【发布时间】:2012-02-17 23:31:12 【问题描述】:

理想情况下,9.1 中的新“WITH ROWS”功能将支持跨数据库边界,但它似乎只能在单个数据库中工作。

WITH moved_rows AS (
    DELETE FROM events
    WHERE
        "date" >= '2010-01-01' AND
        "date" < '2011-01-01'
    RETURNING *
)
INSERT INTO events_archive
SELECT * FROM moved_rows;

我希望我能够将事件指定为“DELETE FROM LiveDB.events”,然后我可以执行“INSERT INTO ArchiveDB.events”。 dblink 似乎无法移动要移动的行列表,即使移动了,我也不确定该语句在 DB 之间是否是事务安全的......

【问题讨论】:

架构在这种情况下可能很有用。它们能满足您的需求吗? 【参考方案1】:

您可以将数据转储到文件(使用 SQL COPY 或 psql \copy)并在一个事务中将其删除,然后在另一个事务中将其导入另一个数据库。要在单个事务中执行这两个步骤,您需要 XA(分布式事务)。

从 LiveDB 转储

BEGIN TRANSACTION;
COPY (
  SELECT * FROM events
  WHERE "date" >= '2010-01-01'
  AND   "date" < '2011-01-01'
) TO '/tmp/events.csv' WITH CSV HEADER;

DELETE FROM events
WHERE "date" >= '2010-01-01'
AND   "date" < '2011-01-01'
COMMIT;

插入存档数据库:

COPY events FROM '/tmp/events.csv' WITH CSV HEADER;

希望对您有所帮助。

【讨论】:

刚刚开始使用 postgres,但如果它有效,它将解决我的很多问题。虽然我不喜欢将数据转储到文件中以再次读取......它可能适用于一些粗略的场景。 是的,使用 dblink 执行此操作会更简洁,但正如您在问题中所述,dblink 不支持跨数据库边界的事务。

以上是关于在 Postgresql 9.1 中将古代数据从一个数据库表归档到另一个数据库表?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 9.1 从所有模式中选择

如何在 PostgreSQL 9.1 中使用 pgFouine?

在 PostgreSQL 9.1 中创建触发器时的异常

在 SQL Server 中将数据从一列拆分为多行

如何在 Qt 中将数据从一种形式传递到另一种形式?

ALTER TABLE,在非空列中设置空,PostgreSQL 9.1