J.2. mysql_fdw#
J.2. mysql_fdw
J.2.2. Установка
Чтобы установить mysql_fdw, cкачайте установочный скрипт db_extension_installer.sh и сделайте его исполняемым:
wget https://public.tantorlabs.ru/db_extension_installer.sh && \ chmod +x db_extension_installer.sh
Далее вы можете установить mysql_fdw:
J.2.2.1. Локально из скачанного пакета
Скачайте пакет
mysql_fdw, подходящий для вашей операционной системы, с сайта nexus-public.Выполните установку
mysql_fdwс помощьюdb_extension_installer.shиз скачанного пакета:./db_extension_installer.sh \ --from-file=<path to mysql_fdw package>
J.2.2.2. Автоматически из репозитория пакетов
Установите значение переменной окружения
NEXUS_URL:export NEXUS_URL="nexus-public.tantorlabs.ru"
Выполните установку
mysql_fdwс помощьюdb_extension_installer.shсо следующими параметрами:./db_extension_installer.sh \ --database-type=tantor \ --database-major-version=15 \ --edition=se \ --extension=mysql_fdw
J.2.3. Особенности
J.2.3.1. Общие функции и улучшения
Следующие улучшения добавлены в последнюю версию
mysql_fdw:
J.2.3.1.1. Записываемый FDW
Предыдущая версия была только для чтения, последняя версия
предоставляет возможность записи. Пользователь теперь может выполнять
операторы вставки, обновления и удаления для внешних таблиц
с использованием mysql_fdw. Она использует механизм приведения типов PG
для обеспечения обратного приведения типов между
типами данных MySQL и PG.
J.2.3.1.2. Пул соединений
Последняя версия поставляется с пулером подключений, который использует одно и то же подключение к базе данных MySQL для всех запросов в одной сессии. Предыдущая версия открывала новое подключение к базе данных MySQL для каждого запроса. Это улучшение производительности.
J.2.3.1.3. Подготовленный оператор
(Рефакторинг для select запросов с использованием
подготовленного выражения)
select запросы теперь используют подготовленные
операторы вместо простого протокола запроса.
J.2.3.2. Выталкивание
J.2.3.2.1. Условие WHERE
Последняя версия будет передавать условие where для внешней таблицы на внешний сервер. Условие where на внешней таблице будет выполняться на внешнем сервере, следовательно, будет меньше строк для передачи в Tantor SE. Это функция производительности.
J.2.3.2.2. Столбцы
Предыдущая версия извлекала все столбцы из целевой внешней таблицы. Последняя версия выполняет передачу столбцов и возвращает только те столбцы, которые являются частью списка целевых элементов select. Это функция производительности.
J.2.3.2.3. JOIN
mysql_fdw теперь также поддерживает выполнение соединений на удалённом сервере.
Соединения между двумя внешними таблицами с одного и того же удалённого
сервера MySQL выполняются на удалённом сервере, вместо
извлечения всех строк для обеих таблиц и выполнения
соединения локально, что повышает производительность. В настоящее время,
соединения, включающие только реляционные и арифметические операторы в
условиях соединения, выполняются на удалённом сервере, чтобы избежать возможных ошибок соединения. Также поддерживаются только соединения INNER и LEFT/RIGHT OUTER,
но не FULL OUTER, SEMI и ANTI соединения. Это функция, направленная на повышение производительности.
J.2.3.2.4. AGGREGATE
mysql_fdw теперь также поддерживает агрегацию с передачей на удаленный сервер MySQL. Передавайте агрегаты на удаленный сервер MySQL вместо того, чтобы извлекать все строки и агрегировать их локально. Это дает значительное повышение производительности в случаях, когда агрегаты могут быть переданы. В настоящее время передача ограничена агрегатными функциями min, max, sum, avg и count, чтобы избежать передачи функций, отсутствующих на сервере MySQL. Также фильтры и порядок агрегатов не передаются.
J.2.3.2.5. ORDER BY
mysql_fdw теперь также поддерживает передачу
“order by”. Если возможно, передайте “order by” на удаленный
сервер, чтобы получить отсортированный набор результатов непосредственно с удаленного
сервера. Это может помочь нам в эффективном выполнении слияния
соединений. Поведение NULL противоположно на сервере MySQL. Таким образом, чтобы
получить эквивалентный результат, мы добавляем “expression IS NULL”
в начало каждого из выражений “ORDER BY”.
J.2.3.2.6. LIMIT OFFSET
mysql_fdw теперь также поддерживает выполнение
LIMIT и OFFSET на удаленном сервере. Это уменьшает сетевой трафик
между локальным Tantor SE и удаленными серверами MySQL. Опции ALL/NULL
не поддерживаются на сервере MySQL, и поэтому они
не передаются. Также OFFSET без LIMIT не
поддерживается на сервере MySQL, поэтому запросы с такой
конструкцией не передаются.
J.2.4. Поддерживаемые платформы
mysql_fdw был разработан на Linux и должен
работать на любой системе, которая в разумной степени соответствует стандарту POSIX.
Пожалуйста, обратитесь к mysql_fdw_документация.
J.2.5. Предварительные условия
Чтобы скомпилировать MySQL foreign data wrapper, необходима C-клиентская библиотека MySQL. Эту библиотеку можно скачать с официального веб-сайта MySQL.
J.2.6. Использование
J.2.6.1. Параметры CREATE SERVER
mysql_fdw принимает следующие параметры через
команду CREATE SERVER:
hoststring, необязательный, по умолчанию127.0.0.1Адрес или имя хоста сервера MySQL.
portinteger, необязательный, по умолчанию3306Номер порта сервера MySQL.
secure_authboolean, необязательный, по умолчаниюtrueВключить или отключить безопасную аутентификацию.
init_commandstring, необязательный, значение по умолчанию отсутствуетSQL оператор для выполнения при подключении к серверу MySQL.
use_remote_estimateboolean, необязательный, по умолчаниюfalseУправляет тем, будет ли
mysql_fdwвыполнять удаленные командыEXPLAINдля получения оценок стоимости.reconnectboolean, необязательный, по умолчаниюfalseВключить или отключить автоматическое переподключение к серверу MySQL, если обнаружено, что существующее соединение было потеряно.
sql_modestring, необязательный, по умолчаниюANSI_QUOTESУстановить sql_mode MySQL для установленного соединения.
ssl_keystring, необязательный, значение по умолчанию отсутствуетИмя пути к файлу закрытого ключа клиента.
ssl_certstring, необязательный, значение по умолчанию отсутствуетИмя пути файла сертификата открытого ключа клиента.
ssl_castring, необязательный, значение по умолчанию отсутствуетИмя пути файла сертификата Удостоверяющего центра (CA). Эта опция, если используется, должна указывать на тот же сертификат, который используется сервером.
ssl_capathstring, необязательный, по умолчанию отсутствуетИмя пути к каталогу, содержащему доверенные файлы сертификатов CA SSL.
ssl_cipherstring, необязательный, значение по умолчанию отсутствуетСписок допустимых шифров для SSL-шифрования.
fetch_sizeinteger, необязательный, по умолчанию100Эта опция указывает количество строк, которые
mysql_fdwдолжен получать в каждой операции выборки. Она может быть указана для внешней таблицы или внешнего сервера. Опция, указанная для таблицы, переопределяет опцию, указанную для сервера.character_setstring, необязательный, по умолчаниюautoНабор символов для использования в соединении MySQL. По умолчанию
auto, что означает автоматическое определение на основе настроек операционной системы. До введения опцииcharacter_set, набор символов устанавливался аналогично кодировке базы данных Tantor SE. Чтобы получить это старое поведение, установите character_set на специальное значениеPGDatabaseEncoding.mysql_default_filestring, необязательный, по умолчанию отсутствуетУстановите путь к файлу по умолчанию MySQL, если детали подключения, такие как имя пользователя, пароль и т.д., необходимо взять из файла по умолчанию.
truncatableboolean, необязательный, по умолчаниюtrueЭта опция управляет тем, позволяет ли
mysql_fdwусекать внешние таблицы с помощью команды TRUNCATE. Она может быть указана для внешней таблицы или внешнего сервера. Опция на уровне таблицы переопределяет опцию на уровне сервера.
J.2.6.2. Параметры CREATE USER MAPPING
mysql_fdw принимает следующие параметры через
команду CREATE USER MAPPING:
usernamestring, по умолчанию отсутствуетИмя пользователя для использования при подключении к MySQL.
passwordstring, по умолчанию отсутствуетПароль для аутентификации на сервере MySQL.
J.2.6.3. Параметры CREATE FOREIGN TABLE
mysql_fdw принимает следующие параметры на уровне таблицы
через команду CREATE FOREIGN TABLE.
dbnamestring, обязательныйName of the MySQL базы данных для запроса. Это обязательный параметр.
table_namestring, необязательный, имя по умолчанию внешней таблицыНазвание таблицы MySQL.
fetch_sizeinteger, необязательныйТо же, что и параметр
fetch_sizeдля внешнего сервера.max_blob_sizeinteger, необязательныйМаксимальный размер блоба для чтения без усечения.
truncatableboolean, необязательный, по умолчаниюtrueТо же, что и параметр внешнего сервера.
J.2.6.4. Параметры IMPORT FOREIGN SCHEMA
mysql_fdw поддерживает IMPORT FOREIGN SCHEMA
и принимает следующие пользовательские параметры:
import_defaultboolean, необязательный, по умолчаниюfalseЭта опция управляет тем, включаются ли выражения по умолчанию для столбцов в определения внешних таблиц, импортируемых с внешнего сервера.
import_not_nullboolean, необязательный, по умолчаниюtrueЭта опция управляет тем, включаются ли ограничения столбца NOT NULL в определения внешних таблиц, импортированных с внешнего сервера.
import_enum_as_textboolean, необязательный, по умолчаниюfalseЭта опция может быть использована для отображения типа MySQL ENUM в тип TEXT в определениях внешних таблиц, в противном случае выдать предупреждение о создании типа.
import_generatedboolean, необязательный, по умолчаниюtrueЭта опция управляет тем, включаются ли выражения СГЕНЕРИРОВАННЫХ столбцов в определения внешних таблиц, импортированных с внешнего сервера, или нет. ИМПОРТ полностью завершится неудачей, если импортированное сгенерированное выражение использует функцию или оператор, которые не существуют в Tantor SE.
J.2.6.5. Поддержка TRUNCATE
mysql_fdw реализует API обертки внешних данных
TRUNCATE, доступное начиная с Tantor SE 14.
MySQL предоставляет команду TRUNCATE, см.
Оператор TRUNCATE TABLE.
Применяются следующие ограничения:
TRUNCATE ... CASCADEне поддерживаетсяTRUNCATE ... RESTART IDENTITYне поддерживается и игнорируетсяTRUNCATE ... CONTINUE IDENTITYне поддерживается и игнорируетсяТаблицы MySQL с внешними ключами не могут быть усечены
J.2.7. Функции
А также стандартные функции mysql_fdw_handler() и
mysql_fdw_validator(),
mysql_fdw предоставляет следующие утилиты, вызываемые пользователем:
mysql_fdw_version()Возвращает номер версии в виде целого числа.
mysql_fdw_display_pushdown_list()Отображает содержимое файла
mysql_fdw_pushdown.config.
J.2.8. Сгенерированные столбцы
Обратите внимание, что хотя mysql_fdw будет вставлять или обновлять
значение сгенерированной колонки в MySQL, ничто не мешает
изменению значения в MySQL, и, следовательно, нет гарантии, что в
последующих операциях SELECT колонка все еще будет
содержать ожидаемое сгенерированное значение. Это ограничение также
относится к postgres_fdw.
Для получения более подробной информации о сгенерированных столбцах смотрите:
J.2.9. Примеры
J.2.9.1. Установите расширение:
Один раз для базы данных вам нужно, как Tantor SE суперпользователь.
-- load extension first time after install
CREATE EXTENSION mysql_fdw;
J.2.9.2. Создайте внешний сервер с соответствующей конфигурацией:
Один раз для внешнего источника данных вам нужно, как Tantor SE суперпользователь.
-- create server object
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host '127.0.0.1', port '3306');
J.2.9.3. Предоставьте права использования на внешнем сервере обычному пользователю в Tantor SE:
Один раз для обычного пользователя (не суперпользователя) в Tantor SE, как суперпользователь Tantor SE. Хорошей идеей является использование суперпользователя только там, где это действительно необходимо, поэтому давайте позволим обычному пользователю использовать внешний сервер (это не требуется для работы примера, но это рекомендация по безопасности).
GRANT USAGE ON FOREIGN SERVER mysql_server TO pguser;
Где pguser является примером пользователя для работы с
внешним сервером (и внешними таблицами).
J.2.9.4. Отображение пользователей
Создайте соответствующее отображение пользователя:
-- create user mapping
CREATE USER MAPPING FOR pguser
SERVER mysql_server
OPTIONS (username 'foo', password 'bar');
Где pguser является примером пользователя для работы с
внешним сервером (и внешними таблицами).
J.2.9.5. Создать внешнюю таблицу
Все команды SQL CREATE FOREIGN TABLE могут быть выполнены обычным пользователем Tantor SE, если было предоставлено правильное GRANT USAGE ON FOREIGN SERVER. Нет необходимости в суперпользователе Tantor SE по соображениям безопасности, но также работает с суперпользователем Tantor SE.
Пожалуйста, укажите опцию table_name, если имя таблицы MySQL
отличается от имени внешней таблицы.
-- create foreign table
CREATE FOREIGN TABLE warehouse (
warehouse_id int,
warehouse_name text,
warehouse_created timestamp
)
SERVER mysql_server
OPTIONS (dbname 'db', table_name 'warehouse');
Некоторые другие операции с данными внешней таблицы
-- insert new rows in table
INSERT INTO warehouse values (1, 'UPS', current_date);
INSERT INTO warehouse values (2, 'TV', current_date);
INSERT INTO warehouse values (3, 'Table', current_date);
-- select from table
SELECT * FROM warehouse ORDER BY 1;
warehouse_id | warehouse_name | warehouse_created
-------------+----------------+-------------------
1 | UPS | 10-JUL-20 00:00:00
2 | TV | 10-JUL-20 00:00:00
3 | Table | 10-JUL-20 00:00:00
-- delete row from table
DELETE FROM warehouse where warehouse_id = 3;
-- update a row of table
UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1;
-- explain a table with verbose option
EXPLAIN VERBOSE SELECT warehouse_id, warehouse_name FROM warehouse WHERE warehouse_name LIKE 'TV' limit 1;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=10.00..11.00 rows=1 width=36)
Output: warehouse_id, warehouse_name
-> Foreign Scan on public.warehouse (cost=10.00..1010.00 rows=1000 width=36)
Output: warehouse_id, warehouse_name
Local server startup cost: 10
Remote query: SELECT `warehouse_id`, `warehouse_name` FROM `db`.`warehouse` WHERE ((`warehouse_name` LIKE BINARY 'TV'))
J.2.9.6. Импортировать базу данных MySQL как схему в Tantor SE:
IMPORT FOREIGN SCHEMA someschema
FROM SERVER mysql_server
INTO public;