Чтобы исследовать исходник типа памяти 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 для определения строки подключения не оптимально и, вероятно, измениться в будущем.