Восстановление базы данных PostgreSQL с использованием pg_restore в качестве добавочных данных без перезаписи или удаления существующих таблиц

У меня есть два хост-сервера s1 и s2. На обоих серверах у меня есть схема с именем n1. Теперь я внес некоторые изменения в некоторые таблицы, представленные в схеме n1 s1. Я хочу, чтобы такое же изменение было внесено в схему n1 сервера s2. что я планирую сделать, так это сделать резервную копию схемы n1 сервера s1 с помощью pg_dump и восстановить на сервере s2 с помощью pg_restore.

Для резервного копирования и восстановления используются следующие команды:

pg_dump -Fc -h XXXXX -U user -d dbname > test.dump

pg_restore  -h XXXXX -U user -d dbname < test.dump

Но когда я восстанавливаю с помощью pg_restore, я получаю эту ошибку:

pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 200; 1259 16435 TABLE table_name database_name
pg_restore: error: could not execute query: ERROR:  relation "address" already exists
Command was: CREATE TABLE public.table_name (
    id integer NOT NULL,
    status character varying(1) NOT NULL,
   table_name1 character varying(80) NOT NULL,
   table_name2 character varying(80),
   table_name3 character varying(80),
    location_id integer NOT NULL
);

person Murali    schedule 15.04.2021    source источник


Ответы (1)


Вы можете сбросить так:

pg_dump -Fc -h XXXXX -U user --inserts --on-conflict-do-nothing --data-only -n n1 dbname > test.dump

При восстановлении такого дампа будут пропущены строки, в которых первичный ключ или ограничение уникальности конфликтуют с уже существующими строками. Опция --on-conflict-do-nothing доступна начиная с v12.

person Laurenz Albe    schedule 15.04.2021
comment
Да, дамп был успешно создан, но пока я восстанавливаю базу данных pg_restore --exit-on-error -h XXXXXX -U user -d db_name ‹ test.dump, вывод не печатается, а восстановление не выполняется. - person Murali; 16.04.2021
comment
Если ничего не восстанавливалось, значит, все вставленные строки имели конфликт, то есть уже существовали в месте назначения. Это не выполняет слияние, то есть обновляет строки в месте назначения. Вы не можете получить это с pg_dump. - person Laurenz Albe; 16.04.2021
comment
Есть ли способ восстановить базу данных как инкрементные данные с помощью утилиты pg? Пожалуйста, предложите - person Murali; 16.04.2021
comment
Нет, вам придется написать код, использующий INSERT ... ON CONFLICT ... DO UPDATE. pg_dump не будет этого делать. Возможно, есть утилиты, которые делают это, но я не могу сейчас придумать ни одной, а спрашивать инструменты не по теме. - person Laurenz Albe; 16.04.2021