MySQL Cross Server Select Query - PullRequest
       22

MySQL Cross Server Select Query

25 голосов
/ 01 мая 2009

Можно ли написать запрос выбора между серверами, используя MySQL Client. В основном установка выглядит следующим образом.

База данных IP сервера
--------- --------
1.2.3.4 Тест
a.b.c.d Test

Я хочу написать запрос, который выберет строки из таблицы в тестовой базе данных в 1.2.3.4 и вставит результат в таблицу в тестовую базу данных в a.b.c.d
Мои серверы расположены за много миль друг от друга, поэтому я открою SSH-туннель для их соединения.

Есть указатели?

Ответы [ 3 ]

34 голосов
/ 10 октября 2009

как насчет использования федеративных таблиц на одном из серверов? создайте федеративные таблицы на основе удаленных таблиц, которые вы будете использовать в запросе, и просто выполните запрос, как если бы ваша база данных была локальной Пример ниже от MySQL site

Процедура использования таблиц 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 
CHARSET=latin1;

В примере используется таблица MyISAM, но в таблице может использоваться любой механизм хранения.

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

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';

(До MySQL 5.0.13 используйте КОММЕНТАРИЙ, а не СОЕДИНЕНИЕ.)

8 голосов
/ 01 мая 2009

mysqldump может быть решением, как уже упоминалось, или вы можете попробовать использовать команды SELECT ... INTO OUTFILE и затем LOAD DATA INFILE ....

В MySQL есть механизм федеративного хранения, который может быть вам полезен. Вот еще немного документации по нему http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html Я должен признаться, что я не добился большого успеха, но это может сработать для вас.

Третье решение - сделать работу в вашем приложении. Прочитайте результаты запроса SELECT построчно и INSERT на другой сервер построчно. Однако вы можете столкнуться с некоторыми проблемами с типами данных и обработкой нуля.

2 голосов
/ 01 мая 2009

Поскольку клиент mysql может одновременно подключаться только к одному серверу, краткий ответ - нет. Но всегда есть способ ...

Последние версии mysqldump поддерживают параметр --where, который можно использовать для ограничения сбрасываемых данных. Это означает, что у вас есть способ запустить простой SELECT (то есть все столбцы в одной таблице) и создать действительный SQL для INSERT этого. Затем вы можете направить вывод такой команды mysqldump для исходного сервера в команду mysql на целевой сервер.

Возможно, вы захотите включить в команду mysqldump несколько опций, таких как --no-create-info и --no-add-locks. Проверяйте это до тех пор, пока вывод не будет именно тем, что вы хотите.

...