H.2. MySQL Foreign Data Wrapper#
H.2. MySQL Foreign Data Wrapper #
Это обертка для внешних данных (FDW) для подключения Tantor SE к MySQL.
H.2.2. Особенности #
H.2.2.1. Общие функции и улучшения #
Следующие улучшения добавлены в последнюю версию
mysql_fdw
:
H.2.2.1.1. Записываемый FDW #
Предыдущая версия была только для чтения, последняя версия
предоставляет возможность записи. Пользователь теперь может выполнять
операторы вставки, обновления и удаления для внешних таблиц
с использованием mysql_fdw
. Она использует механизм приведения типов PG
для обеспечения обратного приведения типов между
типами данных MySQL и PG.
H.2.2.1.2. Пул соединений #
Последняя версия поставляется с пулером подключений, который использует одно и то же подключение к базе данных MySQL для всех запросов в одной сессии. Предыдущая версия открывала новое подключение к базе данных MySQL для каждого запроса. Это улучшение производительности.
H.2.2.1.3. Подготовленный оператор #
(Рефакторинг для select
запросов с использованием
подготовленного выражения)
select
запросы теперь используют подготовленные
операторы вместо простого протокола запроса.
H.2.2.2. Выталкивание #
H.2.2.2.1. Условие WHERE #
Последняя версия будет передавать условие where для внешней таблицы на внешний сервер. Условие where на внешней таблице будет выполняться на внешнем сервере, следовательно, будет меньше строк для передачи в Tantor SE. Это функция производительности.
H.2.2.2.2. Столбцы #
Предыдущая версия извлекала все столбцы из целевой внешней таблицы. Последняя версия выполняет передачу столбцов и возвращает только те столбцы, которые являются частью списка целевых элементов select. Это функция производительности.
H.2.2.2.3. JOIN #
mysql_fdw
теперь также поддерживает выполнение соединений на удалённом сервере.
Соединения между двумя внешними таблицами с одного и того же удалённого
сервера MySQL выполняются на удалённом сервере, вместо
извлечения всех строк для обеих таблиц и выполнения
соединения локально, что повышает производительность. В настоящее время,
соединения, включающие только реляционные и арифметические операторы в
условиях соединения, выполняются на удалённом сервере, чтобы избежать возможных ошибок соединения. Также поддерживаются только соединения INNER и LEFT/RIGHT OUTER,
но не FULL OUTER, SEMI и ANTI соединения. Это функция, направленная на повышение производительности.
H.2.2.2.4. AGGREGATE #
mysql_fdw
теперь также поддерживает агрегацию с передачей на удаленный сервер MySQL. Передавайте агрегаты на удаленный сервер MySQL вместо того, чтобы извлекать все строки и агрегировать их локально. Это дает значительное повышение производительности в случаях, когда агрегаты могут быть переданы. В настоящее время передача ограничена агрегатными функциями min, max, sum, avg и count, чтобы избежать передачи функций, отсутствующих на сервере MySQL. Также фильтры и порядок агрегатов не передаются.
H.2.2.2.5. ORDER BY #
mysql_fdw
теперь также поддерживает передачу
“order by”. Если возможно, передайте “order by” на удаленный
сервер, чтобы получить отсортированный набор результатов непосредственно с удаленного
сервера. Это может помочь нам в эффективном выполнении слияния
соединений. Поведение NULL противоположно на сервере MySQL. Таким образом, чтобы
получить эквивалентный результат, мы добавляем “expression IS NULL”
в начало каждого из выражений “ORDER BY”.
H.2.2.2.6. LIMIT OFFSET #
mysql_fdw
теперь также поддерживает выполнение
LIMIT и OFFSET на удаленном сервере. Это уменьшает сетевой трафик
между локальным Tantor SE и удаленными серверами MySQL. Опции ALL/NULL
не поддерживаются на сервере MySQL, и поэтому они
не передаются. Также OFFSET без LIMIT не
поддерживается на сервере MySQL, поэтому запросы с такой
конструкцией не передаются.
H.2.3. Поддерживаемые платформы #
mysql_fdw
был разработан на Linux и должен
работать на любой системе, которая в разумной степени соответствует стандарту POSIX.
Пожалуйста, обратитесь к mysql_fdw_документация.
H.2.4. Предварительные условия #
Чтобы скомпилировать MySQL foreign data wrapper, необходима C-клиентская библиотека MySQL. Эту библиотеку можно скачать с официального веб-сайта MySQL.
H.2.5. Использование #
H.2.5.1. Параметры CREATE SERVER #
mysql_fdw
принимает следующие параметры через
команду CREATE SERVER
:
host
string, необязательный, по умолчанию127.0.0.1
Адрес или имя хоста сервера MySQL.
port
integer, необязательный, по умолчанию3306
Номер порта сервера MySQL.
secure_auth
boolean, необязательный, по умолчаниюtrue
Включить или отключить безопасную аутентификацию.
init_command
string, необязательный, значение по умолчанию отсутствуетSQL оператор для выполнения при подключении к серверу MySQL.
use_remote_estimate
boolean, необязательный, по умолчаниюfalse
Управляет тем, будет ли
mysql_fdw
выполнять удаленные командыEXPLAIN
для получения оценок стоимости.reconnect
boolean, необязательный, по умолчаниюfalse
Включить или отключить автоматическое переподключение к серверу MySQL, если обнаружено, что существующее соединение было потеряно.
sql_mode
string, необязательный, по умолчаниюANSI_QUOTES
Установить sql_mode MySQL для установленного соединения.
ssl_key
string, необязательный, значение по умолчанию отсутствуетИмя пути к файлу закрытого ключа клиента.
ssl_cert
string, необязательный, значение по умолчанию отсутствуетИмя пути файла сертификата открытого ключа клиента.
ssl_ca
string, необязательный, значение по умолчанию отсутствуетИмя пути файла сертификата Удостоверяющего центра (CA). Эта опция, если используется, должна указывать на тот же сертификат, который используется сервером.
ssl_capath
string, необязательный, по умолчанию отсутствуетИмя пути к каталогу, содержащему доверенные файлы сертификатов CA SSL.
ssl_cipher
string, необязательный, значение по умолчанию отсутствуетСписок допустимых шифров для SSL-шифрования.
fetch_size
integer, необязательный, по умолчанию100
Эта опция указывает количество строк, которые
mysql_fdw
должен получать в каждой операции выборки. Она может быть указана для внешней таблицы или внешнего сервера. Опция, указанная для таблицы, переопределяет опцию, указанную для сервера.character_set
string, необязательный, по умолчаниюauto
Набор символов для использования в соединении MySQL. По умолчанию
auto
, что означает автоматическое определение на основе настроек операционной системы. До введения опцииcharacter_set
, набор символов устанавливался аналогично кодировке базы данных Tantor SE. Чтобы получить это старое поведение, установите character_set на специальное значениеPGDatabaseEncoding
.mysql_default_file
string, необязательный, по умолчанию отсутствуетУстановите путь к файлу по умолчанию MySQL, если детали подключения, такие как имя пользователя, пароль и т.д., необходимо взять из файла по умолчанию.
truncatable
boolean, необязательный, по умолчаниюtrue
Эта опция управляет тем, позволяет ли
mysql_fdw
усекать внешние таблицы с помощью команды TRUNCATE. Она может быть указана для внешней таблицы или внешнего сервера. Опция на уровне таблицы переопределяет опцию на уровне сервера.
H.2.5.2. Параметры CREATE USER MAPPING #
mysql_fdw
принимает следующие параметры через
команду CREATE USER MAPPING
:
username
string, по умолчанию отсутствуетИмя пользователя для использования при подключении к MySQL.
password
string, по умолчанию отсутствуетПароль для аутентификации на сервере MySQL.
H.2.5.3. Параметры CREATE FOREIGN TABLE #
mysql_fdw
принимает следующие параметры на уровне таблицы
через команду CREATE FOREIGN TABLE
.
dbname
string, обязательныйName of the MySQL базы данных для запроса. Это обязательный параметр.
table_name
string, необязательный, имя по умолчанию внешней таблицыName of the MySQL table.
fetch_size
integer, необязательныйТо же, что и параметр
fetch_size
для внешнего сервера.max_blob_size
integer, необязательныйМаксимальный размер блоба для чтения без усечения.
truncatable
boolean, необязательный, по умолчаниюtrue
То же, что и параметр внешнего сервера.
H.2.5.4. Параметры IMPORT FOREIGN SCHEMA #
mysql_fdw
поддерживает IMPORT FOREIGN SCHEMA
и принимает следующие пользовательские параметры:
import_default
boolean, необязательный, по умолчаниюfalse
Эта опция управляет тем, включаются ли выражения по умолчанию для столбцов в определения внешних таблиц, импортируемых с внешнего сервера.
import_not_null
boolean, необязательный, по умолчаниюtrue
Эта опция управляет тем, включаются ли ограничения столбца NOT NULL в определения внешних таблиц, импортированных с внешнего сервера.
import_enum_as_text
boolean, необязательный, по умолчаниюfalse
Эта опция может быть использована для отображения типа MySQL ENUM в тип TEXT в определениях внешних таблиц, в противном случае выдать предупреждение о создании типа.
import_generated
boolean, необязательный, по умолчаниюtrue
Эта опция управляет тем, включаются ли выражения СГЕНЕРИРОВАННЫХ столбцов в определения внешних таблиц, импортированных с внешнего сервера, или нет. ИМПОРТ полностью завершится неудачей, если импортированное сгенерированное выражение использует функцию или оператор, которые не существуют в Tantor SE.
H.2.5.5. Поддержка TRUNCATE #
mysql_fdw
реализует API обертки внешних данных
TRUNCATE
, доступное начиная с Tantor SE 14.
MySQL предоставляет команду TRUNCATE
, см.
Оператор TRUNCATE TABLE.
Применяются следующие ограничения:
TRUNCATE ... CASCADE
не поддерживаетсяTRUNCATE ... RESTART IDENTITY
не поддерживается и игнорируетсяTRUNCATE ... CONTINUE IDENTITY
не поддерживается и игнорируетсяТаблицы MySQL с внешними ключами не могут быть усечены
H.2.6. Функции #
А также стандартные функции mysql_fdw_handler()
и
mysql_fdw_validator()
,
mysql_fdw
предоставляет следующие утилиты, вызываемые пользователем:
mysql_fdw_version()
Возвращает номер версии в виде целого числа.
mysql_fdw_display_pushdown_list()
Отображает содержимое файла
mysql_fdw_pushdown.config
.
H.2.7. Сгенерированные столбцы #
Обратите внимание, что хотя mysql_fdw
будет вставлять или обновлять
значение сгенерированной колонки в MySQL, ничто не мешает
изменению значения в MySQL, и, следовательно, нет гарантии, что в
последующих операциях SELECT
колонка все еще будет
содержать ожидаемое сгенерированное значение. Это ограничение также
относится к postgres_fdw
.
Для получения более подробной информации о сгенерированных столбцах смотрите:
H.2.8. Примеры #
H.2.8.1. Установите расширение: #
Один раз для базы данных вам нужно, как Tantor SE суперпользователь.
-- load extension first time after install CREATE EXTENSION mysql_fdw;
H.2.8.2. Создайте внешний сервер с соответствующей конфигурацией: #
Один раз для внешнего источника данных вам нужно, как Tantor SE суперпользователь.
-- create server object CREATE SERVER mysql_server FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306');
H.2.8.3. Предоставьте права использования на внешнем сервере обычному пользователю в Tantor SE: #
Один раз для обычного пользователя (не суперпользователя) в Tantor SE, как суперпользователь Tantor SE. Хорошей идеей является использование суперпользователя только там, где это действительно необходимо, поэтому давайте позволим обычному пользователю использовать внешний сервер (это не требуется для работы примера, но это рекомендация по безопасности).
GRANT USAGE ON FOREIGN SERVER mysql_server TO pguser;
Где pguser
является примером пользователя для работы с
внешним сервером (и внешними таблицами).
H.2.8.4. Отображение пользователей #
Создайте соответствующее отображение пользователя:
-- create user mapping CREATE USER MAPPING FOR pguser SERVER mysql_server OPTIONS (username 'foo', password 'bar');
Где pguser
является примером пользователя для работы с
внешним сервером (и внешними таблицами).
H.2.8.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'))
H.2.8.6. Импортировать базу данных MySQL как схему в Tantor SE: #
IMPORT FOREIGN SCHEMA someschema FROM SERVER mysql_server INTO public;
H.2.9. Ограничения #
Для получения более подробной информации, пожалуйста, обратитесь к документации mysql_fdw.
H.2.10. Для разработчика #
Если вы обнаружили ошибку и у вас есть исправление, или у вас есть новая идея, создайте тикет на странице github. Прежде чем создавать pull request, пожалуйста, прочитайте руководство по вкладу.
H.2.11. Поддержка #
Этот проект будет модифицирован для поддержания совместимости с новыми Tantor SE и выпусками EDB Postgres Advanced Server.
Если вам требуется коммерческая поддержка, пожалуйста, свяжитесь с командой продаж EnterpriseDB или проверьте, может ли ваш существующий поставщик поддержки Tantor SE также поддерживать mysql_fdw
.
H.2.12. Лицензия #
Copyright (c) 2011-2024, Корпорация EnterpriseDB.
Разрешение на использование, копирование, модификацию и распространение этого программного обеспечения и его документации для любых целей, без взимания платы и без письменного соглашения, настоящим предоставляется при условии, что вышеуказанное уведомление об авторских правах и этот абзац, а также следующие два абзаца будут присутствовать во всех копиях.
См. файл LICENSE для получения полной информации.