[Синхранизируем PostgreSQL и Informix] PostgreSQL FDW — Что это и как его есть

Всем привет.

Сегодня я хочу кратенько познакомить вас с Foreign Database Wrappers в PostgreSQL.  Поведаю о том, откуда это пришло в PostgreSQL, зачем и что оно там делает.

Погнали!

В 2003 году в SQL был введён новый стандарт — Управление внешними данными.

Этот стандарт описывает способ взаимодействия с внешними источниками данных.

В PostgreSQL v.9.1 (2011 год) был реализован этот стандарт в виде FDW (Foreign Database Wrapper), но readonly. Возможность писать во внешние источники данных через FDW в постгресе появилась в версии 9.3, т.е. два года спустя. Однако, действительные возможности FDW закладываются в конкретной реализации, т.е. не все FDW, существующие на данный момент, поддерживают запись во внешнее хранилище.

Список доступных FDW можно посмотреть в вики постгреса (https://wiki.postgresql.org/wiki/Foreign_data_wrappers).

Окунёмся в мир FDW на примере обёртки для СУБД Informix (https://github.com/credativ/informix_fdw).

Для начала давайте выясним, какие задачи можно решить, используя FDW:

  1. Синхронизация PostgreSQL с внешней иной СУБД.
  2. Как следствие первого пункта — манипулирование данными, находящимися во внешней СУБД.

Что может вас заставить использовать FDW, а не какой-либо иной путь?

  1. При использовании FDW, PostgreSQL не хранит сами данные, что может быть удобно, если вы ограничены по ресурсам.
  2. Нет необходимости поднимать инстанс внешней СУБД у себя для реализации синхронизации БД, что удобно в случае с платными СУБД.

Как же работает FDW?

Если говорить простым языком, то

при обращении к PostgreSQL (далее, PG), PG делает аналогичный* запрос во внешнюю СУБД и возвращает вам результат этого запроса.

  • Следует помнить, что не смотря на существующие стандарты SQL, для разных СУБД запрос SQL выглядит по разному. Привести запрос к нужному виду — это задача FDW.

Если говорить сложным языком, то

  1. Во-первых, в PG таблицы создаются специального типа — FOREIGN TABLE.
  2. Во-вторых, при создании такой таблицы, необходимо указать настройки подключения к СУБД: сервер, пользователь, имя самой базы и т.д. Давайте взглянем на живой пример:

CREATE SERVER any_server_name

FOREIGN DATA WRAPPER informix_fdw # Это имя FDW

OPTIONS (informixserver ‘remote_db_server_name’);

# Создаём мапинг пользователя постгре к пользователю информикса,

# т.е. текущий pg юзер будет дуплиться в информикс под username:password

CREATE USER MAPPING FOR CURRENT_USER

SERVER any_server_name

# Имя и Пароль для доступа к удалённой БД

OPTIONS (username ‘informix’, password ‘informix’);

CREATE FOREIGN TABLE our_table_name (remote_id integer, year smallint)

SERVER any_server_name

OPTIONS ( query ‘SELECT * FROM remote_table_name’,

database ‘remote_db_name’,

db_locale ‘ru_RU.8859-5’, # remote

client_locale ‘ru_RU.8859-5’,

informixserver ‘remote_db_server_name’,

informixdir ‘/opt/informix’ # путь до СУБД

);

В чём подвох?

В том, что FDW реализуют сторонние разработчики, которые в силу различных причин, не реализуют все необходимые структуры, функции и так далее.

Чтобы было понятнее, если в FDW не реализовать обработку какого-либо типа во внешней СУБД, то вы не сможете извлечь данные этого типа. Единственный способ — использовать преобразование типов при запросе.

Вот и всё (:

Есть что сказать?