Выбрать главу

Чтобы исследовать исходник типа памяти FEDERATED, смотрите каталог sql исходных текстов MySQL.

Дополнительные ресурсы:

Форум, специализированный на типе FEDERATED, доступен на http://forums.mysql.com/list.php?105.

2.6.1. Описание типа памяти FEDERATED

Когда Вы создаете таблицу типа FEDERATED, сервер создает файл формата таблицы в каталоге баз данных. Имя файла начинается с имени таблицы и имеет расширение .frm. Никакие другие файлы не созданы, потому что фактические данные находятся в удаленной таблице. Это отличается от способа, которым работают типы памяти для локальных таблиц.

Для локальных таблиц базы данных файлы данных локальны. Например, если Вы создаете MyISAM-таблицу с именем users, драйвер MyISAM создает файл данных, именованный users.MYD. Драйвер для локальных таблиц читает, вставляет, удаляет и модифицирует данные в локальных файлах данных, и строки сохранены в частном формате драйвера. Чтобы читать строки, драйвер должен анализировать данные в столбцах. Чтобы записывать строки, значения столбцов должны быть преобразованы в формат строки, используемый драйвером и записаны в локальный файл данных.

А вот в типе памяти FEDERATED не имеется никаких локальных файлов данных для таблицы (например, нет файла .MYD). Вместо этого удаленная база данных сохраняет данные, которые обычно были бы в таблице. Локальный сервер соединяется с удаленным и использует клиентское API MySQL, чтобы читать, удалять, модифицировать и вставлять данные в удаленной таблице. Поиск данных инициализирован через инструкции SQL SELECT * FROM tbl_name. Чтобы читать результат, строки выбраны по одной, используя функцию C API mysql_fetch_row(), а затем преобразуя столбцы в наборе результатов SELECT к формату, который ожидает получить драйвер FEDERATED.

Поток информации таков:

SQL-обращения выданы локально.

Используется MySQL handler API (данные в формате драйвера).

Клиентский API MySQL (данные преобразованы в обращения SQL).

Удаленная база данных -> клиентский API MySQL.

Конвертация набора результатов (если надо) к формату драйвера.

2.6.2. Как использовать таблицы FEDERATED

Процедура для использования таблиц FEDERATED очень проста. Обычно Вы имеете два выполняемых сервера. В принципе возможно использовать другую таблицу, которая управляется тем же самым сервером, хотя имеются некоторые хитрости при этом.

Сначала Вы должны иметь таблицу на удаленном сервере, к которой Вы хотите обращаться, используя таблицу FEDERATED. Предположите, что удаленная таблица находится в базе данных federated и определена подобно этому:

CREATE TABLE test_table (id INT(20) NOT NULL AUTO_INCREMENT,

name VARCHAR(32) NOT NULL DEFAULT '',

other INT(20) NOT NULL DEFAULT '0', PRIMARY KEY(id),

INDEX name (name), INDEX other_key (other))

ENGINE=MyISAM DEFAULT CHARSET=latin1;

Пример использует таблицу MyISAM, но таблица могла бы использовать любой тип памяти.

Затем создайте таблицу FEDERATED на локальном сервере для доступа к удаленной таблице:

CREATE TABLE federated_table (id INT(20) NOT NULL AUTO_INCREMENT,

name VARCHAR(32) NOT NULL DEFAULT '',

otherINT(20) NOT NULL DEFAULT '0',

PRIMARY KEY(id), INDEX name (name),

INDEX other_key (other)) ENGINE=FEDERATED

DEFAULT CHARSET=latin1

CONNECTION='mysqclass="underline" //root@remote_host:9306/federated/test_table';

Обратите внимание: CONNECTION заменяет COMMENT, используемый в некоторых предыдущих версиях MySQL.

Структура этой таблицы должна быть точно такая же, как у удаленной таблицы, за исключением того, что опция ENGINE таблицы должна быть FEDERATED, а опция таблицы CONNECTION задает строку подключения, которая указывает для драйвера FEDERATED, как соединиться с удаленным сервером.

Тип памяти FEDERATED создает только файл test_table.frm в базе данных federated.

Удаленная информация хоста указывает удаленный сервер, с которым Ваш локальный соединяется, а база данных и информация таблицы указывают, которую удаленную таблицу использовать как источник данных. В этом примере удаленный сервер обозначен как remote_host (порт 9306), так что на удаленной системе должен быть сервер MySQL, слушающий порт 9306.

Общая форма строки подключения в опции CONNECTION такова:

scheme://user_name[:password]@host_name

[:port_num]/db_name/tbl_name

Только mysql обеспечивается как значение scheme в этот момент, пароль и номер порта факультативны.

Имеются некоторые примеры строк подключения:

CONNECTION='mysqclass="underline" //username:password@hostname:port/database/tablename'

CONNECTION='mysqclass="underline" //username@hostname/database/tablename'

CONNECTION='mysqclass="underline" //username:password@hostname/database/tablename'

Использование CONNECTION для определения строки подключения не оптимально и, вероятно, измениться в будущем.