Использование 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;