Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Postgresql 9.1中,将古代数据从一个数据库表归档到另一个数据库表?_Postgresql_Archive - Fatal编程技术网

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

在Postgresql 9.1中,将古代数据从一个数据库表归档到另一个数据库表?,postgresql,archive,Postgresql,Archive,理想情况下,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; 将移动

理想情况下,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;
将移动的行作为(
从事件中删除
哪里
“日期”>=“2010-01-01”和
“日期”<'2011-01-01'
返回*
)
插入到事件\u存档中
从移动的行中选择*;
我希望能够将事件指定为类似“从LiveDB.events中删除”,然后可以执行“插入ArchiveDB.events”。
dblink似乎无法使行列表移动,即使它移动了,我也不确定此语句在整个DBs中的事务安全性…

您可以将数据转储到文件(使用SQL或)中,并在一个事务中删除它,然后在另一个事务中将其导入另一个数据库。要在单个事务中执行这两个步骤,您需要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;

希望这能有所帮助。

刚刚开始学习postgres,但如果这能奏效,我的很多问题都会迎刃而解。虽然我不喜欢将数据转储到文件中以便再次读取。。。它可能适用于某些粗糙的场景。是的,使用dblink执行此操作会更干净,但正如您在问题中所述,dblink不支持跨数据库边界的事务。在这种情况下,架构可能很有用。它们能满足你的需要吗?
COPY events FROM '/tmp/events.csv' WITH CSV HEADER;