Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Путаются схемы / 13 сообщений из 13, страница 1 из 1
05.11.2019, 13:55
    #39885254
Путаются схемы
Добрый день!
Я работаю с PostgreSQL 9.6.10 под ОС Астра Орел. Сейчас делаю синхронизацию баз данных для трех серверов - основного, резервного и запасного. Пока один компьютер, поэтому я смоделировал разные сервера подключением на одном сервере к разным БД.
Я создал внешние подключения sync_link_1 и sync_link_2 Все таблицы и внешние т внутренние имеют одинаковые имена, например test. Внешние таблицы я разместил в отдельных схемах sync и sync2. В них внешние таблицы связаны с серверами sync с sync_link_1и sync2 c sync_link_2. Синхронизация происходит так: резервный сервер выполняет запрос к основному

insert into test (...) select ... from sync.test where......
то есть берет себе в таблицу public.test записи из sync_link_1.public.test (основного сервера), которых у него нет.
В случае отказа основного сервера, схема sync меняется на sync2.
Все прекрасно работает пока я не имитировал отказ одного из серверов - sync_link_2. Так как комп один, я просто в настройках sync_link_2 указываю неправильный порт.
Тут начинаются чудеса. Любое обращение к таблице test своей базе схемы public:
select * from test
вызывает ошибку
ОШИБКА: could not connect to server "sync_link_2"
ПОДРОБНОСТИ: не удалось подключиться к серверу: В соединении отказано
Он действительно работает по адресу "192.168.100.77"
и принимает TCP-соединения (порт 5433)?

Но я не просил его обращаться к схеме sync2!
Подскажите, пожалуйста, как выйти из такого положения?
...
Рейтинг: 0 / 0
05.11.2019, 14:27
    #39885275
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев,

\d test в psql что показывает?
...
Рейтинг: 0 / 0
05.11.2019, 14:31
    #39885277
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
И еще.
Сергей Бабичев

В случае отказа основного сервера, схема sync меняется на sync2.

Как именно меняется схема?

Что возвращает select current_schemas(true) у пользователя, получающего ошибку?
...
Рейтинг: 0 / 0
05.11.2019, 15:28
    #39885313
Путаются схемы
Павел Лузанов
И еще.
Сергей Бабичев

В случае отказа основного сервера, схема sync меняется на sync2.

Как именно меняется схема?
Запрос формируется динамически. Схема подставляется в строку запроса из настроек.

Что возвращает select current_schemas(true) у пользователя, получающего ошибку?

pg_catalog, public, topology

Запросы к sync продолжают выполняться нормально. Вышеозначенную ошибку выдают запросы к схеме sync2 (и не дожны) текущей схеме (должны!)
...
Рейтинг: 0 / 0
05.11.2019, 15:52
    #39885324
Путаются схемы
немного неправильно написал

select * from test - не работает, ошибка. Должен работать
select * from sync2.test - не работает, ошибка. Не должен работать

select * from sync.test - работает


Такое впечатление, что обратившись раз к недоступному серверу, ПГ запоминает и не дает обращаться ни к какой схеме, кроме той, которая ведет на доступный сервер, в данном случае это sync на sync_link_1
...
Рейтинг: 0 / 0
05.11.2019, 16:02
    #39885327
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев,

Вот что я понял.
Используются внешние таблицы (postgres_fdw).

В определенный момент времени запрос: select * from test выдает ошибку:
Код: plaintext
1.
2.
3.
ОШИБКА: could not connect to server "sync_link_2"
ПОДРОБНОСТИ: не удалось подключиться к серверу: В соединении отказано
Он действительно работает по адресу "192.168.100.77"
и принимает TCP-соединения (порт 5433)?

Похоже на то, что test в этом случае не обычная таблица из схемы public, а внешняя таблица, ссылающаяся на сервер с неверным портом.
Поэтому я и попросил показать результат \d test. Без этого не понятно о чем речь.

В вашем примере 3 таблицы test в схемах public, sync, sync2. Возможно просто перепутались схемы в search_path и вместо таблицы в схеме public происходит обращение к таблице в схеме sync2. Поэтому нужно знать список схем в пути поиска (current_schemas).

Но информация о таблице и пути поиска нужна только в том сеансе работы, в котором вы получаете ошибку. Именно поэтому, чтобы разобраться в причинах нужно зайти в psql, смоделировать "сбой" и приложить сюда результаты выполнения команд:
Код: sql
1.
2.
3.
select * from test;
\d test
select current_schemas(true);
...
Рейтинг: 0 / 0
05.11.2019, 16:09
    #39885332
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев

Я создал внешние подключения sync_link_1 и sync_link_2 Все таблицы и внешние т внутренние имеют одинаковые имена, например test. Внешние таблицы я разместил в отдельных схемах sync и sync2. В них внешние таблицы связаны с серверами sync с sync_link_1и sync2 c sync_link_2. Синхронизация происходит так: резервный сервер выполняет запрос к основному

insert into test (...) select ... from sync.test where......
то есть берет себе в таблицу public.test записи из sync_link_1.public.test (основного сервера), которых у него нет.
В случае отказа основного сервера, схема sync меняется на sync2.

вот вместо этого блаблабла напишите ваш код, в т.ч. "переключающий" , подробненько, без купюр.
кто на ком стоит, какой код выполняется. чем. вот это вот всё.
...
Рейтинг: 0 / 0
05.11.2019, 16:23
    #39885337
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев,

PS : возможно ваши ожидания примерно так же расходятся с действительностью, как вот тут https://www.sql.ru/forum/752136/search-path-interesno-rabotaet-v-cikle?mid=8649863&hl=set search_path#8649863 -- это часто встречается. не видя кода сказать сложно.
...
Рейтинг: 0 / 0
05.11.2019, 17:00
    #39885363
Путаются схемы
qwwq,

\d+
Столбец | Тип | Модификаторы | Хранилище | Цель для статистики | Описание
---------+-----------------------+--------------+-----------+---------------------+----------
id | integer | | plain | |
name | character varying(50) | | extended | |
Дочерние таблицы: sync2.test,
sync.test

Кажется понял в чем дело.

Я при создании внешней таблицы использовал inherits чтобы скопировать ее структуру из существующей
...
Рейтинг: 0 / 0
05.11.2019, 17:05
    #39885365
Путаются схемы
Ребят, а как вылезти из этого? Ведь в реальных таблицах, которые надо синхронизировать по 150 полей!
...
Рейтинг: 0 / 0
05.11.2019, 17:07
    #39885367
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев,

наследование-то зачем?
pg_dump -s если нужен цельный create table или create table (like another_table including_см_документацию)
...
Рейтинг: 0 / 0
05.11.2019, 17:07
    #39885368
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Путаются схемы
Сергей Бабичев
Ребят, а как вылезти из этого? Ведь в реальных таблицах, которые надо синхронизировать по 150 полей!

Вместо inherits использовать like.
...
Рейтинг: 0 / 0
06.11.2019, 11:16
    #39885618
Путаются схемы
Всем большое спасибо за помошь!
Проблема решена.
В create foreign table like не предусмотрен, но есть IMPORT FOREIGN SCHEMA которая копирует описания всех таблиц сразу и делает их независимыми.
После
IMPORT FOREIGN SCHEMA public
FROM SERVER sync_link_1 INTO sync

IMPORT FOREIGN SCHEMA public
FROM SERVER sync_link2 INTO sync2
все работает как надо
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Путаются схемы / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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