Как стать автором
Обновить

Комментарии 6

А разве dblink не устарел ещё лет 10 назад? Уже давно же есть postgres_fdw.

The functionality provided by this module overlaps substantially with the functionality of the older dblink module. But postgres_fdw provides more transparent and standards-compliant syntax for accessing remote tables, and can give better performance in many cases.

И устарел, и нет. Смотря какая решается задача. Как бы хорош ни был FDW, но для RPC он мало пригоден и асинхронные вызовы не умеет.

Очень жаль, что статья - исключительно о "когда всё нормально". Хотя куда как более полезно было бы хотя бы на уровне симптоматики рассмотреть и случаи. когда не всё ладно. К примеру, обрыв соединения - как детектировать? как восстанавливать? какие побочные проблемы ещё придётся решать?

Кроме того, совершенно не рассмотрен случай, когда нужно, кроме установления линка, выполнить несколько команд донастройки. Скажем, в случае MySQL - настройка требуемого Server SQL Mode, настройка кодировок и зон времени... как заставить необходимые команды выполниться по факту открытия подключения без дополнительных телодвижений на стороне клиентского кода?

Далее - ошибки. Точнее, трансляция с удалённого сервера подробной диагностики (в оптимуме - оригинал сообщения об ошибке, сгенерированного удалённым сервером). Думаю, этот вопрос тоже следовало бы рассмотреть.

Ну и вопрос трансляции типов данных. Например, как транслируется из MySQL отсутствующий в PostgreSQL тип данных SET?

По-моему, рассмотрение всех этих моментов значительно поднимет ценность статьи - сейчас она, прямо скажем, "типично-OTUSовская".

Если бы кроме этого в статье ещё было рассмотрено, когда нужен dblink, а когда FDW, то я бы ей плюс поставил. А так просто не стал минусовать

Рылся в гугле, наткнулся на эту статью.

К примеру, обрыв соединения - как детектировать?

Вот с этим совсем грустно, видимо. У меня когда функция падает на дблинке, то крашит ETL. 3 дня пытался отправить ошибку дблинка (потеря соeдинения или отсутствующий столбец в источнике, читаю с реплики) в эксепшен блок (а в нем уже записать ошибку в таблицу с логом), а ETL просто падает на месте и всё. Грусть.

Если кто знает способ - напишите плз.

пс: PG14

Вместо dblink_exec пользуйтесь dblink_send_query. Потеря соединения детектируется dblink_is_busy (валится ошибкой). Ошибки извлекаются dblink_error_message. Если не нужна асинхронность, то проще использовать dblink_get_result(connname => 'SlaveN', fail_on_error => true).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий