在 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 中将古代数据从一个数据库表归档到另一个数据库表?的主要内容,如果未能解决你的问题,请参考以下文章