barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

суббота, 16 апреля 2011 г.

Связь серверов БД в MySQL

Столкнулся с проблемой поиска в MySQL аналога db-link в Oracle / linked server в MS SQL Server, т.е. возможностью в одном запросе / процедуре использовать как локальную БД, так и удаленную.
В MySQL эта задача решена следующим образом (в версиях, начиная с 5.0):
1) Во-первых, в опциях mysql (my.ini) необходимо убрать "skip-federated" и добавить "federated" (или просто запускать mysqld с соотв. ключом).
2) На локальном сервере создается таблица, по структуре аналогичная удаленной, но в качестве движка используется FEDERATED (т.е. делаем на удаленной базе SHOW CREATE TABLE `xxx`, после чего заменяем STORAGE ENGINE на FEDERATED). Также к SQL-запросу создания таблицы нужно добавить параметр CONNECTION="mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name". Получается запрос вроде:
CREATE TABLE federated_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=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
3) Всё, запускаем скрипт, после чего все манипуляции с данной таблицей (кроме DDL) ведут к манипуляцием с удаленной таблицей, хотя по всех запросах она будет как-будто локальная.

Если таблиц, подключающих к одной и той же удаленной БД, много, может быть удобнее создать связанный сервер командой вида:
CREATE SERVER s
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test');
Тогда в параметре CONNECTION можно будет указать только имя сервера (в данном приере - 's'). Сам этот вариант не пробовал (не возникало необходимости), не совсем пока понимаю как в данном случае задать имя удаленной таблицы.
Пока поддерживаются только MySQL удаленные сервера. Транзакции также не поддерживаются на должно уровне.
Подробнее почитать можно в документации:
http://dev.mysql.com/doc/refman/5.6/en/federated-storage-engine.html
http://dev.mysql.com/doc/refman/5.6/en/create-server.html

Комментариев нет:

Отправить комментарий