Вопрос по mysql – Объединяйте таблицы с двух разных серверов

28

У меня два разных сервераserver1 а такжеserver2, Теперь у меня естьdb1 вserver1 а такжеdb2 вserver2. I am trying to join these two table in MySQL like this.

Select a.field1,b.field2  
FROM  [server1, 3306].[db1].table1 a  
Inner Join [server2, 3312].[db2].table2 b  
ON a.field1=b.field2  

Но я получаю ошибку. Это возможно в MYSQL.

Я думаю, что вам лучше всего выбрать обе таблицы, получить их результаты в php и применить любую операцию с данными, которая вам может понадобиться. Madara Uchiha♦
Ты можешь попробоватьFEDERATED двигатель хранения,dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html vearutop
Вы можете использовать FEDERATED хранилище odiszapc
возможный дубликатMySQL Cross Server Select Query Starx

Ваш Ответ

3   ответа
1

сервер1 - db1 - & gt; реплицировать на сервер2. (теперь db1 и db2 будут находиться на одном сервере server2. Присоединение будет простым).

ПРИМЕЧАНИЕ. Если server2 достаточно способен принять нагрузку db1 с точки зрения хранилища / процесса и т. Д., То мы можем выполнить репликацию. Как сказал @brilliand, да, Federated сделает большую ручную работу и будет медленной в процессе.

0

и это не объединение, но я использую функции bash, чтобы создать ощущение, что я делаю межсерверные запросы:

Явная версия:

tb2lst(){
    echo -n "("
    tail -n +2 - | paste -sd, | tr -d "\n"
    echo ")"
}

id_list=$(mysql -h'db_a.hostname' -ume -p'ass' -e "SELECT id FROM foo;" | tb2lst)
mysql -h'db_b.hostname' -ume -p'ass' -e "SELECT * FROM bar WHERE foo_id IN $id_list"

+--------|-----+
| foo_id | val |
+--------|-----+
| 1      | 3   |
| 2      | 4   |
+--------|-----+

Я написал несколько функций-оболочек, которые я храню в своем bashrc, так что, на мой взгляд, это всего лишь одна команда:

db_b "SELECT * FROM bar WHERE foo_id IN $(db_a "SELECT id FROM foo;" | tb2lst);"

+--------|-----+
| foo_id | val |
+--------|-----+
| 1      | 3   |
| 2      | 4   |
+--------|-----+

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

28
Yes, it is possible in MySQL.

предварительно тоже. Вы должны использоватьФЕДЕРАЛЬНЫЙ ДВИГАТЕЛЬ сделать это. Идея звучит так:

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

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://[email protected]_host:9306/federated/test_table';

[Источник ответа]

Это очень медленно с большими таблицами базы данных. Я все еще ищу лучший метод, но FEDERATED таблицы не достаточно хорошо масштабируются, чтобы быть вариантом во многих случаях.
Хотя это не одно и то же, репликация может быть хорошим решением в зависимости от вашего варианта использования.
Привет, ты нашел лучшее решение для этого?
@ NomanDilawar, Привет, мне еще не пришлось искать лучший метод. Если вы найдете один, я хотел бы увидеть его, хотя.
@JohnHunt, я бы поспорил с этим, поскольку вы упомянули, что это не то же самое. Репликация не объединяет таблицы с другого сервера.

Похожие вопросы