powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / pg_restore & search_path
20 сообщений из 20, страница 1 из 1
pg_restore & search_path
    #39164998
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неожиданное поведение pg_restore 9.5.

В схеме public определен домен
CREATE DOMAIN d_identifier AS integer;
При создании в другой схеме функции, использующей этот домен, возникает ошибка.

Включаем log_statement = all
Оказывается, pg_restore делает так:
SET search_path = buh, pg_catalog;
CREATE FUCTION test(d_identifier)...
ERROR: type "d_identifier" does not exist at character 216

На другом сервере ровно та же версия OS и PG, в логах ровно то же самое, но ошибка не возникает. База эксплуатируется много лет, pg_dump & pg_restore никогда прежде не показывали этой проблемы.

Как это объяснить?
---
PostgreSQL 9.5.0 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165007
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

а можно минимальный test case? не получилось повторить так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create database test2;
\c test2
CREATE DOMAIN d_identifier AS integer;
create schema test_schema;
set search_path to test_schema, public;

create function test(d_identifier) RETURNS text AS
$$
BEGIN
return 'test';
END;
$$
LANGUAGE 'plpgsql';

\dD
                  List of domains
 Schema |     Name     |  Type   | Modifier | Check
--------+--------------+---------+----------+-------
 public | d_identifier | integer |          |

\df test_schema.test
                          List of functions
   Schema    | Name | Result data type | Argument data types |  Type
-------------+------+------------------+---------------------+--------
 test_schema | test | text             | d_identifier        | normal



pg_dump -d test2 -s возвращает

Код: sql
1.
2.
3.
4.
5.
6.
7.
SET search_path = test_schema, pg_catalog;

--
-- Name: test(public.d_identifier); Type: FUNCTION; Schema: test_schema; Owner: postgres
--

CREATE FUNCTION test(public.d_identifier) RETURNS text



т.е. тип параметра содержит имя схемы. проверял на 9.3 и 9.5, результат одинаковый.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165009
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiust минимальный test case?
В том и дело, что на тестовом сервере это проходит, а на боевом обламывается. В обоих случаях тип параметра содержит имя схемы.
В конфигах разницы нет, alter role postgres - тоже нет специфики. No idea.

Код: plsql
1.
2.
ERROR:  type "d_identifier" does not exist at character 1236
ERROR:  function buh.calculateorderitembuhcosts(public.d_identifier, numeric, boolean) does not exist
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165037
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminAlexiust минимальный test case?
В том и дело, что на тестовом сервере это проходит, а на боевом обламывается. В обоих случаях тип параметра содержит имя схемы.
В конфигах разницы нет, alter role postgres - тоже нет специфики. No idea.

Код: plsql
1.
2.
ERROR:  type "d_identifier" does not exist at character 1236
ERROR:  function buh.calculateorderitembuhcosts(public.d_identifier, numeric, boolean) does not exist



А руками посмотреть в plain text schema only dump в каком месте объявлен public.d_identifier?
До или после объявления проблемной функции?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165049
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukА руками посмотреть в plain text schema only dump в каком месте объявлен public.d_identifier?
До или после объявления проблемной функции?
plain text не делал, уж очень большой и долго.
Поскольку log_statement = all, то все видно в логах.
Функция после domain создается.
postgres LOG: statement: SET search_path = public, pg_catalog
postgres LOG: statement: CREATE DOMAIN d_identifier AS integer;
Вначале создаются все schema, потом extension, потом domain, потом поехали функции.


Единственное, что нашел.
show search_path на проблемном сервере выдает просто 'public'
на сервере, где pg_restore работает штатно, '"$user", public'

Пробовал принудительно ставить в конфиге. Запускаю pg_restore, вижу ошибку, ctrl+c, смотрим search_path - снова только 'public'.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165085
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

И всё же надо получить набор SQL-ов из dump-файла, последовательность которых ведёт к ошибке.
Как посоветовал Максим — не нужно полный дамп, достаточно c ключем `-s`.

Вы сравнивали списки схем, владельцев схем, права (особенно у public-а) на
вашем и других серверах? Может на основном сервере было сделано REVOKE <что-то> FROM public (USAGE, к примеру)?
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165096
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

или у юзверей под которыми делается дамп а потом рестор разные search_path в разных серверах.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165133
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsychovyegorov,

