#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» выберите * из «Таблицы»