Иногда мне нужно синхронизировать две базы данных PostgreSQL (некоторые таблицы от базы данных разработки до базы данных производства).
Итак, я придумал этот сценарий:
[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]
Проблема в том, что это работает только для вновь добавленных строк. Когда я редактирую столбец, отличный от PK, я получаю ошибку ограничения, и строка не обновляется. Для каждой сброшенной строки мне нужно проверить, существует ли она в целевой базе данных (по PK), и если да, удалите ее перед INSERT / COPY.
Спасибо за ваш совет.
(Ранее размещалось на stackoverflow.com, но, IMHO, это лучшее место для этого вопроса).
Может быть, используя dblink и вставляя только то, что вам нужно из выбора?
http://www.postgresonline.com/journal/index.php?/archives/44-Using-DbLink-to-access-other-PostgreeSQL-Databases-and-Servers.html
http://www.postgresql.org/docs/current/static/dblink.html
В любой среде, которую я видел, это обычно не делается для каждой таблицы.
Для любой строки есть несколько возможностей: SELECT / INSERT / UPDATE / ALTER ... вам нужно будет позаботиться обо всех этих возможностях.
Таблицы - не единственное, что живет в базах данных, особенно в базах данных PostgreSQL. Возможно, потребуется скопировать все последовательности, функции, агрегаты, представления и т. Д.
Если бы я был в вашей ситуации, я бы сбросил всю базу данных и использовал ее для восстановления чистой версии.
pg_dump --clean --no-owner --no-privileges dbname ## other pg_dump / psql options