将古老的数据从一个数据库表存档到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的事务安全性...
您可以将数据转储到文件(使用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;
自卸插入ArchiveDB:
COPY events FROM '/tmp/events.csv' WITH CSV HEADER;
希望有所帮助。
刚开始使用postgres,但如果这个工作,它会解决很多我的问题。虽然我不喜欢将数据转储到文件中以供再次阅读......但它可能适用于某些粗略情况。 – 2012-02-18 00:28:24
是的,这将是一个更干净的方法来做到这一点与dblink,但正如你在你的问题所述dblink不支持跨数据库边界的事务。 – tscho 2012-02-18 00:33:15
模式在这种情况下可能很有用。他们能满足你的需求吗? – 2012-02-18 08:24:07