Я по наивности своей думал, что бэкап просто обязан восстанавливаться без ошибок в новую базу - ведь ему не надо подгонять старые данные и новые - создай все, что в тебя напихали - и всего делов, оказалось не так...
Итак переношу базу в новую через бэкап.
Вариант 1 (sql, $$-кавычки включены)
коллекция ошибок при загрузке:
ERROR: unterminated dollar-quoted string at or near "$$ DECLARE locotype_id integer"
LINE 1: ...teger, task_parent_id integer) RETURNS integer AS $$ DECLARE...
Дальше конечно для каждой строки функции ошибка ERROR: syntax error at or near...
И все это для каждой функции.
Потом для нескольких колонок таблиц с типами SMALLINT, NUMERIC(20,4),BOOLEAN возникла ошибка такая
-- Name: COLUMN "Tasks"."State"; Type: COMMENT; Schema: prod; Owner: admin
ERROR: invalid byte sequence for encoding "UTF8": 0xd1ee
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
(хотя с таким типом есть и другие колонки)
Т.к. функции не создались, триггеры тоже не создались.
И для двух таблиц не создались внешние ключи из-за нарушения целостности, потому что бэкап решил не вставлять данные в таблицы, на которые эти ключи ссылаются и еще в парочку в другой схеме - безобразие!
Вариант 2 (sql, не использовать $-кавычки)
Все тоже самое, только функции и триггеры создались.
Вариант 3 (dump)
хммм... нет ошибок! однако здесь почему-то Виктор советует делать дамп в текстовом виде... Я думал они идентичны, оказалось нет, в чем загвоздка?
А вы делали
А вы делали дамп ОДНОЙ базы или dump_all? Я имею в виду в текстовом виде?
Если одной, то вполне возможны и не такие глюки.
Потому что кое-что должно быть зарегистрено в template1, чтобы работало в других БД. Навскидку вспоминаю такую штуку для подгружаемых процедурных языков.
Почему советую делать в текстовом виде? Потому что если в текстовом дампе есть ошибка, то вы знаете место где она возникает и имеете возможность её исправить. А если делать в бинарном виде, то ни понять от чего возникает ошибка, ни как-либо её исправить не представляется возможным.
По поводу долларов, вроде бы не так давно переводил как раз кусок по этому делу. Между одной и другой версией изменено поведение по умолчанию. Чтобы хавало нужный синтаксис что-то надо поправить в конфиге (если мне память не изменяет).
Думаю, что бинарный дамп создаёт просто всё по внутренним кодам в БД, не используя обработку (не парся) операторы, функции и описания. А текстовый дамп загружая всё это парсит! С одной стороны - это плохо с точки зрения переносимости. С другой хорошо, потому что позволяет исправлять леваки в дампе на то как оно ТЕПЕРЬ положено.
Да, я делал
Да, я делал только одной базы.
Логически поразмыслив, пришел к выводу, что нужно делать сразу два бэкапа - один в дамп и другой в текстовом виде с инсертами, чтобы на случай ошибки можно было выкрутиться или восстановить бэкап частично.
(ушел писать задачи под pgAgent)