|
|
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Неожиданное поведение 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 11:56 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
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. pg_dump -d test2 -s возвращает Код: sql 1. 2. 3. 4. 5. 6. 7. т.е. тип параметра содержит имя схемы. проверял на 9.3 и 9.5, результат одинаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 12:27 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Alexiust минимальный test case? В том и дело, что на тестовом сервере это проходит, а на боевом обламывается. В обоих случаях тип параметра содержит имя схемы. В конфигах разницы нет, alter role postgres - тоже нет специфики. No idea. Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 12:39 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadminAlexiust минимальный test case? В том и дело, что на тестовом сервере это проходит, а на боевом обламывается. В обоих случаях тип параметра содержит имя схемы. В конфигах разницы нет, alter role postgres - тоже нет специфики. No idea. Код: plsql 1. 2. А руками посмотреть в plain text schema only dump в каком месте объявлен public.d_identifier? До или после объявления проблемной функции? -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 13:51 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
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'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 14:51 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadmin, И всё же надо получить набор SQL-ов из dump-файла, последовательность которых ведёт к ошибке. Как посоветовал Максим — не нужно полный дамп, достаточно c ключем `-s`. Вы сравнивали списки схем, владельцев схем, права (особенно у public-а) на вашем и других серверах? Может на основном сервере было сделано REVOKE <что-то> FROM public (USAGE, к примеру)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 17:34 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
vyegorov, или у юзверей под которыми делается дамп а потом рестор разные search_path в разных серверах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 18:10 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Lonepsychovyegorov, или у юзверей под которыми делается дамп а потом рестор разные search_path в разных серверах. а вот это не должно влиять никак. т.к .в стандартном пждумпе сёчь пас прописывается чёрным по белому перед каждой сменой схемы. и даже прописывается БЕЗ использованеия дурилки "$user' кстати припоминаю -- сталкивался. немного в другой ситуации -- ставил hstore в паблика, писал свою схему с набором ф--й, с hstore в парамсах. и иногда имел что--то подобное при переносе схемы. т.к. легко преодолевается -- не зафиксировался. вообще грабельки долго и упорно готовили: -- чо, трудно полностью квалифицировать схемами всё в пг_думпе ? нетрудно. что, дорого будет ? -- не особо и дорого. ан какого--то шикуют. все эти сёч пасы для хитрых трюков , а не для базовых, я щетаю. ну или хотя бы опцию в пгдумпе надо: -- полноостью классифаить. Для параноиков, типа. В мы, параноики, восспользуемся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 20:39 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
qwwq, когдато, давно, сталкивался с подобной проблемой. тогда сделал вывод что проблема иммено в том, как постгрес озвучивает имена объектов. т.е. если объект находился в search_path пользователя, то имена схем были пропущены. изза этого следовали вполне интересные проблемы. но так, согласен, влиять недолжно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 11:36 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Судя по ошибке, постгрес ругается не на сигнатуру функции, а на блок 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 12:22 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
qwwqвообще грабельки долго и упорно готовили: -- чо, трудно полностью квалифицировать схемами всё в пг_думпе ? Полнейшая нелепость. Чтобы читать текстовый дамп схемы, приходится лезть в комменты над функцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 12:27 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Оказывается, на этом сервере такая же проблема с pg_restore 9.4! Похоже на то, что это какие-то переменные окружения unix пользователя postgres. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 12:54 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadminСудя по ошибке, постгрес ругается не на сигнатуру функции, а на блок Declare, где D_Identifier написан без public. -- помнится, есть переменная, отвечающая за валидацию тела ф--ии при загрузке. И полный думп е. активно пользуется, во избежание именно вот такой ошибки. (тело ф--ии пишет кодер в своем окружении, со своими путями, а думп ставит свои пути). // кроме того ещё и ф--ии создаются до релейшенов, в них упоминаемых -- и вот это тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:13 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
qwwq, check_function_bodies = off ? Да, первое что я проверил. Не помогает. Мало того. Оказалось, pg_restore сам ставит check_function_bodies = off в начале работы. Сейчас делаю сделаю копию боевой базы с пустыми таблицами, будет проще искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:51 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadmin, > на сервере, где pg_restore работает штатно, '"$user", public' ну вот где-то тут "$user" или еще ищите разницу в окружениях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 22:33 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadmin, ! а версии pg везде одинаковые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 22:37 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadmin, может что с правами у юзера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 22:47 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
tadmin, еще про такую штуку вспомнил Код: sql 1. вдруг пригодится) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 22:59 |
|
||
|
pg_restore & search_path
|
|||
|---|---|---|---|
|
#18+
Misha Tyurinну вот где-то тут "$user" или еще ищите разницу в окружениях pg_restore сбрасывает это сам перед созданием каждой схемы. автор! а версии pg везде одинаковые? 9.5 - одинаковые. Уже писал, что проблема на конкретном сервере. Там и pg_restore 9.4 себя так же ведет. авторможет что с правами у юзера PG юзера или posix? восстановление от пользователя postgres, ему не нужны PG права. Подозревал какой-то блуд с переменными окружения, пока ничего не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:51 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39165037&tid=1997452]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
171ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 499ms |

| 0 / 0 |
