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

问题描述:

理想情况下,9.1中新的“WITH ROWS”功能将支持跨数据库边界,但它似乎只能在单个数据库中工作。将古老的数据从一个数据库表存档到Postgresql 9.1中的另一个数据库表中?

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的事务安全性...

+0

模式在这种情况下可能很有用。他们能满足你的需求吗? – 2012-02-18 08:24:07

您可以将数据转储到文件(使用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; 

自卸插入ArchiveDB:

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

希望有所帮助。

+1

刚开始使用postgres,但如果这个工作,它会解决很多我的问题。虽然我不喜欢将数据转储到文件中以供再次阅读......但它可能适用于某些粗略情况。 – 2012-02-18 00:28:24

+0

是的,这将是一个更干净的方法来做到这一点与dblink,但正如你在你的问题所述dblink不支持跨数据库边界的事务。 – tscho 2012-02-18 00:33:15