PostgreSQL и mysql_fdw
Содержание
Введение
Для работы с таблицами на сторонних серверах в PostgreSQL существует соответствующий механизм. При выполнении запроса, в котором фигурирует стороння таблица, расширение отправляет на сторонний сервер запрос для извлечения данных, необходимых для выполнения запроса. В зависимости от расширения, в запрос для выполнения на стороннем сервере могут включаться дополнительные критерии фильтрации данных, которые удалось извлечь из исходного запроса: критерии для выражений WHERE
, GROUP BY
, ORDER BY
, LIMIT
, а при необходимости соединить данные в рамках одного запроса из нескольких сторонних таблиц на одном и том же стороннем сервере могут также добавляться выражения JOIN
для соединения данных из этих таблиц и снижения объёма выборки.
Установка расширения
Расширение имеется в официальном репозитории Debian Bullseye, установим его:
# apt-get install postgresql-13-mysql-fdw
Для включения расширения выполним в базе данных следующий запрос:
CREATE EXTENSION IF NOT EXISTS mysql_fdw;
Использование расширения
Предположим, что имеется сторонний сервер MySQL с доменным именем db.example.net
и с базой данных db
. На этом стороннем сервере заведён пользователь login
с паролем p4$$w0rd
, имеющий доступ к таблицам базы данных db
. Созадим сторонний сервер в PostgreSQL:
CREATE SERVER mysql_db FOREIGN DATA WRAPPER mysql_fdw OPTIONS (
host 'db.example.net',
port '3306'
);
Для просмотра списка сторонних серверов с помощью консольного клиента psql
можно воспользоваться командой \des
.
Удалить сторонний сервер можно с помощью такой команды:
DROP SERVER mysql_db;
Предположим, что мы устанавливаем подключение к базе данных PostgreSQL под именем user
. В таком случае создадим для сочетания пользователя user
и только что созданного стороннего сервера mysql_db
правило отображения пользователя PostgreSQL в пользователя стороннего сервера:
CREATE USER MAPPING FOR user SERVER mysql_db OPTIONS (
password 'p4$$w0rd',
username 'login'
);
Для просмотра списка отображений пользователей сторонних серверов с помощью консольного клиента psql
можно воспользоваться командой \deu
.
Удалить отображение пользователя стороннего сервера можно с помощью команды следующего вида:
DROP USER MAPPING FOR user SERVER mysql_db;
Теперь остаётся создать описание сторонней таблицы, указав имя базы данных и таблицы на созданном нами стороннем сервере mysql_db
. Например, создадим стороннюю таблицу script
, которая будет отображаться в одноимённую таблицу на стороннем сервере:
CREATE FOREIGN TABLE script (
id integer,
title character varying(100) DEFAULT ''::character varying NOT NULL
)
SERVER mysql_db
OPTIONS (
dbname 'db',
table_name 'script'
);
Для просмотра списка сторонних таблиц с помощью консольного клиента psql
можно воспользоваться командой \det
.
Несколько сторонних серверов
При необходимости работать с несколькими сторонними серверами в рамках одной базы данных, можно создать для таблиц каждого из сторонних серверов по одной схеме, а таблицы, соответствующие стороннему серверу, создавать в соответствующей схеме. Например, создадим схему db
для работы с таблицами на стороннем сервере mysql_db
из примера выше:
CREATE SCHEMA db;
В таком случае таблицу script
из примера выше создадим уже внутри этой схемы:
CREATE FOREIGN TABLE db.script (
id integer,
title character varying(100) DEFAULT ''::character varying NOT NULL
)
SERVER mysql_db
OPTIONS (
dbname 'billing',
table_name 'script'
);
Дополнительная информация
- EnterpriseDB / mysql_fdw / README.md
- Документация к Postgres Pro Standard 13.12.2 / VI. Справочное руководство / Команды SQL / CREATE SERVER
- Документация к Postgres Pro Standard 13.12.2 / VI. Справочное руководство / Команды SQL / CREATE USER MAPPING
- Документация к Postgres Pro Standard 13.12.2 / VI. Справочное руководство / Команды SQL / CREATE FOREIGN TABLE