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

ken*_*yee 3 postgresql archive

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

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;
Run Code Online (Sandbox Code Playgroud)

我希望我能够将事件指定为"DELETE FROM LiveDB.events",然后我可以执行"INSERT INTO ArchiveDB.events".dblink似乎无法获取要移动的行列表,即使它确实如此,我也不确定此语句是否在跨DB的事务上是安全的...

tsc*_*cho 6

您可以将数据转储到文件(使用SQL COPYpsql\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;
Run Code Online (Sandbox Code Playgroud)

插入ArchiveDB:

COPY events FROM '/tmp/events.csv' WITH CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.