Я пытаюсь выполнить миграцию на новый сервер БД и незначительное повышение версии (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 (пробовалперенос в БД той же версии, но с такими же ошибками).
Есть предложения относительно того, почему это может происходить и как решить?