psql, не может скопировать содержимое базы данных в другой - не может работать внутри блока транзакции -

Я хочу скопировать содержимое моей локальной машины на удаленную (внутри докера). По какой-то причине все сложнее, чем я ожидал: когда я пытаюсь скопировать данные на удаленный, я получаю это "ERROR: CREATE DATABASE cannot run inside a transaction block".

Хорошо ... Итак, я залез в свой док-контейнер, добавил внутрь правило \set AUTOCOMMIT. Но я все равно получаю эту ошибку.

Это команда, которую я сделал:

// backup
pg_dump -C -h localhost  -U postgres woof | xz >backup.xz

а затем на моем удаленном компьютере:

xz -dc backup.xz | docker exec -i -u postgres waf-postgres psql --set ON_ERROR_STOP=on --single-transaction

Но каждый раз, когда я получаю сообщение «CREATE DATABASE не может работать внутри блока транзакции», что бы я ни пытался. Даже если я поставлю автокоммит на «включено».

Вот моя проблема: я не знаю, что такое блок транзакции. И я не понимаю, почему копирование одной базы данных в другую должно быть такой сложной задачей: моя удаленная база данных пуста. Так почему же так много суеты и почему psql просто не может заставить то, что я хочу?

Моя цель - просто скопировать мою локальную базу данных на удаленную.


person Mr Bonjour    schedule 06.04.2018    source источник


Ответы (1)


вот что происходит: вы добавляете оператор CREATE DATABASE с ключом -C, а затем пытаетесь запустить psql с --single-transaction, поэтому содержимое скрипта переносится в BEGIN;...END;, где вы не можете использовать CREATE DATABASE

Итак, iether удалите -C и запустите psql для существующей базы данных или удалите --single-transaction для psql. Принимайте решение, основываясь на том, что вам действительно нужно ...

с man pg_dump:

-C

--Создайте

Начните вывод с команды для создания самой базы данных и повторного подключения к созданной базе данных. (Для сценария этой формы не имеет значения, к какой базе данных в целевой установке вы подключаетесь перед запуском сценария.) Если также указан параметр --clean, сценарий удаляет и воссоздает целевую базу данных перед повторным подключением к ней.

с man psql:

- single-transaction

Этот параметр можно использовать только в сочетании с одним или несколькими параметрами -c и / или -f. Это заставляет psql выдавать команду BEGIN перед первой такой опцией и команду COMMIT после последней, тем самым объединяя все команды в одну транзакцию. Это гарантирует, что либо все команды будут выполнены успешно, либо никакие изменения не будут применены.

person Vao Tsun    schedule 06.04.2018