Postgres pg_dumpall / psql синтаксические ошибки - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выполнить миграцию на новый сервер БД и незначительное повышение версии (10.1> 10.4), используя pg_dumpall и psql, но восстановление изобилует синтаксическими ошибками, которые, по-видимому, связаны с несоответствием между исходным кодоми ожидаемое форматирование места назначения.

После некоторых проб и ошибок я обнаружил, что в основном это связано с использованием новых строк в дампе SQL.

Ошибка:

psql: dbops / app_full_backup_edit.sql: 106: ОШИБКА: синтаксическая ошибка в конце ввода LINE 1: ... N app_core.generate_object_id () ВОЗВРАЩАЕТСЯ с изменением символа

Например, pg_dumpall экспортирует aхранимая процедура как:

CREATE FUNCTION app_core.generate_object_id() RETURNS character varying
    LANGUAGE plpgsql
    AS $$
    DECLARE
        time_component bigint;
        machine_id bigint := FLOOR(random() * 16777215);
        process_id bigint;
        seq_id bigint := FLOOR(random() * 16777215);
        result varchar:= '';
    BEGIN
        SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp())) INTO time_component;
        SELECT pg_backend_pid() INTO process_id;

        result := result || lpad(to_hex(time_component), 8, '0');
        result := result || lpad(to_hex(machine_id), 6, '0');
        result := result || lpad(to_hex(process_id), 4, '0');
        result := result || lpad(to_hex(seq_id), 6, '0');
        RETURN result;
    END;
$$;

ALTER FUNCTION app_core.generate_object_id() OWNER TO postgres;

.. но psql не примет ее, пока я не использую следующий формат (удаление разрыва строки после изменения и перемещение объявления языка):

CREATE FUNCTION app_core.generate_object_id() RETURNS character varying AS $$
    DECLARE
        time_component bigint;
        machine_id bigint := FLOOR(random() * 16777215);
        process_id bigint;
        seq_id bigint := FLOOR(random() * 16777215);
        result varchar:= '';
    BEGIN
        SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp())) INTO time_component;
        SELECT pg_backend_pid() INTO process_id;

        result := result || lpad(to_hex(time_component), 8, '0');
        result := result || lpad(to_hex(machine_id), 6, '0');
        result := result || lpad(to_hex(process_id), 4, '0');
        result := result || lpad(to_hex(seq_id), 6, '0');
        RETURN result;
    END;
$$ LANGUAGE plpgsql;


ALTER FUNCTION app_core.generate_object_id() OWNER TO postgres;

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

Восстановление

psql -f dbops/app_full_backup_edit.sql -S postgres -U postgres -h localhost -p 5432 -v ON_ERROR_STOP=1 postgres

Дамп

pg_dumpall -f dbops/app_full_backup.sql -S postgres -U postgres -h localhost -p 5432

Исходная база данных - V10.1, место назначения - V10.5 - с использованием инструментов CLI V10.5 (пробовалперенос в БД той же версии, но с такими же ошибками).

Есть предложения относительно того, почему это может происходить и как решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...