|
Путаются схемы
|
|||
---|---|---|---|
#18+
Добрый день! Я работаю с 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! Подскажите, пожалуйста, как выйти из такого положения? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 13:55 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев, \d test в psql что показывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 14:27 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
И еще. Сергей Бабичев В случае отказа основного сервера, схема sync меняется на sync2. Как именно меняется схема? Что возвращает select current_schemas(true) у пользователя, получающего ошибку? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 14:31 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Павел Лузанов И еще. Сергей Бабичев В случае отказа основного сервера, схема sync меняется на sync2. Как именно меняется схема? Запрос формируется динамически. Схема подставляется в строку запроса из настроек. Что возвращает select current_schemas(true) у пользователя, получающего ошибку? pg_catalog, public, topology Запросы к sync продолжают выполняться нормально. Вышеозначенную ошибку выдают запросы к схеме sync2 (и не дожны) текущей схеме (должны!) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 15:28 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
немного неправильно написал select * from test - не работает, ошибка. Должен работать select * from sync2.test - не работает, ошибка. Не должен работать select * from sync.test - работает Такое впечатление, что обратившись раз к недоступному серверу, ПГ запоминает и не дает обращаться ни к какой схеме, кроме той, которая ведет на доступный сервер, в данном случае это sync на sync_link_1 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 15:52 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев, Вот что я понял. Используются внешние таблицы (postgres_fdw). В определенный момент времени запрос: select * from test выдает ошибку: Код: plaintext 1. 2. 3.
Похоже на то, что test в этом случае не обычная таблица из схемы public, а внешняя таблица, ссылающаяся на сервер с неверным портом. Поэтому я и попросил показать результат \d test. Без этого не понятно о чем речь. В вашем примере 3 таблицы test в схемах public, sync, sync2. Возможно просто перепутались схемы в search_path и вместо таблицы в схеме public происходит обращение к таблице в схеме sync2. Поэтому нужно знать список схем в пути поиска (current_schemas). Но информация о таблице и пути поиска нужна только в том сеансе работы, в котором вы получаете ошибку. Именно поэтому, чтобы разобраться в причинах нужно зайти в psql, смоделировать "сбой" и приложить сюда результаты выполнения команд: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 16:02 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев Я создал внешние подключения 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. вот вместо этого блаблабла напишите ваш код, в т.ч. "переключающий" , подробненько, без купюр. кто на ком стоит, какой код выполняется. чем. вот это вот всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 16:09 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев, PS : возможно ваши ожидания примерно так же расходятся с действительностью, как вот тут https://www.sql.ru/forum/752136/search-path-interesno-rabotaet-v-cikle?mid=8649863&hl=set search_path#8649863 -- это часто встречается. не видя кода сказать сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 16:23 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
qwwq, \d+ Столбец | Тип | Модификаторы | Хранилище | Цель для статистики | Описание ---------+-----------------------+--------------+-----------+---------------------+---------- id | integer | | plain | | name | character varying(50) | | extended | | Дочерние таблицы: sync2.test, sync.test Кажется понял в чем дело. Я при создании внешней таблицы использовал inherits чтобы скопировать ее структуру из существующей ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 17:00 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Ребят, а как вылезти из этого? Ведь в реальных таблицах, которые надо синхронизировать по 150 полей! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 17:05 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев, наследование-то зачем? pg_dump -s если нужен цельный create table или create table (like another_table including_см_документацию) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 17:07 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Сергей Бабичев Ребят, а как вылезти из этого? Ведь в реальных таблицах, которые надо синхронизировать по 150 полей! Вместо inherits использовать like. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2019, 17:07 |
|
Путаются схемы
|
|||
---|---|---|---|
#18+
Всем большое спасибо за помошь! Проблема решена. В 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 все работает как надо ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2019, 11:16 |
|
|
start [/forum/topic.php?fid=53&fpage=35&tid=1994958]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 398ms |
0 / 0 |