mysql_fdw
Это расширение QHB реализует обертку сторонних данных (FDW) для MySQL.
Обратите внимание, что эта версия mysql_fdw работает с QHB версии 1.5.1 и выше.
Специальные возможности
Общий функционал и улучшения
В последнюю версию mysql_fdw добавлены следующие улучшения:
Способность FDW к записи
В предыдущих версиях было доступно только чтение, а последняя версия предоставляет
возможность записи. Теперь пользователь может с помощью mysql_fdw выполнять
для сторонних таблиц операторы INSERT, UPDATE и DELETE. Для обратного
приведения между типами данных MySQL и PG это расширение использует механизм
приведения типов PG.
Организация пула соединений
Последняя версия поставляется вместе с менеджером пула соединения, использующим одно подключение к базе данных MySQL для всех запросов в рамках одного сеанса. Предыдущая версия открывала для каждого запроса новое подключение. Этот функционал направлен на улучшение производительности.
Подготовленные операторы
(Переработка кода, чтобы запросы SELECT использовали подготовленные операторы.)
Теперь запросы SELECT вместо простого протокола запросов используют подготовленные
операторы.
Делегирование
Делегирование предложения WHERE
Последняя версия делегирует предложение WHERE сторонней таблицы на сторонний сервер. Условие WHERE для сторонней таблицы будет выполняться на стороннем сервере, поэтому на QHB понадобится переносить меньше строк. Этот функционал направлен на улучшение производительности.
Делегирование столбцов
Предыдущая версия извлекала из целевой сторонней таблицы все столбцы. Последняя
версия делегирует столбцы и возвращает только те из них, которые фигурируют в
целевом списке SELECT. Этот функционал направлен на улучшение производительности.
Делегирование JOIN
Теперь mysql_fdw поддерживает также делегирование соединений. Соединения между двумя сторонними таблицами с одного удаленного сервера MySQL делегируются на удаленный сервер, вместо того чтобы извлекать все строки из обеих таблиц и выполнять соединение локально, тем самым повышая производительность. В настоящее время во избежание потенциальных ошибок делегируются только те соединения, в предложениях которых фигурируют реляционные и арифметические операторы. Кроме того, поддерживаются только внутреннее (INNER) и правое/левое внешнее (LEFT/RIGHT OUTER) соединения, но не полное внешнее соединение (FULL OUTER), полусоединение (SEMI) и антисоединение (ANTI). Этот функционал направлен на улучшение производительности.
Делегирование AGGREGATE
Теперь mysql_fdw поддерживает также делегирование агрегирования. Агрегаты делегируются на удаленный сервер MySQL, вместо того чтобы извлекать все строки и агрегировать их локально. Это очень хорошо повышает производительность в случаях, когда агрегаты можно делегировать. В настоящее время делегирование ограничено агрегатными функциями min, max, sum, avg и count во избежание делегирования функций, отсутствующих на сервере MySQL. Кроме того, не делегируются агрегатные фильтры и упорядочивания.
Делегирование ORDER BY
Теперь mysql_fdw поддерживает также делегирование ORDER BY. По возможности следует делегировать предложение ORDER BY на удаленный сервер, чтобы получать упорядоченный результирующий набор непосредственно из стороннего сервера. Это может помочь в получении эффективного соединения слиянием. На сервере MySQL поведение значений NULL противоположно. Поэтому для получения равнозначного результата нужно добавлять предложение выражение IS NULL в начало каждого выражения ORDER BY.
Делегирование LIMIT OFFSET
Теперь mysql_fdw поддерживает также делегирование LIMIT OFFSET. По возможности следует выполнять операции LIMIT и OFFSET на сторонний сервер. Это снижает сетевой трафик между локальным сервером QHB и удаленным сервером MySQL. На сервере MySQL не поддерживаются параметры ALL/NULL, поэтому они не делегируются. Также на сервере MySQL не поддерживается OFFSET без LIMIT, поэтому запросы с этой структурой не делегируются.
Установка
Обертка сторонних данных MySQL для QHB поставляется в виде пакета qhb-1.5.2-mysql-fdw.
Подключите репозиторий пакетов QHB и установите пакет расширения для выбранной платформы со страницы загрузки.
Примечание
Расширение mysql_fdw было разработано на Linux и должно запускаться на всех достаточно POSIX-совместимых системах. См. документацию по mysql_fdw.
Примечание
Для работы расширения требуется установка клиентских библиотек MariaDB или MySQL (MySQL's C client library is needed. This library can be downloaded from the official MySQL website), например, для CentOS 7 и 8:yum install mariadb-devel.
Применение
Следующие параметры можно установить для объекта внешнего сервера MySQL посредством команды CREATE SERVER:
- host (string): Необязательный параметр. Адрес или имя хоста сервера MySQL. Значение по умолчанию — 127.0.0.1.
- port (integer): Необязательный параметр. Номер порта сервера MySQL. Значение по умолчанию — 3306.
- secure_auth (boolean): Необязательный параметр. Включить или отключить безопасную аутентификацию. Значение по умолчанию — true.
- init_command (string): Необязательный параметр. Оператор SQL для выполнения при подключении к серверу MySQL.
- use_remote_estimate (boolean): Необязательный параметр. Определяет,
выдает ли mysql_fdw удаленные команды
EXPLAINдля получения оценки стоимости. Значение по умолчанию — false. - reconnect (boolean): Необязательный параметр. Включить или отключить автоматическое переподключение к серверу MySQL, если обнаружится, что существующее соединение было потеряно. Значение по умолчанию — false.
- sql_mode (string): Необязательный параметр. Установить режим SQL в MySQL для установленного соединения. Значение по умолчанию — ANSI_QUOTES.
- ssl_key (string): Необязательный параметр. Путь к файлу закрытого ключа клиента.
- ssl_cert (string): Необязательный параметр. Путь к файлу сертификата открытого ключа клиента.
- ssl_ca (string): Необязательный параметр. Путь к файлу сертификата центра сертификации (ЦС). Этот параметр, если он используется, должен указывать тот же сертификат, который используется сервером.
- ssl_capath (string): Необязательный параметр. Путь к каталогу, содержащему файлы доверенных сертификатов ЦС SSL.
- ssl_cipher (string): Необязательный параметр. Список допустимых шифров для SSL-шифрования.
- fetch_size (integer): Необязательный параметр. Этот параметр указывает количество строк, которые mysql_fdw должно получить при каждой операции выборки. Его можно указать для внешней таблицы или внешнего сервера. Параметр, указанный в таблице, переопределяет параметр, указанный для сервера. Значение по умолчанию — 100.
- character_set (string): Необязательный параметр. Набор символов для подключения к MySQL. Значение по умолчанию auto означает автоматическое определение на основе настроек операционной системы.
- mysql_default_file (string): Необязательный параметр. Установить путь к файлу MySQL по умолчанию, если информация о подключении (например, имя пользователя, пароль и т. д.) должны браться из файла по умолчанию.
- truncatable (boolean): Необязательный параметр. Этот параметр определяет,
позволяет ли mysql_fdw опустошать сторонние таблицы с помощью команды
TRUNCATE. Его можно задать для сторонней таблицы или стороннего сервера, при этом значение уровня таблицы переопределяет значение уровня сервера. Значение по умолчанию — true.
Следующие параметры можно установить при создании сопоставления пользователей посредством команды CREATE USER MAPPING:
- username (string): Имя пользователя для использования при подключении к MySQL. Значения по умолчанию нет.
- password (string): Пароль для аутентификации на сервере MySQL. Значения по умолчанию нет.
Следующие параметры можно установить для объекта сторонней таблицы MySQL посредством команды CREATE FOREIGN TABLE:
- dbname (string): Обязательный параметр. Имя базы данных MySQL для запроса.
- table_name (string): Необязательный параметр. Имя таблицы MySQL, по умолчанию такое же, как у внешней таблицы.
- fetch_size (integer): Необязательный параметр. То же, что и параметр fetch_size для стороннего сервера.
- max_blob_size (integer): Необязательный параметр. Максимальный размер большого двоичного объекта для чтения без усечения.
- truncatable (boolean): Необязательный параметр. То же, что и такой же параметр для стороннего сервера. Значение по умолчанию — true.
Следующие параметры уровня таблицы можно установить посредством команды IMPORT FOREIGN SCHEMA:
- import_default (boolean): Необязательный параметр. Этот параметр определяет, включаются ли выражения столбца DEFAULT в определения сторонних таблиц, импортированных со стороннего сервера. Значение по умолчанию — false.
- import_not_null (boolean): Необязательный параметр. Этот параметр определяет, включаются ли ограничения столбца NOT NULL в определения сторонних таблиц, импортированных со стороннего сервера. Значение по умолчанию — true.
- import_enum_as_text (boolean): Необязательный параметр. Этот параметр можно использовать для сопоставления типа MySQL enum с типом text в определениях сторонних таблиц, в противном случае выдается предупреждение о создаваемом типе. Значение по умолчанию — false.
- import_generated (boolean): Необязательный параметр. Этот параметр определяет, будут ли выражения столбцов GENERATED включены в определения сторонних таблиц, импортированных со стороннего сервера, или нет. Значение по умолчанию — true. Импорт полностью завершится ошибкой, если импортированное генерируемое выражение использует функцию или оператор, которых нет в QHB.
Поддержка команды TRUNCATE
mysql_fdw реализует API TRUNCATE обертки сторонних данных, доступный,
начиная с QHB версии 1.5.2. MySQL предоставляет команду TRUNCATE.
Имеются следующие ограничения:
TRUNCATE ... CASCADEне поддерживаетсяTRUNCATE ... RESTART IDENTITYне поддерживается и игнорируетсяTRUNCATE ... CONTINUE IDENTITYне поддерживается и игнорируется- Таблицы MySQL со ссылками на внешние ключи опустошить нельзя
Функции
Наравне со стандартными функциями mysql_fdw_handler() и mysql_fdw_validator() mysql_fdw предоставляет следующие вызываемые пользователем служебные функции:
-
mysql_fdw_version(): Возвращает номер версии в виде целочисленного значения.
-
mysql_fdw_display_pushdown_list(): Отображает содержимое файла mysql_fdw_pushdown.config.
Генерируемые столбцы
Обратите внимание, что хотя mysql_fdw будет добавлять или обновлять
значение генерируемого столбца в MySQL, ничего не мешает изменять это значение
внутри MySQL, и поэтому нет гарантии, что при последующих операциях SELECT
такой столбец по-прежнему будет содержать ожидаемое генерируемое значение. Это
ограничение также применимо и к postgres_fdw.
Подробную информацию о генерируемых столбцах см. в разделе Генерируемые столбцы и на справочной странице команды CREATE FOREIGN TABLE.
Примеры
-- Первая загрузка расширения после установки
CREATE EXTENSION mysql_fdw;
-- создание объекта сервера
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host '127.0.0.1', port '3306');
-- предоставление прав на использование стороннего сервера обычному пользователю QHB
GRANT USAGE ON FOREIGN SERVER mysql_server TO qhbuser;
-- создание сопоставления пользователя
CREATE USER MAPPING FOR qhb
SERVER mysql_server
OPTIONS (username 'foo', password 'bar');
-- создание сторонней таблицы
CREATE FOREIGN TABLE warehouse
(
warehouse_id int,
warehouse_name text,
warehouse_created timestamp
)
SERVER mysql_server
OPTIONS (dbname 'db', table_name 'warehouse');
-- добавление новых строк в таблицу
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 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 FROM warehouse where warehouse_id = 3;
-- изменение строки в таблице
UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1;
-- показать план выполнения запроса для таблицы с параметром verbose
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'))
-- импортировать базу данных MySQL в качестве схемы в QHB
IMPORT FOREIGN SCHEMA someschema
FROM SERVER mysql_server
INTO public;
Лицензия
Авторское право (c) 2011-2025, EnterpriseDB Corporation.
Разрешено использование, копирование, изменение и распространение данного программного обеспечения и его документация для любых целей без оплаты и без письменного соглашения при условии включения вышеуказанной отметки об авторских правах, этого параграфа и следующих двух абзацев во все копии.
НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ENTERPRISEDB CORPORATION НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ПЕРЕД ЛЮБОЙ СТОРОНОЙ ЗА ПРЯМОЙ, КОСВЕННЫЙ, СПЕЦИАЛЬНЫЙ, СЛУЧАЙНЫЙ ИЛИ СПРОВОЦИРОВАННЫЙ УЩЕРБ, ВКЛЮЧАЯ ПОТЕРЮ ПРИБЫЛИ, ПОЛУЧЕННОЙ ОТ ИСПОЛЬЗОВАНИЯ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ И ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ ENTERPRISEDB CORPORATION БЫЛА УВЕДОМЛЕНА О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
ENTERPRISEDB CORPORATION ПРЯМО ОТКАЗЫВАЕТСЯ ОТ ВЫПОЛНЕНИЯ ЛЮБЫХ ДРУГИХ ГАРАНТИЙНЫХ ОБЯЗАТЕЛЬСТВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ И СООТВЕТСТВИЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, ПРЕДОСТАВЛЯЕМОЕ ПО НАСТОЯЩЕМУ СОГЛАШЕНИЮ, ПРЕДОСТАВЛЯЕТСЯ ПО ПРИНЦИПУ «КАК ЕСТЬ», И ENTERPRISEDB CORPORATION НЕ ОБЯЗАНА ОБЕСПЕЧИВАТЬ ЕГО ОБСЛУЖИВАНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, УЛУЧШЕНИЯ ИЛИ МОДИФИКАЦИИ.