Postgres: Как создать резервную копию и восстановить таблицу

#postgresql #database-backups

Вопрос:

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

Я использую PgAdmin3, и на своем столе я щелкаю правой кнопкой мыши и выбираю «Резервное копирование» В параметрах файла, которые я выбираю «Пользовательские». Я не выбираю никаких имен сжатия, кодирования или ролей, и в параметрах дампа я выбираю только «Разделы/данные». Строка резервной копии выглядит примерно так:

pg_dump.exe --host localhost --port 5432 --username "postgres" --no-password --format custom --section data --verbose --file "D:TEMPTableBackup.backup" --table "mytable" "myDatabase"

Затем я немедленно проверяю эту резервную копию, восстанавливая ее, и выбираю имя файла и формат «Пользовательский или Tar», и никакие другие параметры восстановления не выбраны.

pg_restore.exe --host localhost --port 5432 --username "postgres" --dbname "myDatabase" --no-password --table myTable --schema mySchema --verbose "D:TEMPTableBackup.backup"

И возвращается следующая ошибка:

 pg_restore: connecting to database for restore
pg_restore: implied data-only restore
pg_restore: processing data for table "myTable"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2305; 0 18581 TABLE DATA myTable mySchema
pg_restore: [archiver (db)] COPY failed for table "myTable": ERROR:  duplicate key value violates unique constraint "myTemplate_pk"
DETAIL:  Key (oid)=(618001) already exists.
CONTEXT:  COPY myTable, line 1
pg_restore: setting owner and privileges for TABLE DATA myTable
WARNING: errors ignored on restore: 1
Process returned exit code 1.
 

Что такое Дубликат ключа?

Как мне с этим справиться?

Что такого в OID=618001? Я хочу, чтобы вся таблица была восстановлена, включая OID, так почему же в этом поле ошибка? Я бы подумал, что это просто восстановит все сверху?

Заранее спасибо, Даз

Комментарии:

1. Запустите UPDATE транзакцию и выполните откат, если она «испортится».

2. Что это значит, как мне это сделать?

Ответ №1:

Вы можете избежать всей проблемы, выполнив UPDATE явную транзакцию, которую вы откатите, если что-то не так:

 /* start a transaction */
START TRANSACTION;

/* run your UPDATE */
UPDATE ...

/*
 * Now check if your UPDATE did the right thing.
 * If it did, run COMMIT to complete the transaction.
 * If not, run ROLLBACK to undo everything that happened in the transaction.
 */
COMMIT;  -- or ROLLBACK;
 

Ответ №2:

Вы пытаетесь добавить копию данных обратно в таблицу, пока старая версия все еще там. Таким образом, вы получаете нарушение ограничения уникального ключа. Вам придется обрезать старые данные, прежде чем восстанавливать новые данные. Но у вас могут возникнуть проблемы с внешними ключами, если вы попытаетесь это сделать.

Ответ №3:

Просто создайте новую таблицу, используя ключевое слово «нравится», и скопируйте все данные.

создайте таблицу «tableA_bkp» (например, «Таблица»)
вставьте в «tableA_bkp» выберите * из «Таблицы»