Архивировать древние данные из одной таблицы базы данных в другую таблицу базы данных в Postgresql 9.1? - PullRequest
3 голосов
/ 18 февраля 2012

В идеале, новая функция «WITH ROWS» в 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;

Хотелось бы, чтобы я мог указывать события какчто-то вроде «УДАЛИТЬ ИЗ LiveDB.events», а затем я могу сделать «INSERT INTO ArchiveDB.events».Кажется, что dblink не работает, чтобы получить список строк для перемещения, и даже если бы он это сделал, я не уверен, является ли этот оператор безопасным для транзакций между БД ...

1 Ответ

6 голосов
/ 18 февраля 2012

Вы можете вывести данные в файл (с помощью 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;

Надеюсьпомогает.

...