В 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
Комментариев нет:
Отправить комментарий