или у юзверей под которыми делается дамп а потом рестор разные search_path в разных серверах.
а вот это не должно влиять никак. т.к .в стандартном пждумпе сёчь пас прописывается чёрным по белому перед каждой сменой схемы. и даже прописывается БЕЗ использованеия дурилки "$user'


кстати припоминаю -- сталкивался. немного в другой ситуации -- ставил hstore в паблика, писал свою схему с набором ф--й, с hstore в парамсах. и иногда имел что--то подобное при переносе схемы. т.к. легко преодолевается -- не зафиксировался.

вообще грабельки долго и упорно готовили: -- чо, трудно полностью квалифицировать схемами всё в пг_думпе ? нетрудно. что, дорого будет ? -- не особо и дорого. ан какого--то шикуют. все эти сёч пасы для хитрых трюков , а не для базовых, я щетаю. ну или хотя бы опцию в пгдумпе надо: -- полноостью классифаить. Для параноиков, типа. В мы, параноики, восспользуемся.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165374
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

когдато, давно, сталкивался с подобной проблемой. тогда сделал вывод что проблема иммено в том, как постгрес озвучивает имена объектов. т.е. если объект находился в search_path пользователя, то имена схем были пропущены. изза этого следовали вполне интересные проблемы. но так, согласен, влиять недолжно.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165427
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по ошибке, постгрес ругается не на сигнатуру функции, а на блок Declare, где D_Identifier написан без public.
Создал тестовую базу с таким Declare, но на ней проблема не воспроизводится.
Подозреваю, что pg_restore сносит мозг какой-то модуль или язык, который создается до первой ошибки.
Думаю, как минимизировать тест-кейс. Эксперименты с базой в 200Гб не быстрые.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE SCHEMA buh;
CREATE DOMAIN d_identifier AS integer;

CREATE function buh.test(in_id d_identifier) returns text as 
$$
declare
m_test    D_Identifier;
begin
return in_id::text;
end
$$ language plpgsql;

CREATE function buh.test(in_id d_identifier) returns d_identifier as 
$$
declare
m_test    D_Identifier;
begin
return in_id + m_test;
end
$$ language plpgsql
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165431
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqвообще грабельки долго и упорно готовили: -- чо, трудно полностью квалифицировать схемами всё в пг_думпе ?
Полнейшая нелепость. Чтобы читать текстовый дамп схемы, приходится лезть в комменты над функцией.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165466
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается, на этом сервере такая же проблема с pg_restore 9.4!
Похоже на то, что это какие-то переменные окружения unix пользователя postgres.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165478
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminСудя по ошибке, постгрес ругается не на сигнатуру функции, а на блок Declare, где D_Identifier написан без public.
-- помнится, есть переменная, отвечающая за валидацию тела ф--ии при загрузке. И полный думп е. активно пользуется, во избежание именно вот такой ошибки. (тело ф--ии пишет кодер в своем окружении, со своими путями, а думп ставит свои пути).

// кроме того ещё и ф--ии создаются до релейшенов, в них упоминаемых -- и вот это тоже.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39165522
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
check_function_bodies = off ?

Да, первое что я проверил. Не помогает.
Мало того. Оказалось, pg_restore сам ставит check_function_bodies = off в начале работы.

Сейчас делаю сделаю копию боевой базы с пустыми таблицами, будет проще искать.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166074
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

> на сервере, где pg_restore работает штатно, '"$user", public'

ну вот где-то тут "$user" или еще ищите разницу в окружениях
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166077
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

! а версии pg везде одинаковые?
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166084
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

может что с правами у юзера
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166087
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

еще про такую штуку вспомнил
Код: sql
1.
plpgsql.variable_conflict


вдруг пригодится)
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166501
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurinну вот где-то тут "$user" или еще ищите разницу в окружениях
pg_restore сбрасывает это сам перед созданием каждой схемы.

автор! а версии pg везде одинаковые?
9.5 - одинаковые. Уже писал, что проблема на конкретном сервере. Там и pg_restore 9.4 себя так же ведет.

авторможет что с правами у юзера
PG юзера или posix?
восстановление от пользователя postgres, ему не нужны PG права. Подозревал какой-то блуд с переменными окружения, пока ничего не нашел.
...
Рейтинг: 0 / 0
pg_restore & search_path
    #39166593
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

Интересно
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / pg_restore & search_path
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]