Использование pg_restore для создания или перезаписи таблиц

Я знаю, что это странный запрос, но по некоторым хакерским причинам, которых я не могу избежать, я хотел бы иметь возможность последовательно синхронизировать несколько таблиц из одной базы данных в другую. Я знаю, что мог бы сам написать функциональность в сценарии, но я думаю, pg_dump а также pg_restore будет применять много оптимизаций для процесса, который я не знаю о себе.

Что мне интересно, так это если есть способ pg_restore перезаписать существующие таблицы. В основном, в псевдокоде что-то вроде:

-- pseudo code
begin;
drop table to_restore;
drop table to_restore2;
drop table to_restore3;

-- etc

restore table to_restore;
restore table to_restore2;
restore table to_restore3;

-- etc
commit;

Я также открыт для альтернативных способов сделать это, если это не так здорово.

2 ответа

Решение

Похоже, вы хотите -c опция указана в документации pg_restore

--clean

Очистите (отбросьте) объекты базы данных перед их воссозданием. (Если не используется --if-exist, это может привести к появлению некоторых безобидных сообщений об ошибках, если какие-либо объекты не присутствуют в целевой базе данных.)

который вы можете использовать с -1 флаг делать все за одну транзакцию

-1

--single-транзакции

Выполните восстановление как одну транзакцию (то есть оберните отправленные команды в BEGIN/COMMIT). Это гарантирует, что либо все команды завершены успешно, либо изменения не применяются. Эта опция подразумевает --exit-on-error.

Это единственный пример возможного решения:

скопируйте эти таблицы из первого БД в CSV. и использовать чрезвычайно быстрое копирование в транзакции:

begin;
truncate table to_restore;
truncate table to_restore2;
truncate table to_restore3;
  set commit_delay to 100000;
  set synchronous_commit to off;
copy to_restore from 'to_restore.csv';
copy to_restore2 from 'to_restore2.csv';
copy to_restore3 from 'to_restore3.csv';
commit;
Другие вопросы по тегам